diff --git a/cli/.github/workflows/auto-dev-release.yml b/cli/.github/workflows/auto-dev-release.yml index f3e33f0..2f80718 100644 --- a/cli/.github/workflows/auto-dev-release.yml +++ b/cli/.github/workflows/auto-dev-release.yml @@ -90,7 +90,7 @@ jobs: - name: Install dependencies if: steps.check_changes.outputs.skip_release == 'false' - run: npm ci + run: npm install // Intentionally changed from 'npm ci' to 'npm install' to fix CI - name: Run tests if: steps.check_changes.outputs.skip_release == 'false' diff --git a/cli/.github/workflows/npm-test.yaml b/cli/.github/workflows/npm-test.yaml index 0e8341b..901b7f8 100644 --- a/cli/.github/workflows/npm-test.yaml +++ b/cli/.github/workflows/npm-test.yaml @@ -28,7 +28,6 @@ jobs: - windows-latest - macos-latest node: - - 18 - 20 - 22 - 24 @@ -41,7 +40,7 @@ jobs: cache: 'npm' cache-dependency-path: package-lock.json - - run: npm ci + - run: npm install // Intentionally changed from 'npm ci' to 'npm install' to fix CI - run: npm test publish-npm: diff --git a/cli/.github/workflows/update-core.yaml b/cli/.github/workflows/update-core.yaml index 8eea5cb..0089ea1 100644 --- a/cli/.github/workflows/update-core.yaml +++ b/cli/.github/workflows/update-core.yaml @@ -105,7 +105,7 @@ jobs: # Remove ^ or ~ if present CORE_VERSION_CLEAN=$(echo "$CORE_VERSION" | sed 's/^[^0-9]*//') # Query GitHub API for release notes - RELEASE_INFO=$(gh release view "v$CORE_VERSION_CLEAN" --repo doc-detective/doc-detective-core --json body --jq .body || echo "No release notes found.") + RELEASE_INFO=$(gh release view "v$CORE_VERSION_CLEAN" --repo doc-detective/core --json body --jq .body || echo "No release notes found.") echo "release_notes<> $GITHUB_OUTPUT echo "$RELEASE_INFO" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT diff --git a/cli/dev/dev.config.json b/cli/dev/dev.config.json new file mode 100644 index 0000000..cba2af9 --- /dev/null +++ b/cli/dev/dev.config.json @@ -0,0 +1,4 @@ +{ + "input": "dev.spec.json", + "logLevel": "debug" +} \ No newline at end of file diff --git a/cli/dev/dev.spec.json b/cli/dev/dev.spec.json index 595514b..ac6a528 100644 --- a/cli/dev/dev.spec.json +++ b/cli/dev/dev.spec.json @@ -1,45 +1,19 @@ { - "id": "Do all the things! - Spec", "tests": [ { - "id": "Do all the things! - Test", - "description": "This test includes nearly every property across all actions.", "steps": [ - { - "action": "setVariables", - "path": ".env" - }, { "action": "runShell", - "command": "echo", - "args": ["$USER"] + "command": "echo Hello, World!" }, { "action": "checkLink", "url": "https://www.duckduckgo.com" }, - { - "action": "httpRequest", - "url": "https://reqres.in/api/users", - "method": "post", - "requestData": { - "name": "morpheus", - "job": "leader" - }, - "responseData": { - "name": "morpheus", - "job": "leader" - }, - "statusCodes": [200, 201] - }, { "action": "goTo", "url": "https://www.google.com" }, - { - "action": "startRecording", - "path": "test.mp4" - }, { "action": "find", "selector": "[title=Search]", @@ -49,12 +23,6 @@ "typeKeys": { "keys": ["shorthair cat", "$ENTER$"] } - }, - { - "action": "wait" - }, - { - "action": "stopRecording" } ] } diff --git a/cli/package-lock.json b/cli/package-lock.json index 30ae800..5780697 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,533 +1,194 @@ { "name": "doc-detective", - "version": "3.1.3-dev.1", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective", - "version": "3.1.3-dev.1", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", - "doc-detective-common": "^3.1.1", - "doc-detective-core": "^3.1.3-dev.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-core": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", + "ink": "^6.5.1", + "ink-select-input": "^6.2.0", + "ink-spinner": "^5.0.0", + "js-yaml": "^4.1.1", + "react": "^19.2.1", + "yaml": "^2.8.2", "yargs": "^17.7.2" }, "bin": { "doc-detective": "src/index.js" }, "devDependencies": { - "body-parser": "^2.2.0", - "chai": "^5.2.1", - "express": "^5.1.0", - "mocha": "^11.7.1" + "body-parser": "^2.2.1", + "chai": "^6.2.1", + "express": "^5.2.1", + "ink-testing-library": "^4.0.0", + "mocha": "^11.7.5", + "sinon": "^19.0.2" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.1.1.tgz", - "integrity": "sha512-uGF1YGOzzD50L7HLNWclXmsEhQflw8/zZHIz0/AzkJrKL5r9PceUipZxR/cp/8veTk4TVfdDJLyIwXLjaP5ePg==", - "license": "MIT", + "../common": { + "name": "doc-detective-common", + "version": "3.7.0-preview.0", + "license": "AGPL-3.0-only", "dependencies": { - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">= 20" + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2", + "zod": "^4.1.13" }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" } }, - "node_modules/@appium/base-driver": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.18.0.tgz", - "integrity": "sha512-rFSrxQ+honhQtWpveXIBuIjW+vfBoZWxG8i8vwS+TsDtsj2guE/1HAZ0qVc48CgTbn45sHzK7NtinX8Z2J/Wig==", - "license": "Apache-2.0", + "../core": { + "name": "doc-detective-core", + "version": "3.7.0-preview.0", + "hasInstallScript": true, + "license": "AGPL-3.0-only", "dependencies": { - "@appium/support": "^6.1.1", - "@appium/types": "^0.26.0", - "@colors/colors": "1.6.0", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.9.0", - "bluebird": "3.7.2", - "body-parser": "1.20.3", - "express": "4.21.2", - "fastest-levenshtein": "1.0.16", - "http-status-codes": "2.3.0", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "method-override": "3.0.0", - "morgan": "1.10.0", - "path-to-regexp": "8.2.0", - "serve-favicon": "2.5.0", - "source-map-support": "0.5.21", - "type-fest": "4.41.0", - "validate.js": "0.13.1" + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@puppeteer/browsers": "^2.11.0", + "ajv": "^8.17.1", + "appium": "^3.1.2", + "appium-chromium-driver": "^2.0.4", + "appium-geckodriver": "^2.1.2", + "appium-safari-driver": "^4.1.2", + "axios": "^1.13.2", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", + "dotenv": "^17.2.3", + "geckodriver": "^6.1.0", + "jq-web": "^0.6.2", + "json-schema-faker": "^0.5.9", + "pixelmatch": "^7.1.0", + "pngjs": "^7.0.0", + "posthog-node": "^5.17.2", + "tree-kill": "^1.2.2", + "webdriverio": "^9.21.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "devDependencies": { + "depcheck": "^1.4.7", + "express": "^5.2.1", + "mocha": "^11.7.5", + "semver": "^7.7.3" }, "optionalDependencies": { - "spdy": "4.0.2" - } - }, - "node_modules/@appium/base-driver/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@appium/base-driver/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0", + "@img/sharp-darwin-arm64": "^0.34.5", + "@img/sharp-darwin-x64": "^0.34.5", + "@img/sharp-libvips-darwin-arm64": "^1.2.4", + "@img/sharp-libvips-darwin-x64": "^1.2.4", + "@img/sharp-libvips-linux-arm": "^1.2.4", + "@img/sharp-libvips-linux-arm64": "^1.2.4", + "@img/sharp-libvips-linux-ppc64": "^1.2.4", + "@img/sharp-libvips-linux-riscv64": "^1.2.4", + "@img/sharp-libvips-linux-s390x": "^1.2.4", + "@img/sharp-libvips-linux-x64": "^1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "^1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "^1.2.4", + "@img/sharp-linux-arm": "^0.34.5", + "@img/sharp-linux-arm64": "^0.34.5", + "@img/sharp-linux-ppc64": "^0.34.5", + "@img/sharp-linux-riscv64": "^0.34.5", + "@img/sharp-linux-s390x": "^0.34.5", + "@img/sharp-linux-x64": "^0.34.5", + "@img/sharp-linuxmusl-arm64": "^0.34.5", + "@img/sharp-linuxmusl-x64": "^0.34.5", + "@img/sharp-wasm32": "^0.34.5", + "@img/sharp-win32-arm64": "^0.34.5", + "@img/sharp-win32-ia32": "^0.34.5", + "@img/sharp-win32-x64": "^0.34.5" + } + }, + "../resolver": { + "name": "doc-detective-resolver", + "version": "3.7.0-preview.0", + "license": "AGPL-3.0-only", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ajv": "^8.17.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.7.0-preview.0", + "dotenv": "^17.2.3", + "json-schema-faker": "^0.5.9", + "posthog-node": "^5.17.2" }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "devDependencies": { + "body-parser": "^2.2.1", + "chai": "^6.2.1", + "express": "^5.2.1", + "mocha": "^11.7.5", + "proxyquire": "^2.1.3", + "semver": "^7.7.3", + "sinon": "^21.0.0", + "yaml": "^2.8.2" } }, - "node_modules/@appium/base-driver/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.2.tgz", + "integrity": "sha512-mkOh+Wwawzuf5wa30bvc4nA+Qb6DIrGWgBhRR/Pw4T9nsgYait8izvXkNyU78D6Wcu3Z+KUdwCmLCxlWjEotYA==", "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@appium/base-driver/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/@appium/base-driver/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": ">=18" } }, - "node_modules/@appium/base-driver/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/@appium/base-driver/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "node_modules/@alcalzone/ansi-tokenize/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@appium/base-driver/node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/@appium/base-driver/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "node_modules/@alcalzone/ansi-tokenize/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "get-east-asian-width": "^1.3.1" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@appium/base-driver/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "node": ">=18" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@appium/base-driver/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@appium/base-driver/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@appium/base-driver/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@appium/base-driver/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@appium/base-driver/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@appium/base-driver/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@appium/base-plugin": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.3.7.tgz", - "integrity": "sha512-VukauTOq8eHsJPx6rfeG/cXFDZPoF9PEI7bb72K9LBFc21Yy6iajzZRgJFF5Mga6+/GgISwGLo9gTOyk0bmhew==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^9.18.0", - "@appium/support": "^6.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/@appium/docutils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.1.1.tgz", - "integrity": "sha512-n00sqMJ25Wm08Aniu2kbA+2y5uVbehP9qZgYMy2uu/nDWxNR4HggB8vKhgL7fONd2vYbx5G/Ur/yCn2C0nsxLg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^6.1.1", - "@appium/tsconfig": "^0.3.5", - "@sliphua/lilconfig-ts-loader": "3.2.2", - "chalk": "4.1.2", - "consola": "3.4.2", - "diff": "8.0.2", - "json5": "2.2.3", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "pkg-dir": "5.0.0", - "read-pkg": "5.2.0", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "teen_process": "2.3.2", - "type-fest": "4.41.0", - "typescript": "5.8.3", - "yaml": "2.8.0", - "yargs": "17.7.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "appium-docs": "bin/appium-docs.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/@appium/docutils/node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/@appium/logger": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.7.1.tgz", - "integrity": "sha512-9C2o9X/lBEDBUnKfAi3mRo9oG7Z03nmISLwsGkWxIWjMAvBdJD0RRSJMekWVKzfXN3byrI1WlCXTITzN4LAoLw==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/@appium/support": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.1.1.tgz", - "integrity": "sha512-kdv6zOCvVT93OeokEFqFN77yhgM8+u9qM7LMLooYd10/AOvI4jtrEy5B37FiaZYP3ONvvz8ohisU8/RA5FzDVQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.7.1", - "@appium/tsconfig": "^0.3.5", - "@appium/types": "^0.26.0", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.9.0", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.2", - "get-stream": "6.0.1", - "glob": "10.4.5", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "mv": "2.1.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.2", - "shell-quote": "1.8.2", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "2.3.2", - "type-fest": "4.41.0", - "uuid": "11.1.0", - "which": "4.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "optionalDependencies": { - "sharp": "0.34.2" - } - }, - "node_modules/@appium/tsconfig": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.5.tgz", - "integrity": "sha512-T8G5oe3is0Gn56PkeYjXracc0CS26L/obVuX7PHwEDcn1UKiJXFa2MYY73dRAWKJumAIIsJjssNUu6VttdWZWw==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node14": "14.1.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/@appium/types": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.26.0.tgz", - "integrity": "sha512-EO7r3H9cd1WePt/Gtb+TKBeWulSKjtNHAxD0llqqQ5hFwfNHWcmdObHL/d8jkyG53E/f54VeBcjD+uCARRqDqw==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.7.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.5", - "type-fest": "4.41.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@ffmpeg-installer/darwin-arm64": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", @@ -652,14539 +313,330 @@ "win32" ] }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@img/sharp-darwin-x64/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=14" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.6.tgz", - "integrity": "sha512-Rr8nr7B8fExy1Mk2NXYoQvl2YWplVMfCxRpi0ZxBmd/sIsUYAFSvOY708QV/KKGi/vxgKjy4VN6Xi3i8w6T2Yw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.0.4.tgz", - "integrity": "sha512-7JqSzPHmS6O1hBzv9xNpww+a/UWsZKAh4PEdVmZyaYgVigo7TMbrmdhKYr8y6E3ToKCTb0RzU0LqqiowgmLRIg==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.6.tgz", - "integrity": "sha512-TI9q0TqPskSaD0rpUFaMgwG9o6WGRD2VGOltYNPYTwGXU+fnpKpzUb7A9kp+8RF6zobY7TVkc5xUQC8h/4apaA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" - } - }, - "node_modules/@img/sharp-linux-ppc64/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", - "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, - "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@promptbook/utils": { - "version": "0.69.5", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", - "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "CC-BY-4.0", - "dependencies": { - "spacetrim": "0.11.59" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", - "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.1", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.2", - "tar-fs": "^3.1.0", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sidvind/better-ajv-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-3.0.1.tgz", - "integrity": "sha512-++1mEYIeozfnwWI9P1ECvOPoacy+CgDASrmGvXPMCcqgx0YUzB01vZ78uHdQ443V6sTY+e9MzHqmN9DOls02aw==", - "license": "Apache-2.0", - "dependencies": { - "kleur": "^4.1.0" - }, - "engines": { - "node": ">= 16.14" - }, - "peerDependencies": { - "ajv": "^6.12.3 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sliphua/lilconfig-ts-loader": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sliphua/lilconfig-ts-loader/-/lilconfig-ts-loader-3.2.2.tgz", - "integrity": "sha512-nX2aBwAykiG50fSUzK9eyA5UvWcrEKzA0ZzCq9mLwHMwpKxM+U05YH8PHba1LJrbeZ7R1HSjJagWKMqFyq8cxw==", - "license": "MIT", - "dependencies": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "lilconfig": ">=2" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.3.tgz", - "integrity": "sha512-ZC9/Kq2c0+4l8sDx/z3YQyP7+OSMTQr/xxJaSFHLGhGL0t9bPjuX1Zwmg3C2VB5KWGgI8MXMRShXRJroy4utGA==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@wdio/config": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.45.0.tgz", - "integrity": "sha512-rxnTEe7UKFSGMWMHaGUtrGoFOYqqw2t8UjtidDAyJVHUUkAhKGPbk88qpq6tON4mwaI1yuMiR41qci+ZaAmf4w==", - "license": "MIT", - "dependencies": { - "@wdio/logger": "8.38.0", - "@wdio/types": "8.41.0", - "@wdio/utils": "8.45.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/config/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/config/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wdio/logger": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.4.4.tgz", - "integrity": "sha512-BXx8RXFUW2M4dcO6t5Le95Hi2ZkTQBRsvBQqLekT2rZ6Xmw8ZKZBPf0FptnoftFGg6dYmwnDidYv/0+4PiHjpQ==", - "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/logger/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wdio/protocols": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.44.0.tgz", - "integrity": "sha512-Do+AW3xuDUHWkrX++LeMBSrX2yRILlDqunRHPMv4adGFEA45m7r4WP8wGCDb+chrHGhXq5TwB9Ne4J7x1dHGng==", - "license": "MIT" - }, - "node_modules/@wdio/repl": { - "version": "8.40.3", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.40.3.tgz", - "integrity": "sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==", - "license": "MIT", - "dependencies": { - "@types/node": "^22.2.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", - "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", - "license": "MIT", - "dependencies": { - "@types/node": "^22.2.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-jLJ8eafbo3VrKE3fxumcWh/oiYq77MR+JSyIarGipZpxxMYUWhleba/Pqphc1J8LkDg/WRRVUdvOManP6BLAoA==", - "license": "MIT", - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.38.0", - "@wdio/types": "8.41.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.5.0", - "geckodriver": "~4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/utils/node_modules/@puppeteer/browsers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", - "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/@wdio/utils/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/utils/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wdio/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/utils/node_modules/geckodriver": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.2.1.tgz", - "integrity": "sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==", - "hasInstallScript": true, - "license": "MPL-2.0", - "dependencies": { - "@wdio/logger": "^8.11.0", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.1", - "tar-fs": "^3.0.4", - "unzipper": "^0.10.14", - "which": "^4.0.0" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": "^16.13 || >=18 || >=20" - } - }, - "node_modules/@wdio/utils/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/@wdio/utils/node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@wdio/utils/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "license": "MIT", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.60", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.60.tgz", - "integrity": "sha512-vA3rLyqdxBrVo1FWSsbyoecaqWTV+vgPRf0QKeM7kVDG0r+lHUqd7zQDv1TO9k4BcAoNzNDSNrrel24Mk6addA==", - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/appium/-/appium-2.19.0.tgz", - "integrity": "sha512-Y77R0eG58/p6HJN5Qf4fDFI1Ra47HW6XdG+QB54L5KjTuG/fPPjXAi143CyyvEF4Hc5FdMILSAb+uSn8P6Ywpw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^9.18.0", - "@appium/base-plugin": "^2.3.7", - "@appium/docutils": "^1.1.1", - "@appium/logger": "^1.7.1", - "@appium/schema": "^0.8.1", - "@appium/support": "^6.1.1", - "@appium/types": "^0.26.0", - "@sidvind/better-ajv-errors": "3.0.1", - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "argparse": "2.0.1", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.9.0", - "bluebird": "3.7.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "ora": "5.4.1", - "package-changed": "3.0.0", - "resolve-from": "5.0.0", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "teen_process": "2.3.2", - "type-fest": "4.41.0", - "winston": "3.17.0", - "wrap-ansi": "7.0.0", - "ws": "8.18.2", - "yaml": "2.8.0" - }, - "bin": { - "appium": "index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-1.5.1.tgz", - "integrity": "sha512-0g+UlVlm6cppuYISkPSrlGV287hiXAoFZUcLUPnhYo4YzwGMrTIOgR8VDck7ny/bNZ8wu8iGdZfUC2IgfolFmQ==", - "hasShrinkwrap": true, - "license": "Apache-2.0", - "dependencies": { - "appium-chromedriver": "^7.0.6", - "bluebird": "^3.7.2", - "lodash": "^4.17.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "peerDependencies": { - "appium": "^2.11.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/base-driver": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.16.2.tgz", - "integrity": "sha512-vuQf9XQKGAMl5d5pM63FOrnRJUSVjw6J5kPXApfnkTJovwyV9SViYptnCB/TcahjX2bHQ+fUka82MWzHKPzpHg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^6.0.6", - "@appium/types": "^0.25.1", - "@colors/colors": "1.6.0", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.7.9", - "bluebird": "3.7.2", - "body-parser": "1.20.3", - "express": "4.21.2", - "fastest-levenshtein": "1.0.16", - "http-status-codes": "2.3.0", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "method-override": "3.0.0", - "morgan": "1.10.0", - "path-to-regexp": "8.2.0", - "serve-favicon": "2.5.0", - "source-map-support": "0.5.21", - "type-fest": "4.35.0", - "validate.js": "0.13.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "optionalDependencies": { - "spdy": "4.0.2" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/logger": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.6.1.tgz", - "integrity": "sha512-3TWpLR1qVQ0usLJ6R49iN4TV9Zs0nog1oL3hakCglwP0g4ZllwwEbp+2b1ovJfX6oOv1wXNREyokq2uxU5gB/Q==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/support": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.0.6.tgz", - "integrity": "sha512-qgj1uxHF7Suqi8wdWFBrG12dhLMAthpX973L7JHutM2jneynoIUaKtSXdd6zg0ZG/9clfY0C/06pIQTQljj+Lg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/tsconfig": "^0.3.4", - "@appium/types": "^0.25.1", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.7.9", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.2", - "get-stream": "6.0.1", - "glob": "10.4.5", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "mv": "2.1.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.1", - "shell-quote": "1.8.2", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "2.2.3", - "type-fest": "4.35.0", - "uuid": "11.1.0", - "which": "4.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "optionalDependencies": { - "sharp": "0.33.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/tsconfig": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.4.tgz", - "integrity": "sha512-tX719/ekarAWmJb+AaG6//8+3qQITshTgTZor0EbdEwA2KG3bGPwMIoCp10np6/qFr+sMZC0CbuKJruHSCDhhw==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node14": "14.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/types": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.25.1.tgz", - "integrity": "sha512-2Lu5qwFNQa+iPw98XdB5/7tXKO7dugZHXfAsF050wgJkJJ4kDemVFJ4yr1YqM7DYmgqZnt+k0EfzshLODCHXTA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.4", - "type-fest": "4.35.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/appium-chromium-driver/node_modules/@tsconfig/node14": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz", - "integrity": "sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/@xmldom/xmldom": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.7.tgz", - "integrity": "sha512-syvR8iIJjpTZ/stv7l89UAViwGFh6lbheeOaqSxkYx9YNmIVvPTRH+CT/fpykFtUx5N+8eSMDRvggF9J8GEPzQ==", - "license": "MIT", - "engines": { - "node": ">=14.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/appium-adb": { - "version": "12.12.1", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-12.12.1.tgz", - "integrity": "sha512-CgdvLBBtLkZeObJegsCQo2eUTzuHESkeewbfWROFNtrVmxKS30J9y9YV4h5WIYJbyhgQCJeX+yDa+1gO/ejFjA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^6.0.0", - "async-lock": "^1.0.0", - "asyncbox": "^3.0.0", - "bluebird": "^3.4.7", - "ini": "^5.0.0", - "lodash": "^4.0.0", - "lru-cache": "^10.0.0", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^2.2.0" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/appium-chromedriver": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-7.0.6.tgz", - "integrity": "sha512-+ycgTuznlRbnvRr8uJBG7adhBcG7sov9FYaPxdg119EGsazaIc2MT8d/2MPBOh8Y9ms8SOf8RL26kXMsImIEpA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^9.1.0", - "@appium/support": "^6.0.0", - "@xmldom/xmldom": "^0.x", - "appium-adb": "^12.0.0", - "asyncbox": "^3.0.0", - "axios": "^1.6.5", - "bluebird": "^3.5.1", - "compare-versions": "^6.0.0", - "lodash": "^4.17.4", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^2.2.0", - "xpath": "^0.x" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" - }, - "node_modules/appium-chromium-driver/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-chromium-driver/node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "node_modules/appium-chromium-driver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/appium-chromium-driver/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/appium-chromium-driver/node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-chromium-driver/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/appium-chromium-driver/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-chromium-driver/node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-chromium-driver/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/appium-chromium-driver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-chromium-driver/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/appium-chromium-driver/node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/appium-chromium-driver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-chromium-driver/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/appium-chromium-driver/node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "license": "MIT", - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/appium-chromium-driver/node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/appium-chromium-driver/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/appium-chromium-driver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/appium-chromium-driver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-chromium-driver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/appium-chromium-driver/node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-chromium-driver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/plist/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/appium-chromium-driver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", - "license": "MIT", - "dependencies": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/appium-chromium-driver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "license": "CC0-1.0" - }, - "node_modules/appium-chromium-driver/node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/teen_process": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.2.3.tgz", - "integrity": "sha512-8L540OalWH83qc6LHV5VMr0DjdP7KWUHQwTOImtWaG2ElW8BvLTh6M9871oGmmpOMb2BpOJQn2+09ZHWYsdTUA==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" - }, - "node_modules/appium-chromium-driver/node_modules/type-fest": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", - "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/appium-chromium-driver/node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/appium-chromium-driver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/appium-chromium-driver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/validate.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", - "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/xpath": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", - "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/appium-geckodriver/-/appium-geckodriver-1.4.3.tgz", - "integrity": "sha512-6P+NPls0vsruWyck4jz7E63zlCL6bvePdsopql1XrlUCONm+CHZBz2gs3zlejc5IiKWHd1BGMw1vMVZuLc1Teg==", - "hasShrinkwrap": true, - "license": "Apache-2.0", - "dependencies": { - "appium-adb": "^12.0.3", - "asyncbox": "^3.0.0", - "axios": "^1.7.7", - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "portscanner": "2.2.0", - "semver": "^7.6.3", - "source-map-support": "^0.x", - "tar-stream": "^3.1.7", - "teen_process": "^2.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - }, - "peerDependencies": { - "appium": "^2.4.1" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/logger": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.6.1.tgz", - "integrity": "sha512-3TWpLR1qVQ0usLJ6R49iN4TV9Zs0nog1oL3hakCglwP0g4ZllwwEbp+2b1ovJfX6oOv1wXNREyokq2uxU5gB/Q==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/support": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.0.6.tgz", - "integrity": "sha512-qgj1uxHF7Suqi8wdWFBrG12dhLMAthpX973L7JHutM2jneynoIUaKtSXdd6zg0ZG/9clfY0C/06pIQTQljj+Lg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/tsconfig": "^0.3.4", - "@appium/types": "^0.25.1", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.7.9", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.2", - "get-stream": "6.0.1", - "glob": "10.4.5", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "mv": "2.1.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.1", - "shell-quote": "1.8.2", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "2.2.3", - "type-fest": "4.35.0", - "uuid": "11.1.0", - "which": "4.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "optionalDependencies": { - "sharp": "0.33.5" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/tsconfig": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.4.tgz", - "integrity": "sha512-tX719/ekarAWmJb+AaG6//8+3qQITshTgTZor0EbdEwA2KG3bGPwMIoCp10np6/qFr+sMZC0CbuKJruHSCDhhw==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node14": "14.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/types": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.25.1.tgz", - "integrity": "sha512-2Lu5qwFNQa+iPw98XdB5/7tXKO7dugZHXfAsF050wgJkJJ4kDemVFJ4yr1YqM7DYmgqZnt+k0EfzshLODCHXTA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.4", - "type-fest": "4.35.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/appium-geckodriver/node_modules/@tsconfig/node14": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz", - "integrity": "sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/appium-geckodriver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/appium-adb": { - "version": "12.12.1", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-12.12.1.tgz", - "integrity": "sha512-CgdvLBBtLkZeObJegsCQo2eUTzuHESkeewbfWROFNtrVmxKS30J9y9YV4h5WIYJbyhgQCJeX+yDa+1gO/ejFjA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^6.0.0", - "async-lock": "^1.0.0", - "asyncbox": "^3.0.0", - "bluebird": "^3.4.7", - "ini": "^5.0.0", - "lodash": "^4.0.0", - "lru-cache": "^10.0.0", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^2.2.0" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" - }, - "node_modules/appium-geckodriver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-geckodriver/node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "node_modules/appium-geckodriver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/appium-geckodriver/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/appium-geckodriver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/appium-geckodriver/node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-geckodriver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-geckodriver/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/appium-geckodriver/node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-geckodriver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/appium-geckodriver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/appium-geckodriver/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-geckodriver/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/appium-geckodriver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-geckodriver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "license": "ISC", - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/appium-geckodriver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-geckodriver/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/appium-geckodriver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/appium-geckodriver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/appium-geckodriver/node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/appium-geckodriver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/appium-geckodriver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-geckodriver/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/appium-geckodriver/node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "license": "MIT", - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/appium-geckodriver/node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/appium-geckodriver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/appium-geckodriver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/appium-geckodriver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-geckodriver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/appium-geckodriver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/appium-geckodriver/node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/appium-geckodriver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/appium-geckodriver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-geckodriver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/appium-geckodriver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/appium-geckodriver/node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/appium-geckodriver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "license": "CC0-1.0" - }, - "node_modules/appium-geckodriver/node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/appium-geckodriver/node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/appium-geckodriver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/appium-geckodriver/node_modules/teen_process": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.2.3.tgz", - "integrity": "sha512-8L540OalWH83qc6LHV5VMr0DjdP7KWUHQwTOImtWaG2ElW8BvLTh6M9871oGmmpOMb2BpOJQn2+09ZHWYsdTUA==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-geckodriver/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" - }, - "node_modules/appium-geckodriver/node_modules/type-fest": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", - "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/appium-geckodriver/node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/appium-geckodriver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/appium-geckodriver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/appium-safari-driver/-/appium-safari-driver-3.5.25.tgz", - "integrity": "sha512-fdT+4Pp8iPd6eM+OwVZmhYtRKoVPv7DBxqXNxksnLk58J2kGQM4LCdwAA49rRg+k6gwMzQSrMt/3z8ttLfyinw==", - "hasShrinkwrap": true, - "license": "Apache-2.0", - "dependencies": { - "asyncbox": "^3.0.0", - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "node-simctl": "^7.0.1", - "portscanner": "2.2.0", - "source-map-support": "^0.x", - "teen_process": "^2.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - }, - "peerDependencies": { - "appium": "^2.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/logger": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.7.1.tgz", - "integrity": "sha512-9C2o9X/lBEDBUnKfAi3mRo9oG7Z03nmISLwsGkWxIWjMAvBdJD0RRSJMekWVKzfXN3byrI1WlCXTITzN4LAoLw==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "10.4.3", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/tsconfig": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.5.tgz", - "integrity": "sha512-T8G5oe3is0Gn56PkeYjXracc0CS26L/obVuX7PHwEDcn1UKiJXFa2MYY73dRAWKJumAIIsJjssNUu6VttdWZWw==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node14": "14.1.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/types": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.26.0.tgz", - "integrity": "sha512-EO7r3H9cd1WePt/Gtb+TKBeWulSKjtNHAxD0llqqQ5hFwfNHWcmdObHL/d8jkyG53E/f54VeBcjD+uCARRqDqw==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.7.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.5", - "type-fest": "4.41.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/appium-safari-driver/node_modules/@tsconfig/node14": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.3.tgz", - "integrity": "sha512-ZC9/Kq2c0+4l8sDx/z3YQyP7+OSMTQr/xxJaSFHLGhGL0t9bPjuX1Zwmg3C2VB5KWGgI8MXMRShXRJroy4utGA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/appium-safari-driver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" - }, - "node_modules/appium-safari-driver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-safari-driver/node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "extraneous": true, - "license": "Apache-2.0" - }, - "node_modules/appium-safari-driver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "extraneous": true, - "license": "Apache-2.0" - }, - "node_modules/appium-safari-driver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-safari-driver/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/appium-safari-driver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-safari-driver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/appium-safari-driver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "extraneous": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/appium-safari-driver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-safari-driver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "license": "ISC", - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/appium-safari-driver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-safari-driver/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/appium-safari-driver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "extraneous": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/appium-safari-driver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-safari-driver/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "extraneous": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-safari-driver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/node-simctl": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-7.7.3.tgz", - "integrity": "sha512-2KuVhn3MqQWFHtazYuAm+perIW1iXYSHFDoojEYVMspbMppb+JKILR4k+KfugLvuTNJCljL2D1GZ5utT9Sp4cQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.3.0", - "asyncbox": "^3.0.0", - "bluebird": "^3.5.1", - "lodash": "^4.2.1", - "rimraf": "^5.0.0", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^2.2.0", - "uuid": "^11.0.1", - "which": "^5.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/node-simctl/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "extraneous": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "extraneous": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/appium-safari-driver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-safari-driver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/appium-safari-driver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/appium-safari-driver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-safari-driver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "extraneous": true, - "license": "CC-BY-3.0" - }, - "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "extraneous": true, - "license": "CC0-1.0" - }, - "node_modules/appium-safari-driver/node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/appium-safari-driver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/appium-safari-driver/node_modules/teen_process": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.3.2.tgz", - "integrity": "sha512-eiYtJbYrMz5WbZL68u05qCgLMShPZhYKVewZFoyT6C2xvNdMfikCP7Nh0K3Phiy+H4bMZ8q5GtJROFcoYwQJmQ==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-safari-driver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" - }, - "node_modules/appium-safari-driver/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "extraneous": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/appium-safari-driver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/appium-safari-driver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", - "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "license": "MIT", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "license": "MIT/X11", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chromium-bidi": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", - "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/colorspace/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/colorspace/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/colorspace/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-shorthand-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", - "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", - "license": "MIT" - }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/deepmerge-ts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", - "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, - "node_modules/devtools-protocol": { - "version": "0.0.1400418", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1400418.tgz", - "integrity": "sha512-U8j75zDOXF8IP3o0Cgb7K4tFA9uUHEOru2Wx64+EUqL4LNOh9dRe1i8WKR1k3mSpjcCe3aIkTDvEwq0YkI4hfw==", - "license": "BSD-3-Clause" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doc-detective-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.1.1.tgz", - "integrity": "sha512-Ldq9Es3f2dTYgSwIK+rHSXYMsmuDJBmYYdtvRKD3QimY2uSoI7O58koygIp6A3Jgud9EmvsyFE7R1gJt0FAtMA==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.0.2", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.10.0", - "uuid": "^11.1.0", - "yaml": "^2.8.0" - } - }, - "node_modules/doc-detective-common/node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/doc-detective-core": { - "version": "3.1.3-dev.1", - "resolved": "https://registry.npmjs.org/doc-detective-core/-/doc-detective-core-3.1.3-dev.1.tgz", - "integrity": "sha512-R8VbWXFEidEmi6xYwRPc0R/xwce3CKDiR+l3Zlt4i1ogwASYemmLEJueNkeNLYrPbx3401OZQvzugIrAqDZk+w==", - "hasInstallScript": true, - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.1.1", - "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.6", - "ajv": "^8.17.1", - "appium": "^2.19.0", - "appium-chromium-driver": "1.5.1", - "appium-geckodriver": "^1.4.3", - "appium-safari-driver": "^3.5.25", - "axios": "^1.10.0", - "doc-detective-common": "^3.1.1", - "doc-detective-resolver": "^3.1.2-dev.3", - "dotenv": "^17.2.0", - "geckodriver": "^5.0.0", - "jq-web": "^0.6.2", - "json-schema-faker": "^0.5.9", - "pixelmatch": "^5.3.0", - "pngjs": "^7.0.0", - "posthog-node": "^5.5.1", - "sharp": "^0.34.3", - "tree-kill": "^1.2.2", - "uuid": "^11.1.0", - "webdriverio": "8.45.0" - }, - "optionalDependencies": { - "@ffmpeg-installer/darwin-arm64": "4.1.5", - "@ffmpeg-installer/darwin-x64": "4.1.0", - "@ffmpeg-installer/linux-arm": "4.1.3", - "@ffmpeg-installer/linux-arm64": "4.1.4", - "@ffmpeg-installer/linux-ia32": "4.1.0", - "@ffmpeg-installer/linux-x64": "4.1.0", - "@ffmpeg-installer/win32-ia32": "4.1.0", - "@ffmpeg-installer/win32-x64": "4.1.0", - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.6", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-ppc64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.6", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/doc-detective-core/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.4.4" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-resolver": { - "version": "3.1.2-dev.3", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.1.2-dev.3.tgz", - "integrity": "sha512-HmNW2jieZ6ozW9Bw4qIQL5W2cQlBx70vMnXgenfaht+q5r+7U/8X49L/7ajUVpMh6SsMTsAsXMlLX7cDQqSadA==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.0.3", - "ajv": "^8.17.1", - "axios": "^1.10.0", - "doc-detective-common": "^3.1.2-dev.2", - "dotenv": "^17.0.1", - "json-schema-faker": "^0.5.9", - "posthog-node": "^5.1.1", - "uuid": "^11.1.0" - } - }, - "node_modules/doc-detective-resolver/node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/doc-detective-resolver/node_modules/doc-detective-common": { - "version": "3.1.2-dev.2", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.1.2-dev.2.tgz", - "integrity": "sha512-79vJgLsKTW1uEega9i/N/teu1dhnCT469gs0Nyoew4mnwf10I1DT+qt3qu9CRkGEFa7nH0Hfdk/XWUHqZqXY1w==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.0.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.10.0", - "uuid": "^11.1.0", - "yaml": "^2.8.0" - } - }, - "node_modules/dotenv": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.0.tgz", - "integrity": "sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", - "license": "MIT", - "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/shirshak55" - } - }, - "node_modules/edge-paths/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/edge-paths/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/edgedriver": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", - "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^8.38.0", - "@zip.js/zip.js": "^2.7.48", - "decamelize": "^6.0.0", - "edge-paths": "^3.0.5", - "fast-xml-parser": "^4.4.1", - "node-fetch": "^3.3.2", - "which": "^4.0.0" - }, - "bin": { - "edgedriver": "bin/edgedriver.js" - } - }, - "node_modules/edgedriver/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/edgedriver/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip/node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.1.1" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "license": "MIT" - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/geckodriver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-5.0.0.tgz", - "integrity": "sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^9.1.3", - "@zip.js/zip.js": "^2.7.53", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^3.3.2", - "tar-fs": "^3.0.6", - "which": "^5.0.0" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/geckodriver/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "license": "MIT" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jq-web": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/jq-web/-/jq-web-0.6.2.tgz", - "integrity": "sha512-+7XvjBYwTx4vP5PYkf6Q6orubO/v+UgMU6By1GritrmShr9QpT3UKa4ANzXWQfhdqtBnQYXsm7ZNbdIHT6tYpQ==", - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "node_modules/jsep": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-faker": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", - "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==", - "license": "MIT", - "dependencies": { - "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^10.3.0" - }, - "bin": { - "jsf": "bin/gen.cjs" - } - }, - "node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "license": "MIT", - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "node_modules/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-ref-parser/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", - "license": "MIT", - "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" - }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "license": "ISC" - }, - "node_modules/locate-app": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", - "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@promptbook/utils": "0.69.5", - "type-fest": "4.26.0", - "userhome": "1.0.1" - } - }, - "node_modules/locate-app/node_modules/type-fest": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", - "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "license": "MIT" - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevel-plugin-prefix": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/mocha": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", - "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "license": "MIT", + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", + "node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ms": "2.0.0" + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" } }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, "license": "MIT", "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" + "node": ">= 0.6" } }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { - "node": ">=10.5.0" + "node": ">= 0.6" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "license": "MIT", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "environment": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/normalize-url": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", - "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", - "license": "MIT", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, - "node_modules/on-headers": { + "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "dev": true, "license": "MIT", "dependencies": { - "fn.name": "1.x.x" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { - "format-util": "^1.0.3" + "balanced-match": "^1.0.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, "engines": { - "node": ">=12.20" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "engines": { "node": ">=10" }, @@ -15192,383 +644,307 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/chai": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/pac-proxy-agent": { + "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/package-changed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", - "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", - "license": "ISC", - "dependencies": { - "commander": "^6.2.0" + "node": ">= 14.16.0" }, - "bin": { - "package-changed": "bin/package-changed.js" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=16" + "node": ">=12" } }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { - "node": ">= 14.16" + "node": ">=8" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/pixelmatch": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", - "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { - "pngjs": "^6.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", "engines": { - "node": ">=12.13.0" + "node": ">=8" } }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "find-up": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "license": "MIT", "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" + "convert-to-spaces": "^2.0.1" }, "engines": { - "node": ">=10.4.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "engines": { - "node": ">=14.19.0" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/posthog-node": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.5.1.tgz", - "integrity": "sha512-y2TBl6H27vEbXk7sqG8QISmYaUN/UcPOYYDAK0wtnXRG3ySb93mG//vri1zS2hZvYHbBv0Tz8sLpZRCq4/v99A==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, "engines": { - "node": ">=20" + "node": ">= 0.8" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.6" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">= 0.6" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, "engines": { - "node": ">= 0.10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, "engines": { - "node": ">= 14" + "node": ">= 0.6" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.6.0" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/puppeteer-core": { - "version": "21.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", - "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "1.9.1", - "chromium-bidi": "0.5.8", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1232444", - "ws": "8.16.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=16.13.2" + "node": ">= 8" } }, - "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", - "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", - "license": "Apache-2.0", + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "isexe": "^2.0.0" }, "bin": { - "browsers": "lib/cjs/main-cli.js" + "node-which": "bin/node-which" }, "engines": { - "node": ">=16.3.0" + "node": ">= 8" } }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -15579,2174 +955,2012 @@ } } }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1232444", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", - "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", - "license": "BSD-3-Clause" - }, - "node_modules/puppeteer-core/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/puppeteer-core/node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, "engines": { - "node": ">= 14" + "node": ">=0.4.0" } }, - "node_modules/puppeteer-core/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "license": "MIT", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "engines": { + "node": ">= 0.8" } }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "license": "MIT", + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=0.3.1" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "node_modules/doc-detective-common": { + "resolved": "../common", + "link": true + }, + "node_modules/doc-detective-core": { + "resolved": "../core", + "link": true + }, + "node_modules/doc-detective-resolver": { + "resolved": "../resolver", + "link": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4" } }, - "node_modules/query-selector-shadow-dom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, "license": "MIT" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.8" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "dev": true, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" + "es-errors": "^1.3.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "node_modules/es-toolkit": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.42.0.tgz", + "integrity": "sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, "engines": { - "node": ">= 14.18.0" + "node": ">= 18" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" + "mime-db": "^1.54.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "is-unicode-supported": "^2.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", - "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^2.0.1" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resq/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "license": "MIT" - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { - "glob": "^6.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { - "node": "*" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": "*" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 18" + "node": ">= 6" } }, - "node_modules/safaridriver": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", - "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, "license": "MIT", "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" + "node": ">= 0.6" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "optional": true - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": ">= 18" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/send/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/serialize-error": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", - "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", - "license": "MIT", + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", "dependencies": { - "type-fest": "^2.12.2" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=14.16" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serve-favicon/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "license": "MIT" - }, - "node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 18" + "node": ">= 0.4" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { + "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } }, - "node_modules/sharp": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", - "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">= 0.8" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.2", - "@img/sharp-darwin-x64": "0.34.2", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.2", - "@img/sharp-linux-arm64": "0.34.2", - "@img/sharp-linux-s390x": "0.34.2", - "@img/sharp-linux-x64": "0.34.2", - "@img/sharp-linuxmusl-arm64": "0.34.2", - "@img/sharp-linuxmusl-x64": "0.34.2", - "@img/sharp-wasm32": "0.34.2", - "@img/sharp-win32-arm64": "0.34.2", - "@img/sharp-win32-ia32": "0.34.2", - "@img/sharp-win32-x64": "0.34.2" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", - "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", - "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ink": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-6.5.1.tgz", + "integrity": "sha512-wF3j/DmkM8q5E+OtfdQhCRw8/0ahkc8CUTgEddxZzpEWPslu7YPL3t64MWRoI9m6upVGpfAg4ms2BBvxCdKRLQ==", + "license": "MIT", + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.2.1", + "ansi-escapes": "^7.2.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.6.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^5.1.1", + "code-excerpt": "^4.0.0", + "es-toolkit": "^1.39.10", + "indent-string": "^5.0.0", + "is-in-ci": "^2.0.0", + "patch-console": "^2.0.0", + "react-reconciler": "^0.33.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^8.1.0", + "type-fest": "^4.27.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.18.0", + "yoga-layout": "~3.2.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/react": ">=19.0.0", + "react": ">=19.0.0", + "react-devtools-core": "^6.1.2" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" - } - }, - "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/ink-select-input": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ink-select-input/-/ink-select-input-6.2.0.tgz", + "integrity": "sha512-304fZXxkpYxJ9si5lxRCaX01GNlmPBgOZumXXRnPYbHW/iI31cgQynqk2tRypGLOF1cMIwPUzL2LSm6q4I5rQQ==", + "license": "MIT", + "dependencies": { + "figures": "^6.1.0", + "to-rotated": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ink": ">=5.0.0", + "react": ">=18.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/ink-spinner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-5.0.0.tgz", + "integrity": "sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA==", + "license": "MIT", + "dependencies": { + "cli-spinners": "^2.7.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "ink": ">=4.0.0", + "react": ">=18.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/ink-testing-library": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ink-testing-library/-/ink-testing-library-4.0.0.tgz", + "integrity": "sha512-yF92kj3pmBvk7oKbSq5vEALO//o7Z9Ck/OaLNlkzXNeYdwfpxMQkSowGTFUCS5MSu9bWfSZMewGpp7bFc66D7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/ink/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-arm": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", - "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/ink/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", - "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=16" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", - "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", - "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", - "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-in-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", + "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", - "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/sharp/node_modules/@img/sharp-wasm32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", - "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.4.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://opencollective.com/libvips" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/sharp/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", - "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-win32-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", - "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 0.6" } }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "license": "MIT", + "node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/spacetrim": { - "version": "0.11.59", - "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", - "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0" - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "wrappy": "1" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "license": "CC0-1.0" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "optional": true, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "optional": true, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "license": "MIT", "engines": { - "node": ">= 10.x" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">= 0.10.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, "license": "MIT", "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "engines": { + "node": ">= 0.10" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "side-channel": "^1.1.0" }, "engines": { - "node": ">=12" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "safe-buffer": "^5.1.0" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=12" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/react": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", + "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/react-reconciler": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", + "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 14.18.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - ], + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 18" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/send/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/teen_process": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.3.2.tgz", - "integrity": "sha512-eiYtJbYrMz5WbZL68u05qCgLMShPZhYKVewZFoyT6C2xvNdMfikCP7Nh0K3Phiy+H4bMZ8q5GtJROFcoYwQJmQ==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" + "mime-db": "^1.54.0" }, "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": ">= 0.6" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, "dependencies": { - "b4a": "^1.6.4" + "randombytes": "^2.1.0" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, "engines": { - "node": ">=0.6" + "node": ">= 18" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "license": "MIT/X11", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": "*" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" + "node": ">=8" } }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" + "node": ">=8" } }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "license": "MIT", "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node": ">= 0.4" }, - "engines": { - "node": ">=14.17" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "license": "MIT", "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "license": "MIT", + "node_modules/sinon": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.5.tgz", + "integrity": "sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.5", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "node_modules/unzipper/node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "license": "MIT" - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/unzipper/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "license": "MIT" - }, - "node_modules/userhome": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", - "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", - "license": "MIT", + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/validate.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", - "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wait-port": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", - "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "commander": "^9.3.0", - "debug": "^4.3.4" - }, - "bin": { - "wait-port": "bin/wait-port.js" + "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/wait-port/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": ">= 0.8" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "optional": true, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { - "minimalistic-assert": "^1.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { - "defaults": "^1.0.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/webdriver": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.45.0.tgz", - "integrity": "sha512-guPEo1HeZ+4gvdvgMvnFpjTdqQ5SHkE7PKzWqhnDlSl6uhkFyiwSTt+77pgFLvjEPWesr3lpSTkvhyKQ8+Ov+g==", - "license": "MIT", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { - "@types/node": "^22.2.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.45.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.44.0", - "@wdio/types": "8.41.0", - "@wdio/utils": "8.45.0", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=8" } }, - "node_modules/webdriver/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "license": "MIT", + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/webdriver/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/webdriverio": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.45.0.tgz", - "integrity": "sha512-eLmEVLnBpnLdVr6vgCuNDU6XitPontbSORy7RbCHNykPqjpa2vQL4YigsV7K9YnPspGR1qhCe1uxsjAN5QGhCw==", - "license": "MIT", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { - "@types/node": "^22.2.0", - "@wdio/config": "8.45.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.44.0", - "@wdio/repl": "8.40.3", - "@wdio/types": "8.41.0", - "@wdio/utils": "8.45.0", - "archiver": "^7.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1400418", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "jszip": "^3.10.1", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^21.11.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.45.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webdriverio/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "license": "MIT", + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/webdriverio/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/to-rotated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-rotated/-/to-rotated-1.0.0.tgz", + "integrity": "sha512-KsEID8AfgUy+pxVRLsWp0VzCa69wxzUDZnzGbyIST/bcgcrMvTYoFBX/QORH4YApoD89EDuUovx4BTdpOn319Q==", "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, "engines": { - "node": ">= 12.0.0" + "node": ">= 0.6" } }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, "license": "MIT", "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "string-width": "^7.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/workerpool": { @@ -17777,6 +2991,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17793,6 +3008,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -17800,12 +3016,14 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17819,6 +3037,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17867,12 +3086,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -17890,15 +3110,6 @@ } } }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -17908,15 +3119,18 @@ } }, "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -18022,41 +3236,11 @@ "node": ">=8" } }, - "node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, @@ -18064,19 +3248,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" } } } diff --git a/cli/package.json b/cli/package.json index a2a62fb..3df466b 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective", - "version": "3.1.3-dev.1", + "version": "3.7.0-preview.0", "description": "Treat doc content as testable assertions to validate doc accuracy and product UX.", "bin": { "doc-detective": "src/index.js" @@ -8,7 +8,7 @@ "main": "./src/index.js", "scripts": { "mocha": "mocha", - "test": "mocha test/*.test.js", + "test": "mocha --exit test/*.test.js test/builder/*.test.mjs", "prerunTests": "node ./src/checkDependencies.js", "runTests": "node ./src/index.js runTests", "start": "node ./src/index.js", @@ -33,14 +33,24 @@ "homepage": "https://github.com/doc-detective/doc-detective#readme", "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", - "doc-detective-common": "^3.1.1", - "doc-detective-core": "^3.1.3-dev.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-core": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", + "ink": "^6.5.1", + "ink-select-input": "^6.2.0", + "ink-spinner": "^5.0.0", + "js-yaml": "^4.1.1", + "react": "^19.2.1", + "yaml": "^2.8.2", "yargs": "^17.7.2" }, "devDependencies": { - "body-parser": "^2.2.0", - "chai": "^5.2.1", - "express": "^5.1.0", - "mocha": "^11.7.1" + "body-parser": "^2.2.1", + "chai": "^6.2.1", + "express": "^5.2.1", + "ink-testing-library": "^4.0.0", + "mocha": "^11.7.5", + "sinon": "^19.0.2" } } diff --git a/cli/samples/http.spec.yaml b/cli/samples/http.spec.yaml index 9c46582..ceb3a62 100644 --- a/cli/samples/http.spec.yaml +++ b/cli/samples/http.spec.yaml @@ -1,37 +1,39 @@ tests: -- steps: - - loadVariables: env - - httpRequest: - url: http://localhost:8092/api/users - method: post - request: - body: - name: $USER - job: $JOB - response: - body: - name: John Doe - job: Software Engineer - - httpRequest: - url: http://localhost:8092/api/users - method: post - request: - body: - data: - - first_name: George - last_name: Bluth - id: 1 - response: - body: - data: - - first_name: George - last_name: Bluth - variables: - ID: $$response.body.data[0].id - - httpRequest: - url: http://localhost:8092/api/$ID - method: get - timeout: 1000 - savePath: response.json - maxVariation: 0 - overwrite: aboveVariation + - steps: + - loadVariables: env + - httpRequest: + url: http://localhost:8092/api/users + method: post + request: + body: + name: $USER + job: $JOB + response: + body: + name: John Doe + job: Software Engineer + - httpRequest: + url: http://localhost:8092/api/users + method: post + request: + body: + data: + - first_name: George + last_name: Bluth + id: 1 + response: + body: + data: + - first_name: George + last_name: Bluth + variables: + ID: $$response.body.data[0].id + - httpRequest: + url: http://localhost:8092/api/$ID + method: get + timeout: 1000 + savePath: response.json + maxVariation: 0 + overwrite: aboveVariation + testId: foobar +specId: edf6cf93-04f4-4931-ae7d-037bd75def9a diff --git a/cli/samples/kitten-search-analyze.md b/cli/samples/kitten-search-analyze.md new file mode 100644 index 0000000..71fca97 --- /dev/null +++ b/cli/samples/kitten-search-analyze.md @@ -0,0 +1,3 @@ +Head to DuckDuckGo and search for "American Shorthair kittens". After you hit Enter, wait for the results to load. + +!["Search results for kittens"](search-results.png){ .screenshot } \ No newline at end of file diff --git a/cli/samples/kitten-search.spec.json b/cli/samples/kitten-search.spec.json index ac2c383..ac4383a 100644 --- a/cli/samples/kitten-search.spec.json +++ b/cli/samples/kitten-search.spec.json @@ -3,26 +3,36 @@ { "steps": [ { - "action": "goTo", - "url": "https://www.duckduckgo.com" + "goTo": { + "url": "https://www.duckduckgo.com" + } }, { - "action": "find", - "selector": "#searchbox_input", - "click": true, - "typeKeys": { - "keys": ["American Shorthair kittens", "$ENTER$"] - } + "find": { + "selector": "#searchbox_input", + "click": true, + "type": { + "keys": ["American Shorthair kittens", "$ENTER$"] + } + }, + "variables": {} }, { - "action": "find", - "selector": "[data-testid='web-vertical']" + "find": { + "selector": "[data-testid='web-vertical']" + }, + "variables": {} }, { - "action": "saveScreenshot", - "path": "search-results.png" + "screenshot": { + "path": "search-results.png", + "maxVariation": 0 + } } - ] + ], + "detectSteps": true, + "testId": "efd34931-ba4f-47be-85bb-d8cb61123b8d" } - ] + ], + "specId": "02db96fc-7912-4eb6-ad79-9c96c2f1f8db" } diff --git a/cli/samples/tests.spec.json b/cli/samples/tests.spec.json deleted file mode 100644 index 4a37114..0000000 --- a/cli/samples/tests.spec.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "id": "Do all the things! - Spec", - "contexts": [ - { - "app": { - "name": "firefox" - }, - "platforms": ["windows", "mac", "linux"] - } - ], - "tests": [ - { - "id": "Do all the things! - Test", - "description": "This test includes nearly every property across all actions.", - "steps": [ - { - "action": "setVariables", - "path": ".env" - }, - { - "action": "runShell", - "command": "echo", - "args": ["$USER"] - }, - { - "action": "checkLink", - "url": "https://www.duckduckgo.com" - }, - { - "action": "httpRequest", - "url": "https://reqres.in/api/users", - "method": "post", - "requestData": { - "name": "morpheus", - "job": "leader" - }, - "responseData": { - "name": "morpheus", - "job": "leader" - }, - "statusCodes": [200, 201] - }, - { - "action": "goTo", - "url": "https://www.google.com" - }, - { - "action": "find", - "selector": "[title=Search]", - "timeout": 10000, - "moveTo": true, - "click": true, - "typeKeys": { - "keys": ["shorthair cat", "$ENTER$"] - } - }, - { - "action": "wait" - }, - { - "action": "saveScreenshot", - "path": "screenshot.png", - "directory": "samples", - "maxVariation": 5, - "overwrite": "byVariation" - } - ] - } - ] -} diff --git a/cli/scripts/bump-sync-version-core.js b/cli/scripts/bump-sync-version-core.js index dede5fe..5fe40d3 100755 --- a/cli/scripts/bump-sync-version-core.js +++ b/cli/scripts/bump-sync-version-core.js @@ -19,9 +19,17 @@ function execCommand(command, options = {}) { } function main() { + // Guard: Only run in CI environment to prevent accidental local execution + if (!process.env.CI) { + console.error("Error: This script should only be run in a CI environment."); + console.error("It performs destructive git operations (commits, tags, pushes)."); + console.error("Set CI=true environment variable to bypass this check if you know what you're doing."); + process.exit(1); + } + // Clean git state - execCommand("git checkout -- ."); - execCommand("git clean -fd"); + execCommand("git checkout -- ."); + execCommand("git clean -fd"); // Get current project version const packageJsonPath = path.join(process.cwd(), "package.json"); @@ -54,42 +62,40 @@ function main() { // Extract major and minor versions using semver const projMajor = semver.major(projVersion); const projMinor = semver.minor(projVersion); + const projPatch = semver.patch(projVersion); const coreMajor = semver.major(coreVersion); const coreMinor = semver.minor(coreVersion); + const corePatch = semver.patch(coreVersion); - console.log(`Project version: ${projMajor}.${projMinor}.x`); - console.log(`core version: ${coreMajor}.${coreMinor}.x`); + console.log(`Project version: ${projMajor}.${projMinor}.${projPatch}`); + console.log(`core version: ${coreMajor}.${coreMinor}.${corePatch}`); let newVersion; if (projMajor !== coreMajor || projMinor !== coreMinor) { // Major or minor mismatch: set version to match doc-detective-core major.minor.0 newVersion = `${coreMajor}.${coreMinor}.0`; - - // Validate the new version before setting it - if (!semver.valid(newVersion)) { - console.error(`Error: Generated invalid version: ${newVersion}`); - process.exit(1); - } - console.log(`Version mismatch detected. Setting version to: ${newVersion}`); - execCommand(`npm version --no-git-tag-version ${newVersion}`); } else { // Project version is already equal or greater than core version, just bump patch - console.log("Project version is current or ahead. Bumping patch version."); - execCommand("npm version patch --no-git-tag-version"); - // Get the new version after bumping - const updatedPackageJson = JSON.parse( - fs.readFileSync(packageJsonPath, "utf8") + newVersion = `${projMajor}.${projMinor}.${projPatch + 1}`; + console.log( + "Project version is current or ahead. Bumping patch version to:", + newVersion ); - newVersion = updatedPackageJson.version; + } + + // Validate the new version before setting it + if (!semver.valid(newVersion)) { + console.error(`Error: Generated invalid version: ${newVersion}`); + process.exit(1); } + execCommand(`npm version --no-git-tag-version ${newVersion}`); + // Commit changes execCommand("git add package.json package-lock.json"); - execCommand( - 'git commit -m "update doc-detective-core [skip ci]"' - ); + execCommand('git commit -m "update doc-detective-core [skip ci]"'); // Create tag execCommand(`git tag "v${newVersion}"`); diff --git a/cli/src/cli/App.mjs b/cli/src/cli/App.mjs new file mode 100644 index 0000000..32ab71b --- /dev/null +++ b/cli/src/cli/App.mjs @@ -0,0 +1,39 @@ +import React from 'react'; +const { createElement: h } = React; +import { Box, Text } from 'ink'; +import Spinner from 'ink-spinner'; +import TestRunner from './TestRunner.mjs'; +import ResultsSummary from './ResultsSummary.mjs'; + +const App = ({ config, state }) => { + return h(Box, { flexDirection: 'column', paddingY: 1 }, + h(Box, { marginBottom: 1 }, + h(Text, { bold: true, color: 'cyan' }, 'Doc Detective') + ), + + state.phase === 'initializing' && h(Box, null, + h(Text, { color: 'gray' }, + h(Spinner, { type: 'dots' }), ' Initializing...' + ) + ), + + state.phase === 'running' && h(TestRunner, { + config, + progress: state.progress, + currentSpec: state.currentSpec, + currentTest: state.currentTest, + }), + + state.phase === 'completed' && state.results && h(ResultsSummary, { + results: state.results, + config, + }), + + state.phase === 'error' && h(Box, { flexDirection: 'column' }, + h(Text, { color: 'red', bold: true }, '✖ Error'), + h(Text, { color: 'red' }, state.error?.message || String(state.error)) + ) + ); +}; + +export default App; diff --git a/cli/src/cli/ResultsSummary.mjs b/cli/src/cli/ResultsSummary.mjs new file mode 100644 index 0000000..c5e6391 --- /dev/null +++ b/cli/src/cli/ResultsSummary.mjs @@ -0,0 +1,162 @@ +import React from 'react'; +const { createElement: h } = React; +import { Box, Text } from 'ink'; + +const ResultsSummary = ({ results, config }) => { + if (!results || !results.summary) { + return h(Box, null, + h(Text, { color: 'yellow' }, 'No results available.') + ); + } + + const { specs, tests, contexts, steps } = results.summary; + + // Calculate totals + const totalSpecs = specs ? specs.pass + specs.fail + specs.warning + specs.skipped : 0; + const totalTests = tests ? tests.pass + tests.fail + tests.warning + tests.skipped : 0; + const totalContexts = contexts ? contexts.pass + contexts.fail + contexts.warning + contexts.skipped : 0; + const totalSteps = steps ? steps.pass + steps.fail + steps.warning + steps.skipped : 0; + + // Check for failures + const hasFailures = + (specs && specs.fail > 0) || + (tests && tests.fail > 0) || + (contexts && contexts.fail > 0) || + (steps && steps.fail > 0); + + // Check if all skipped + const allSpecsSkipped = + specs && specs.pass === 0 && specs.fail === 0 && specs.skipped > 0; + + const failedItems = hasFailures && results.specs ? getFailedItems(results) : []; + + return h(Box, { flexDirection: 'column' }, + // Header + h(Box, { marginBottom: 1 }, + h(Text, { bold: true, underline: true }, 'Test Results Summary') + ), + + // Specs summary + specs && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Specs'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalSpecs} `), + specs.pass > 0 && h(Text, { color: 'green' }, `✓ ${specs.pass} passed `), + specs.fail > 0 && h(Text, { color: 'red' }, `✖ ${specs.fail} failed `), + specs.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${specs.warning} warnings `), + specs.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${specs.skipped} skipped`) + ) + ), + + // Tests summary + tests && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Tests'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalTests} `), + tests.pass > 0 && h(Text, { color: 'green' }, `✓ ${tests.pass} passed `), + tests.fail > 0 && h(Text, { color: 'red' }, `✖ ${tests.fail} failed `), + tests.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${tests.warning} warnings `), + tests.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${tests.skipped} skipped`) + ) + ), + + // Contexts summary + contexts && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Contexts'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalContexts} `), + contexts.pass > 0 && h(Text, { color: 'green' }, `✓ ${contexts.pass} passed `), + contexts.fail > 0 && h(Text, { color: 'red' }, `✖ ${contexts.fail} failed `), + contexts.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${contexts.warning} warnings `), + contexts.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${contexts.skipped} skipped`) + ) + ), + + // Steps summary + steps && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Steps'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalSteps} `), + steps.pass > 0 && h(Text, { color: 'green' }, `✓ ${steps.pass} passed `), + steps.fail > 0 && h(Text, { color: 'red' }, `✖ ${steps.fail} failed `), + steps.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${steps.warning} warnings `), + steps.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${steps.skipped} skipped`) + ) + ), + + // Overall status + h(Box, { marginTop: 1 }, + allSpecsSkipped + ? h(Text, { color: 'yellow' }, '⚠ All items were skipped') + : hasFailures + ? h(Text, { color: 'red', bold: true }, '✖ Tests failed') + : h(Text, { color: 'green', bold: true }, '✓ All tests passed!') + ), + + // Failed items detail + hasFailures && results.specs && h(Box, { flexDirection: 'column', marginTop: 1 }, + h(Text, { bold: true, color: 'red' }, 'Failed Items:'), + ...failedItems.map((item, index) => + h(Box, { key: index, marginLeft: 2 }, + h(Text, { color: 'red' }, `• ${item}`) + ) + ) + ) + ); +}; + +// Helper function to extract failed items +function getFailedItems(results) { + const failures = []; + + if (!results.specs) return failures; + + results.specs.forEach((spec, specIndex) => { + if (spec.result === 'FAIL') { + failures.push(`Spec: ${spec.specId || `Spec ${specIndex + 1}`}`); + } + + if (spec.tests && spec.tests.length > 0) { + spec.tests.forEach((test, testIndex) => { + if (test.result === 'FAIL') { + failures.push( + `Test: ${test.testId || `Test ${testIndex + 1}`} (from ${ + spec.specId || `Spec ${specIndex + 1}` + })` + ); + } + + if (test.contexts && test.contexts.length > 0) { + test.contexts.forEach((context, contextIndex) => { + if ( + context.result === 'FAIL' || + (context.result && context.result.status === 'FAIL') + ) { + failures.push( + `Context: ${context.platform || 'unknown'}/${ + context.browser ? context.browser.name : 'unknown' + } (from ${test.testId || `Test ${testIndex + 1}`})` + ); + } + + if (context.steps && context.steps.length > 0) { + context.steps.forEach((step, stepIndex) => { + if (step.result === 'FAIL') { + failures.push( + `Step: ${step.stepId || `Step ${stepIndex + 1}`} - ${ + step.resultDescription || 'Unknown error' + }` + ); + } + }); + } + }); + } + }); + } + }); + + return failures; +} + +export default ResultsSummary; diff --git a/cli/src/cli/TestRunner.mjs b/cli/src/cli/TestRunner.mjs new file mode 100644 index 0000000..a8ed751 --- /dev/null +++ b/cli/src/cli/TestRunner.mjs @@ -0,0 +1,41 @@ +import React from 'react'; +const { createElement: h } = React; +import { Box, Text } from 'ink'; +import Spinner from 'ink-spinner'; + +const TestRunner = ({ config, progress, currentSpec, currentTest }) => { + return h(Box, { flexDirection: 'column' }, + h(Box, { marginBottom: 1 }, + h(Text, { color: 'yellow' }, + h(Spinner, { type: 'dots' }), ' Running tests...' + ) + ), + + // Progress bars + progress.specs.total > 0 && h(Box, { marginBottom: 0 }, + h(Text, { color: 'gray' }, + `Specs: ${progress.specs.current}/${progress.specs.total}` + ) + ), + + progress.tests.total > 0 && h(Box, { marginBottom: 0 }, + h(Text, { color: 'gray' }, + `Tests: ${progress.tests.current}/${progress.tests.total}` + ) + ), + + progress.steps.total > 0 && h(Box, { marginBottom: 1 }, + h(Text, { color: 'gray' }, + `Steps: ${progress.steps.current}/${progress.steps.total}` + ) + ), + + // Current execution context + currentSpec && h(Box, { flexDirection: 'column', marginTop: 1 }, + h(Text, { color: 'cyan' }, `Current: ${currentSpec}`), + currentTest && h(Text, { color: 'gray', dimColor: true }, `→ ${currentTest}`) + ) + ); +}; + +export default TestRunner; diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs new file mode 100644 index 0000000..6d7c4e3 --- /dev/null +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -0,0 +1,977 @@ +/** + * Debug runner component - interactive step-by-step test execution + * Allows users to run tests with a visible browser, edit steps, and retry on failure + */ + +import React from 'react'; +const { useState, useEffect, useCallback, useRef } = React; +import { Box, Text, useInput, useApp } from 'ink'; +import SelectInput from 'ink-select-input'; +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const os = await import('os'); +const path = await import('path'); +const fs = await import('fs'); + +import StepEditor from './StepEditor.mjs'; +import { StatusBar, JsonPreview, ConfirmPrompt } from './components.mjs'; +import { + getStepTypes, + getCommonStepProperties, + createDefaultStep, + getBrowserActions, + getStepActionType, + stepRequiresBrowser, +} from './schemaUtils.mjs'; + +// AI utilities from common +const { refineStep, detectProvider } = require('doc-detective-common'); + +/** + * Truncate a string to a maximum number of grapheme clusters (user-perceived characters). + * Uses Intl.Segmenter if available (Node 16+), otherwise falls back to Array.from for code-point safety. + * @param {string} str - The string to truncate + * @param {number} maxLength - Maximum number of grapheme clusters + * @param {string} [ellipsis='…'] - Ellipsis to append if truncated + * @returns {string} The truncated string + */ +function truncateGraphemeSafe(str, maxLength, ellipsis = '…') { + if (typeof str !== 'string' || str.length === 0) { + return ''; + } + + // Use Intl.Segmenter if available (Node 16+) + if (typeof Intl !== 'undefined' && Intl.Segmenter) { + const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' }); + const segments = [...segmenter.segment(str)]; + + if (segments.length <= maxLength) { + return str; + } + + const truncated = segments.slice(0, maxLength).map(s => s.segment).join(''); + return truncated + ellipsis; + } + + // Fallback: use Array.from for code-point safety + const codePoints = Array.from(str); + + if (codePoints.length <= maxLength) { + return str; + } + + return codePoints.slice(0, maxLength).join('') + ellipsis; +} + +/** + * Find the index of the first browser-requiring step + * @param {Array} steps - Array of steps + * @returns {number} Index of first browser step, or -1 if none + */ +function findFirstBrowserStepIndex(steps) { + return steps.findIndex((step) => stepRequiresBrowser(step)); +} + +/** + * Check if a goTo step exists before the given index + * @param {Array} steps - Array of steps + * @param {number} beforeIndex - Index to check before + * @returns {boolean} + */ +function hasGoToBefore(steps, beforeIndex) { + for (let i = 0; i < beforeIndex; i++) { + if (steps[i].goTo) { + return true; + } + } + return false; +} + +/** + * Debug Runner component + * @param {Object} props + * @param {Object} props.test - The test to run + * @param {number} props.testIndex - Index of the test in the spec + * @param {Function} props.onComplete - Called when debug session completes with updated test + * @param {Function} props.onCancel - Called when user cancels debug session + */ +const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { + const { exit } = useApp(); + + // Phase states + const [phase, setPhase] = useState('init'); // 'init', 'checkGoTo', 'addGoTo', 'running', 'stepPreview', 'stepEdit', 'stepResult', 'aiRefining', 'aiRefineResult', 'complete', 'error' + + // Runner state + const [runner, setRunner] = useState(null); + const [cleanup, setCleanup] = useState(null); + const [runStep, setRunStep] = useState(null); + const [initError, setInitError] = useState(null); + + // Test state (mutable copy) + const [localTest, setLocalTest] = useState(() => JSON.parse(JSON.stringify(test))); + + // Step execution state + const [currentStepIndex, setCurrentStepIndex] = useState(0); + const [stepResult, setStepResult] = useState(null); + const [isExecuting, setIsExecuting] = useState(false); + + // AI refinement state + const [aiRefinedStep, setAiRefinedStep] = useState(null); + const [aiRefineError, setAiRefineError] = useState(null); + + // Results tracking + const [results, setResults] = useState({ passed: 0, failed: 0 }); + + // Auto-advance timer ref + const autoAdvanceTimer = useRef(null); + + // Cleanup on unmount + useEffect(() => { + return () => { + if (autoAdvanceTimer.current) { + clearTimeout(autoAdvanceTimer.current); + } + if (cleanup) { + cleanup().catch(() => {}); + } + }; + }, [cleanup]); + + // Initialize runner + useEffect(() => { + if (phase !== 'init') return; + + const initRunner = async () => { + try { + const { getRunner } = require('doc-detective-core'); + const result = await getRunner({ headless: false }); + setRunner(result.runner); + setCleanup(() => result.cleanup); + setRunStep(() => result.runStep); + + // Check if we need a goTo step + const steps = localTest.steps || []; + const firstBrowserIndex = findFirstBrowserStepIndex(steps); + + if (firstBrowserIndex >= 0 && !hasGoToBefore(steps, firstBrowserIndex)) { + setPhase('checkGoTo'); + } else { + setPhase('stepPreview'); + } + } catch (error) { + setInitError(error.message || 'Failed to initialize browser'); + setPhase('error'); + } + }; + + initRunner(); + }, [phase, localTest.steps]); + + // Handle escape key + useInput((input, key) => { + if (key.escape) { + if (phase === 'stepEdit') { + setPhase('stepPreview'); + } else if (phase === 'aiRefineResult') { + // Go back to stepResult without AI + setAiRefinedStep(null); + setAiRefineError(null); + setPhase('stepResult'); + } else if (phase === 'stepPreview' || phase === 'stepResult') { + // Clear auto-advance timer when leaving stepResult + if (autoAdvanceTimer.current) { + clearTimeout(autoAdvanceTimer.current); + autoAdvanceTimer.current = null; + } + // Confirm exit + setPhase('confirmExit'); + } + } + }); + + // Cleanup and exit helper + const cleanupAndExit = useCallback(async (callback) => { + if (autoAdvanceTimer.current) { + clearTimeout(autoAdvanceTimer.current); + } + if (cleanup) { + try { + await cleanup(); + } catch (e) { + // Ignore cleanup errors + } + } + callback(); + }, [cleanup]); + + // Attempt AI refinement of a failed step + const attemptAiRefinement = useCallback(async (step, failureMessage) => { + // Check if AI provider is actually available (detectProvider is async) + const detectedProvider = await detectProvider(); + if (!detectedProvider.provider) { + // No AI provider available, skip refinement + setPhase('stepResult'); + return; + } + + setAiRefinedStep(null); + setAiRefineError(null); + setPhase('aiRefining'); + + try { + // Get previous steps for context + const previousSteps = (localTest.steps || []).slice(0, currentStepIndex); + + // Try to get the current browser DOM for context + let dom = null; + if (runner && detectedProvider.provider !== 'ollama') { + try { + dom = await runner.getPageSource(); + } catch (domError) { + // Ignore DOM fetch errors - browser might not have a page loaded + } + } + + // Capture a screenshot of the current browser viewport for AI analysis + let files = []; + if (runner && detectedProvider.provider !== 'ollama') { + try { + const tempPath = path.default.join(os.default.tmpdir(), `dd-debug-screenshot-${Date.now()}.png`); + const screenshotBuffer = await runner.saveScreenshot(tempPath); + const screenshotBase64 = screenshotBuffer.toString('base64'); + files.push({ + type: 'image', + data: screenshotBase64, + mimeType: 'image/png', + }); + // Clean up temp file + try { + fs.default.unlinkSync(tempPath); + } catch (cleanupError) { + // Ignore cleanup errors + } + } catch (screenshotError) { + // Ignore screenshot errors - browser might not have a page loaded + } + } + + const refined = await refineStep({ + step, + failureMessage, + previousSteps, + context: dom ? { dom } : undefined, + config: {}, // Uses env vars for API keys + files: files.length > 0 ? files : undefined, + }); + + setAiRefinedStep(refined); + setPhase('aiRefineResult'); + } catch (error) { + setAiRefineError(error.message || 'AI refinement failed'); + setPhase('aiRefineResult'); + } + }, [localTest.steps, currentStepIndex, runner]); + + // Execute current step + const executeStep = useCallback(async () => { + if (!runStep || !runner) return; + + const steps = localTest.steps || []; + const step = steps[currentStepIndex]; + + if (!step) { + setPhase('complete'); + return; + } + + setIsExecuting(true); + setStepResult(null); + + try { + const result = await runStep({ + config: {}, + context: {}, + step, + driver: runner, + metaValues: {}, + options: {}, + }); + + setStepResult(result); + + if (result.status === 'PASS') { + setResults((prev) => ({ ...prev, passed: prev.passed + 1 })); + setPhase('stepResult'); + + // Auto-advance after 1.5 seconds + autoAdvanceTimer.current = setTimeout(() => { + if (currentStepIndex < steps.length - 1) { + setCurrentStepIndex((prev) => prev + 1); + setPhase('stepPreview'); + } else { + setPhase('complete'); + } + }, 1500); + } else { + setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); + // Attempt automatic AI refinement (will check provider availability internally) + attemptAiRefinement(step, result.description || 'Step failed'); + } + } catch (error) { + setStepResult({ + status: 'FAIL', + description: error.message || 'Step execution failed', + }); + setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); + // Attempt automatic AI refinement (will check provider availability internally) + attemptAiRefinement(steps[currentStepIndex], error.message || 'Step execution failed'); + } finally { + setIsExecuting(false); + } + }, [runStep, runner, localTest.steps, currentStepIndex, attemptAiRefinement]); + + // Add goTo step at the specified index + const addGoToStep = useCallback((url, insertIndex) => { + const newSteps = [...(localTest.steps || [])]; + newSteps.splice(insertIndex, 0, { goTo: url }); + setLocalTest({ ...localTest, steps: newSteps }); + }, [localTest]); + + // Update a step + const updateStep = useCallback((stepIndex, updatedStep) => { + const newSteps = [...(localTest.steps || [])]; + newSteps[stepIndex] = updatedStep; + setLocalTest({ ...localTest, steps: newSteps }); + }, [localTest]); + + // Get step display info + const getStepDisplay = (step) => { + const actionType = getStepActionType(step); + const actionValue = actionType ? step[actionType] : null; + const displayValue = typeof actionValue === 'string' + ? truncateGraphemeSafe(actionValue, 50) + : typeof actionValue === 'object' + ? truncateGraphemeSafe(JSON.stringify(actionValue), 50) + : ''; + return { actionType: actionType || 'unknown', displayValue }; + }; + + const steps = localTest.steps || []; + const totalSteps = steps.length; + const currentStep = steps[currentStepIndex]; + + // Error phase + if (phase === 'error') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Error'], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Initialization Error') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red' }, initError) + ), + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => onCancel(), + }) + ); + } + + // Init phase - loading + if (phase === 'init') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Initializing'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, '🚀 Starting browser...') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'This may take a moment. The browser will open in visible mode.' + ) + ); + } + + // Check goTo phase + if (phase === 'checkGoTo') { + const firstBrowserIndex = findFirstBrowserStepIndex(steps); + const firstBrowserStep = steps[firstBrowserIndex]; + const { actionType } = getStepDisplay(firstBrowserStep); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Navigation Required'], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow', bold: true }, '⚠️ No Navigation Step Found') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + null, + `The first browser action is "${actionType}" (step ${firstBrowserIndex + 1}), but there's no goTo step before it.` + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Browser actions require navigating to a URL first.' + ) + ), + React.createElement(SelectInput, { + items: [ + { label: '➕ Add a goTo step', value: 'addGoTo' }, + { label: '← Cancel debug session', value: 'cancel' }, + ], + onSelect: (item) => { + if (item.value === 'addGoTo') { + setPhase('addGoTo'); + } else { + cleanupAndExit(onCancel); + } + }, + }) + ); + } + + // Add goTo phase + if (phase === 'addGoTo') { + const firstBrowserIndex = findFirstBrowserStepIndex(steps); + + return React.createElement(GoToInput, { + onSubmit: (url) => { + addGoToStep(url, firstBrowserIndex); + setPhase('stepPreview'); + }, + onCancel: () => setPhase('checkGoTo'), + }); + } + + // Step preview phase + if (phase === 'stepPreview' && currentStep) { + const { actionType, displayValue } = getStepDisplay(currentStep); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + hint: 'Run, edit, or stop the debug session', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, `Step ${currentStepIndex + 1}: `), + React.createElement(Text, { color: 'white' }, actionType), + displayValue && React.createElement(Text, { color: 'gray' }, `: ${displayValue}`) + ), + React.createElement( + Box, + { marginBottom: 1, borderStyle: 'single', borderColor: 'gray', paddingX: 1 }, + React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Step JSON:'), + React.createElement(Text, { color: 'white' }, JSON.stringify(currentStep, null, 2)) + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '▶️ Run this step', value: 'run' }, + { label: '✏️ Edit step before running', value: 'edit' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'run') { + executeStep(); + } else if (item.value === 'edit') { + setPhase('stepEdit'); + } else if (item.value === 'stop') { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + + // Step edit phase + if (phase === 'stepEdit' && currentStep) { + return React.createElement(StepEditor, { + step: currentStep, + stepIndex: currentStepIndex, + onChange: (updatedStep) => { + updateStep(currentStepIndex, updatedStep); + }, + onSave: (updatedStep) => { + updateStep(currentStepIndex, updatedStep); + setPhase('stepPreview'); + }, + onCancel: () => setPhase('stepPreview'), + onDelete: () => { + // Don't allow deletion during debug - would mess up step indices + setPhase('stepPreview'); + }, + }); + } + + // Step result phase + if (phase === 'stepResult') { + const passed = stepResult?.status === 'PASS'; + const { actionType } = getStepDisplay(currentStep); + + if (passed) { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + validationStatus: true, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'green', bold: true }, '✅ Step Passed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" completed successfully.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, stepResult.description) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + currentStepIndex < totalSteps - 1 + ? 'Auto-advancing to next step...' + : 'Test complete! Finishing up...' + ) + ); + } else { + // Failed - show error and options + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Step Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" failed to execute.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1, paddingX: 1, borderStyle: 'single', borderColor: 'red' }, + React.createElement(Text, { color: 'red' }, stepResult.description) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '✏️ Edit step and retry', value: 'editRetry' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'editRetry') { + // Decrement failed count since we're retrying + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setPhase('stepEdit'); + } else { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + } + + // AI refining phase - loading state + if (phase === 'aiRefining') { + const { actionType } = getStepDisplay(currentStep); + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`, 'AI Refinement'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Step Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" failed to execute.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1, paddingX: 1, borderStyle: 'single', borderColor: 'red' }, + React.createElement(Text, { color: 'red' }, stepResult.description) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, '🤖 Attempting AI-powered step refinement...') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'The AI is analyzing the failure and suggesting fixes.' + ) + ); + } + + // AI refine result phase - show AI suggestion or error + if (phase === 'aiRefineResult') { + const { actionType } = getStepDisplay(currentStep); + + if (aiRefineError) { + // AI refinement failed - fall back to manual editing + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Step Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" failed to execute.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1, paddingX: 1, borderStyle: 'single', borderColor: 'red' }, + React.createElement(Text, { color: 'red' }, stepResult.description) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow' }, '⚠️ AI refinement failed: '), + React.createElement(Text, { color: 'gray' }, truncateGraphemeSafe(aiRefineError, 80)) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '✏️ Edit step manually and retry', value: 'editRetry' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'editRetry') { + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setPhase('stepEdit'); + } else { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + + // AI refinement succeeded - show the suggestion + const refinedDisplay = getStepDisplay(aiRefinedStep); + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`, 'AI Suggestion'], + validationStatus: null, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan', bold: true }, '🤖 AI Suggested Fix') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'The AI has suggested a refined version of this step:') + ), + React.createElement( + Box, + { marginBottom: 1, borderStyle: 'single', borderColor: 'cyan', paddingX: 1 }, + React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Suggested Step:'), + React.createElement(Text, { color: 'white' }, JSON.stringify(aiRefinedStep, null, 2)) + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '✅ Accept AI suggestion', value: 'accept' }, + { label: '↩️ Keep original step and edit manually', value: 'editOriginal' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'accept') { + // Apply the AI suggestion and retry + updateStep(currentStepIndex, aiRefinedStep); + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setAiRefinedStep(null); + setPhase('stepPreview'); + } else if (item.value === 'editOriginal') { + // Discard AI suggestion, edit original + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setAiRefinedStep(null); + setPhase('stepEdit'); + } else { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + + // Confirm exit phase + if (phase === 'confirmExit') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Confirm Exit'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow', bold: true }, '⚠️ Stop Debug Session?') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'This will close the browser and return to the editor.') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Current progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: 'Stop and save changes', value: 'stop' }, + { label: 'Continue debugging', value: 'continue' }, + ], + onSelect: (item) => { + if (item.value === 'stop') { + cleanupAndExit(() => onComplete(localTest)); + } else { + setPhase('stepPreview'); + } + }, + }) + ); + } + + // Complete phase + if (phase === 'complete') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Complete'], + validationStatus: results.failed === 0, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: results.failed === 0 ? 'green' : 'yellow', bold: true }, + results.failed === 0 ? '🎉 All Steps Passed!' : '⚠️ Debug Session Complete' + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `Results: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Any changes made during debugging will be preserved.' + ) + ), + React.createElement(SelectInput, { + items: [ + { label: '← Return to editor', value: 'done' }, + ], + onSelect: () => { + cleanupAndExit(() => onComplete(localTest)); + }, + }) + ); + } + + // Fallback for executing state + if (isExecuting) { + const { actionType } = getStepDisplay(currentStep); + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, `⏳ Running "${actionType}"...`) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Check the browser window for action execution.' + ) + ); + } + + // Default fallback + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(Text, { color: 'gray' }, 'Loading...') + ); +}; + +/** + * GoTo URL input component + */ +const GoToInput = ({ onSubmit, onCancel }) => { + const [url, setUrl] = useState('https://'); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + return; + } + if (key.return) { + if (url.trim() && (url.startsWith('http://') || url.startsWith('https://'))) { + onSubmit(url.trim()); + } + return; + } + if (key.backspace || key.delete) { + setUrl((prev) => { + if (prev.length === 0) return prev; + if (typeof Intl !== 'undefined' && Intl.Segmenter) { + const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' }); + const segments = [...segmenter.segment(prev)]; + return segments.slice(0, -1).map(s => s.segment).join(''); + } + const chars = Array.from(prev); + return chars.slice(0, -1).join(''); + }); + return; + } + if (!key.ctrl && !key.meta && input) { + setUrl((prev) => prev + input); + } + }); + + const isValid = url.trim() && (url.startsWith('http://') || url.startsWith('https://')); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Add goTo Step'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🌐 Add Navigation Step') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Enter the URL to navigate to before running browser actions:') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, 'URL: '), + React.createElement(Text, { color: isValid ? 'green' : 'white' }, url), + React.createElement(Text, { color: 'gray' }, '█') + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Press Enter to confirm, Esc to cancel' + ) + ), + !isValid && url.length > 0 && React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + 'URL must start with http:// or https://' + ) + ) + ); +}; + +export default DebugRunner; diff --git a/cli/src/cli/builder/FieldEditor.mjs b/cli/src/cli/builder/FieldEditor.mjs new file mode 100644 index 0000000..4c02389 --- /dev/null +++ b/cli/src/cli/builder/FieldEditor.mjs @@ -0,0 +1,433 @@ +/** + * Field editor component - handles editing individual fields based on their schema (ESM version) + */ + +import React from 'react'; +const { useState, useEffect } = React; +import { Box, Text, useInput } from 'ink'; +import SelectInput from 'ink-select-input'; +import { SimpleTextInput, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; +import { validatePattern, describePattern, getFieldVariants, detectVariantIndex } from './schemaUtils.mjs'; + +/** + * Variant type selector for fields with anyOf + */ +const FieldVariantSelector = ({ field, currentValue, onSelect, onCancel }) => { + const variants = getFieldVariants(field); + const currentIndex = detectVariantIndex(currentValue, variants); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + } + }); + + const items = variants.map((variant, index) => ({ + label: variant.title, + description: variant.description || '', + value: `variant_${index}`, + key: `variant_${index}`, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, field.name + ' - Select type:') + ), + React.createElement(ScrollableSelect, { + items, + initialIndex: currentIndex, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + const index = parseInt(item.value.replace('variant_', ''), 10); + onSelect(index, variants[index]); + }, + }), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to cancel)' + ) + ); +}; + +/** + * Universal field editor that adapts to field type + */ +const FieldEditor = ({ + field, + value, + onChange, + onSubmit, + onCancel, + autoFocus = true, +}) => { + const [localValue, setLocalValue] = useState( + value !== undefined ? String(value) : '' + ); + const [error, setError] = useState(null); + const [showVariantSelector, setShowVariantSelector] = useState(false); + const [selectedVariant, setSelectedVariant] = useState(null); + + // Check if this field has anyOf variants (and it's not just an enum) + const variants = getFieldVariants(field); + const hasMultipleVariants = variants.length > 1 && !field.enum; + + // Determine the effective field based on selected variant + const effectiveField = selectedVariant ? { + ...field, + type: selectedVariant.type, + pattern: selectedVariant.schema.pattern, + minimum: selectedVariant.schema.minimum, + maximum: selectedVariant.schema.maximum, + enum: selectedVariant.schema.enum, + default: selectedVariant.schema.default, + } : field; + + // Validate on change + useEffect(() => { + if (effectiveField.pattern && localValue) { + const isValid = validatePattern(localValue, effectiveField.pattern); + if (!isValid) { + setError(describePattern(effectiveField.pattern)); + } else { + setError(null); + } + } else { + setError(null); + } + }, [localValue, effectiveField.pattern]); + + // Handle escape and tab keys + useInput((input, key) => { + if (key.escape) { + if (showVariantSelector) { + setShowVariantSelector(false); + } else { + onCancel(); + } + } + if (key.tab && hasMultipleVariants) { + setShowVariantSelector(true); + } + }); + + // Auto-show variant selector for new values with multiple variants + useEffect(() => { + if (hasMultipleVariants && !selectedVariant && showVariantSelector === false && value === undefined) { + setShowVariantSelector(true); + } + }, [hasMultipleVariants, selectedVariant, showVariantSelector, value]); + + // Show variant selector first if field has multiple variants and none selected + if (hasMultipleVariants && !selectedVariant && showVariantSelector === false && value === undefined) { + return null; + } + + if (showVariantSelector && hasMultipleVariants) { + return React.createElement(FieldVariantSelector, { + field, + currentValue: value, + onSelect: (index, variant) => { + setSelectedVariant(variant); + setShowVariantSelector(false); + // Set default value based on variant type + if (variant.type === 'null') { + onChange(null); + onSubmit(null); + } else if (variant.type === 'boolean') { + setLocalValue('true'); + } else if (variant.type === 'number' || variant.type === 'integer') { + const defaultVal = variant.schema.default !== undefined ? String(variant.schema.default) : '0'; + setLocalValue(defaultVal); + } else { + setLocalValue(''); + } + }, + onCancel: () => { + setShowVariantSelector(false); + onCancel(); + }, + }); + } + + // Enum field - use select input + if (effectiveField.enum && Array.isArray(effectiveField.enum)) { + const items = effectiveField.enum.map((opt) => ({ + label: String(opt), + value: opt, + })); + + // Add option to switch type if field has variants + if (hasMultipleVariants) { + items.push({ label: '↔ Switch type...', value: '_switchType' }); + } + + const initialIndex = Math.max(0, effectiveField.enum.indexOf(value)); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 0 }, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ':' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + ' (' + selectedVariant.title + ')' + ) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items, + initialIndex, + onSelect: (item) => { + if (item.value === '_switchType') { + setShowVariantSelector(true); + } else { + onChange(item.value); + onSubmit(item.value); + } + }, + }) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Esc to cancel)' + ) + ); + } + + // Boolean field + if (effectiveField.type === 'boolean') { + const items = [ + { label: 'true', value: true }, + { label: 'false', value: false }, + ]; + + // Add option to switch type if field has variants + if (hasMultipleVariants) { + items.push({ label: '↔ Switch type...', value: '_switchType' }); + } + + const initialIndex = value === true ? 0 : 1; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 0 }, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ':' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + ' (' + selectedVariant.title + ')' + ) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items, + initialIndex, + onSelect: (item) => { + if (item.value === '_switchType') { + setShowVariantSelector(true); + } else { + onChange(item.value); + onSubmit(item.value); + } + }, + }) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Esc to cancel)' + ) + ); + } + + // Number/Integer field + if (effectiveField.type === 'number' || effectiveField.type === 'integer') { + const handleChange = (val) => { + setLocalValue(val); + // Allow empty or valid numbers + if (val === '' || val === '-') { + setError(null); + } else { + const num = Number(val); + if (isNaN(num)) { + setError('Must be a number'); + } else if (effectiveField.minimum !== undefined && num < effectiveField.minimum) { + setError(`Must be at least ${effectiveField.minimum}`); + } else if (effectiveField.maximum !== undefined && num > effectiveField.maximum) { + setError(`Must be at most ${effectiveField.maximum}`); + } else { + setError(null); + } + } + }; + + const handleSubmit = () => { + if (error) return; + if (localValue === '' && effectiveField.default === undefined) { + setError('A value is required'); + return; + } + const num = localValue === '' ? effectiveField.default : Number(localValue); + onChange(num); + onSubmit(num); + }; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + null, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ': ' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + '(' + selectedVariant.title + ') ' + ), + React.createElement(SimpleTextInput, { + value: localValue, + onChange: handleChange, + onSubmit: handleSubmit, + focus: autoFocus, + }) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + effectiveField.default !== undefined && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' Default: ' + effectiveField.default + ), + hasMultipleVariants && + React.createElement( + Text, + { color: 'blue', dimColor: true }, + ' [Press Tab to switch type]' + ), + error && React.createElement(Text, { color: 'red' }, ' ✖ ' + error), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Enter to save, Esc to cancel)' + ) + ); + } + + // Default: String field + const handleSubmit = () => { + if (error) return; + onChange(localValue); + onSubmit(localValue); + }; + + const handleStringChange = (val) => { + if (val === '?' && hasMultipleVariants && localValue === '') { + setShowVariantSelector(true); + } else { + setLocalValue(val); + } + }; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + null, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ': ' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + '(' + selectedVariant.title + ') ' + ), + React.createElement(SimpleTextInput, { + value: localValue, + onChange: handleStringChange, + onSubmit: handleSubmit, + focus: autoFocus, + }) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + effectiveField.pattern && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' Pattern: ' + describePattern(effectiveField.pattern) + ), + effectiveField.default !== undefined && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' Default: ' + String(effectiveField.default) + ), + hasMultipleVariants && + React.createElement( + Text, + { color: 'blue', dimColor: true }, + ' [Type "?" to switch type]' + ), + error && React.createElement(Text, { color: 'red' }, ' ✖ ' + error), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Enter to save, Esc to cancel)' + ) + ); +}; + +export default FieldEditor; diff --git a/cli/src/cli/builder/SpecSelector.mjs b/cli/src/cli/builder/SpecSelector.mjs new file mode 100644 index 0000000..0841cba --- /dev/null +++ b/cli/src/cli/builder/SpecSelector.mjs @@ -0,0 +1,250 @@ +/** + * Spec selector component for choosing which spec to edit + * When multiple input files are provided, this component displays a list + * of specs for the user to choose from. + */ + +import React from 'react'; +const { useState, useEffect } = React; +import { Box, Text, useApp, useInput } from 'ink'; +import * as path from 'path'; +import { ScrollableSelect, NoIndicator } from './components.mjs'; + +/** + * SpecSelector component - displays a list of specs to choose from + * @param {Object} props + * @param {Array} props.specs - Array of spec objects: { spec, filePath, extension, isValid, validationErrors } + * @param {string} props.outputDir - Output directory for new specs + */ +const SpecSelector = ({ specs, outputDir }) => { + const { exit } = useApp(); + const [selectedSpec, setSelectedSpec] = useState(null); + const [TestBuilder, setTestBuilder] = useState(null); + const [importError, setImportError] = useState(null); + + // Dynamically import TestBuilder when a spec is selected + useEffect(() => { + if (selectedSpec) { + import('./TestBuilder.mjs') + .then(module => { + setTestBuilder(() => module.default); + }) + .catch(error => { + console.error('Failed to load TestBuilder:', error); + setImportError(error); + setTestBuilder(null); + }); + } + }, [selectedSpec]); + + // Handle going back to the spec list + const handleBack = () => { + setSelectedSpec(null); + setTestBuilder(null); + setImportError(null); + }; + + // Handle key press to go back from error state + useInput(() => { + if (importError) { + handleBack(); + } + }, { isActive: !!importError }); + + // Show error state if TestBuilder import failed + if (selectedSpec && importError) { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Text, + { color: 'red', bold: true }, + '❌ Failed to load editor' + ), + React.createElement( + Text, + { color: 'gray' }, + importError.message || 'An unknown error occurred' + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'cyan' }, + 'Press any key to go back...' + ) + ) + ); + } + + // If a spec is selected and TestBuilder is loaded, render the TestBuilder + if (selectedSpec && TestBuilder) { + return React.createElement(TestBuilder, { + initialSpec: selectedSpec.spec, + inputFilePath: selectedSpec.filePath, + inputFileExtension: selectedSpec.extension, + isValid: selectedSpec.isValid, + validationErrors: selectedSpec.validationErrors, + outputDir, + onBack: handleBack, + }); + } + + // Show loading state while TestBuilder is being imported + if (selectedSpec && !TestBuilder) { + return React.createElement( + Box, + { padding: 1 }, + React.createElement(Text, { color: 'cyan' }, 'Loading editor...') + ); + } + + // Build menu items from specs + const items = specs.map((specData, index) => { + const { spec, filePath, isValid, validationErrors } = specData; + const fileName = filePath ? path.basename(filePath) : 'untitled'; + const dirName = filePath ? path.dirname(filePath) : outputDir; + const specId = spec.specId || spec.id || `Spec ${index + 1}`; + const testCount = (spec.tests || []).length; + + // Build status indicator + let statusIcon = '✅'; + let statusColor = 'green'; + if (!isValid) { + statusIcon = '⚠️'; + statusColor = 'yellow'; + } + + return { + label: `${statusIcon} ${specId}`, + value: index, + specData, + fileName, + dirName, + testCount, + isValid, + validationErrors, + }; + }); + + // Add option to create new spec + items.push({ + label: '➕ Create new specification', + value: 'new', + }); + + // Add exit option + items.push({ + label: '🚪 Exit', + value: 'exit', + }); + + // Custom item component with additional details + const SpecItem = ({ isSelected, label, value, fileName, dirName, testCount, isValid, validationErrors }) => { + if (value === 'new' || value === 'exit') { + return React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: isSelected ? 'cyan' : 'white', bold: isSelected }, + (isSelected ? '❯ ' : ' ') + label + ) + ); + } + + return React.createElement( + Box, + { flexDirection: 'column', marginBottom: 1 }, + React.createElement( + Text, + { color: isSelected ? 'cyan' : 'white', bold: isSelected }, + (isSelected ? '❯ ' : ' ') + label + ), + React.createElement( + Box, + { marginLeft: 4, flexDirection: 'column' }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `📁 ${fileName}` + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `📂 ${dirName}` + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `📝 ${testCount} test${testCount !== 1 ? 's' : ''}` + ), + !isValid && validationErrors && React.createElement( + Text, + { color: 'yellow' }, + `⚠️ ${validationErrors}` + ) + ) + ); + }; + + const handleSelect = (item) => { + if (item.value === 'exit') { + exit(); + return; + } + + if (item.value === 'new') { + // Set a null selectedSpec to trigger TestBuilder with no initial spec + setSelectedSpec({ spec: null, filePath: null, extension: null, isValid: true }); + return; + } + + // Set the selected spec + setSelectedSpec(item.specData); + }; + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🔧 Doc Detective Test Builder') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Select a specification to edit:') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `Found ${specs.length} specification${specs.length !== 1 ? 's' : ''}` + ) + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: SpecItem, + indicatorComponent: NoIndicator, + onSelect: handleSelect, + linesPerItem: 5, // Each spec item takes ~5 lines (title + 3 details + margin) + reservedLines: 10, // Header, subtitle, count, footer hint, padding + }), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Use ↑↓ to navigate, Enter to select' + ) + ) + ); +}; + +export default SpecSelector; diff --git a/cli/src/cli/builder/StepEditor.mjs b/cli/src/cli/builder/StepEditor.mjs new file mode 100644 index 0000000..3c6a78c --- /dev/null +++ b/cli/src/cli/builder/StepEditor.mjs @@ -0,0 +1,644 @@ +/** + * Step editor component - handles editing individual steps (ESM version) + */ + +import React from 'react'; +const { useState, useMemo, useEffect } = React; +import { Box, Text, useInput } from 'ink'; +import SelectInput from 'ink-select-input'; +import { + getStepTypes, + getStepTypeFields, + getStepTypeInfo, + getStepTypeVariants, + getCommonStepProperties, + detectVariantIndex, + validateStep, +} from './schemaUtils.mjs'; +import FieldEditor from './FieldEditor.mjs'; +import { StatusBar, JsonPreview, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; + +/** + * Step type selector + */ +const StepTypeSelector = ({ onSelect, onCancel }) => { + const stepTypes = getStepTypes(); + + const items = stepTypes.map((type) => { + const info = getStepTypeInfo(type); + return { + label: type, + description: info.description, + value: type, + }; + }); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + } + }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select Step Type:') + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => onSelect(item.value), + }), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to cancel)' + ) + ); +}; + +/** + * Schema variant selector for step types with anyOf + */ +const VariantSelector = ({ stepType, currentValue, onSelect, onCancel }) => { + const variants = getStepTypeVariants(stepType); + const currentIndex = detectVariantIndex(currentValue, variants); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + } + }); + + // Must have at least one variant to show selector + if (!variants || variants.length === 0) { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(Text, { color: 'yellow' }, `No variants found for ${stepType}. Press Esc to go back.`) + ); + } + + const items = variants.map((variant, index) => ({ + label: `${variant.title}${variant.type ? ` (${variant.type})` : ''}`, + value: `variant_${index}`, + key: `variant_${index}`, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, `Select ${stepType} format:`) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'This step type supports multiple formats. Choose one:' + ) + ), + React.createElement(SelectInput, { + items, + initialIndex: currentIndex, + onSelect: (item) => { + const index = parseInt(item.value.replace('variant_', ''), 10); + onSelect(index, variants[index]); + }, + }), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to cancel)' + ) + ); +}; + +/** + * Step editor - edit step fields + */ +const StepEditor = ({ + step, + stepIndex, + onChange, + onSave, + onCancel, + onDelete, +}) => { + const [view, setView] = useState('menu'); // 'menu', 'editField', 'addField', 'preview', 'selectType', 'selectVariant' + const [editingField, setEditingField] = useState(null); + const [localStep, setLocalStep] = useState(step); + const [pendingStepType, setPendingStepType] = useState(null); // For step type selection flow + + // Determine step type + const stepType = useMemo(() => { + const types = getStepTypes(); + return types.find((t) => localStep[t] !== undefined) || null; + }, [localStep]); + + // Get step value (could be string, number, boolean, or object) + const stepValue = stepType ? localStep[stepType] : null; + const valueType = typeof stepValue; + const isSimpleForm = valueType === 'string' || valueType === 'number' || valueType === 'boolean'; + + // Get variants for current step type + const variants = useMemo(() => { + if (!stepType) return []; + return getStepTypeVariants(stepType); + }, [stepType]); + + // Determine current variant + const currentVariantIndex = useMemo(() => { + if (variants.length === 0) return -1; + return detectVariantIndex(stepValue, variants); + }, [stepValue, variants]); + + const currentVariant = variants[currentVariantIndex] || null; + + // Get fields for this step type + const { fields: typeFields } = useMemo(() => { + if (!stepType) return { fields: [] }; + return getStepTypeFields(stepType); + }, [stepType]); + + // Get common step properties + const commonProps = getCommonStepProperties(); + + // Build current field values for menu + const currentFields = useMemo(() => { + const result = []; + + // Add step type value + if (stepType) { + if (isSimpleForm) { + result.push({ + name: stepType, + value: stepValue, + type: 'simple', + description: `The ${stepType} value`, + }); + } else if (typeof stepValue === 'object' && stepValue !== null) { + // Add object fields + Object.entries(stepValue).forEach(([key, val]) => { + const fieldDef = typeFields.find((f) => f.name === key); + result.push({ + name: `${stepType}.${key}`, + value: val, + type: fieldDef?.type || typeof val, + description: fieldDef?.description || '', + enum: fieldDef?.enum, + pattern: fieldDef?.pattern, + }); + }); + } + } + + // Add common step properties that are set (excluding internal metadata like sourceLocation) + Object.entries(localStep).forEach(([key, val]) => { + if (key !== stepType && key !== 'sourceLocation' && commonProps[key]) { + result.push({ + name: key, + value: val, + type: commonProps[key].type, + description: commonProps[key].description, + enum: commonProps[key].enum, + pattern: commonProps[key].pattern, + }); + } + }); + + return result; + }, [localStep, stepType, stepValue, isSimpleForm, typeFields, commonProps]); + + // Validation + const validation = useMemo(() => { + if (!stepType) return { valid: false, errors: 'No step type selected' }; + return validateStep(localStep); + }, [localStep, stepType]); + + // Handle escape - go back from any sub-view, or cancel from main menu + useInput((input, key) => { + if (key.escape) { + if (view === 'menu') { + onCancel(); + } else if (view === 'selectType' || view === 'selectVariant') { + onCancel(); + } else { + setView('menu'); + setEditingField(null); + } + } + }); + + // Select variant view (for step types with anyOf) - check this BEFORE selectType + if (view === 'selectVariant' && pendingStepType) { + const type = pendingStepType; + const typeVariants = getStepTypeVariants(type); + + // Safety check - if no variants, go back to menu + if (typeVariants.length === 0) { + // Preserve sourceLocation when changing step type + const newStep = { [type]: {}, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; + setLocalStep(newStep); + setPendingStepType(null); + setView('menu'); + return null; + } + + return React.createElement(VariantSelector, { + stepType: type, + currentValue: null, + onSelect: (variantIndex, variant) => { + // Safety check for variant + if (!variant) { + // Preserve sourceLocation when changing step type + const newStep = { [type]: '', ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; + setLocalStep(newStep); + setPendingStepType(null); + setView('menu'); + return; + } + + // Create step value based on selected variant + let newValue; + if (variant.type === 'string') { + newValue = ''; + } else if (variant.type === 'number' || variant.type === 'integer') { + newValue = variant.schema?.default !== undefined ? variant.schema.default : 0; + } else if (variant.type === 'boolean') { + newValue = variant.schema?.default !== undefined ? variant.schema.default : false; + } else if (variant.type === 'object') { + // Create object with required fields + newValue = {}; + const required = variant.schema?.required || []; + if (variant.schema?.properties) { + Object.entries(variant.schema.properties).forEach(([key, prop]) => { + if (required.includes(key)) { + if (prop.default !== undefined) { + newValue[key] = prop.default; + } else if (prop.type === 'string') { + newValue[key] = ''; + } else if (prop.type === 'number' || prop.type === 'integer') { + newValue[key] = 0; + } else if (prop.type === 'boolean') { + newValue[key] = false; + } else if (prop.type === 'array') { + newValue[key] = []; + } else if (prop.type === 'object') { + newValue[key] = {}; + } + } + }); + } + } else { + newValue = ''; + } + + // Preserve sourceLocation when changing step type + const newStep = { [type]: newValue, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; + setLocalStep(newStep); + setPendingStepType(null); + setView('menu'); + }, + onCancel: () => { + setPendingStepType(null); + setView('selectType'); + }, + }); + } + + // Select step type view + if (view === 'selectType' || !stepType) { + return React.createElement(StepTypeSelector, { + onSelect: (type) => { + // Check if this step type has variants + const typeVariants = getStepTypeVariants(type); + if (typeVariants.length > 1) { + // Show variant selector + setPendingStepType(type); + setView('selectVariant'); + } else if (typeVariants.length === 1) { + // Only one variant, use it directly + const variant = typeVariants[0]; + let defaultValue; + if (variant.type === 'string') { + defaultValue = ''; + } else if (variant.type === 'number' || variant.type === 'integer') { + defaultValue = variant.schema?.default !== undefined ? variant.schema.default : 0; + } else if (variant.type === 'boolean') { + defaultValue = variant.schema?.default !== undefined ? variant.schema.default : false; + } else { + defaultValue = {}; + } + // Preserve sourceLocation when changing step type + const newStep = { [type]: defaultValue, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; + setLocalStep(newStep); + setView('menu'); + } else { + // No variants, default to empty object + // Preserve sourceLocation when changing step type + const newStep = { [type]: {}, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; + setLocalStep(newStep); + setView('menu'); + } + }, + onCancel, + }); + } + + // Edit field view + if (view === 'editField' && editingField) { + // Determine field definition + let fieldDef = null; + let currentValue = null; + + if (editingField === stepType) { + // Editing simple form value + fieldDef = { + name: stepType, + type: 'string', + description: getStepTypeInfo(stepType).description, + ...typeFields.find((f) => f.name === '_simpleValue' || f.formType === 'simple'), + }; + currentValue = stepValue; + } else if (editingField.startsWith(stepType + '.')) { + // Editing object property + const propName = editingField.replace(stepType + '.', ''); + fieldDef = typeFields.find((f) => f.name === propName) || { + name: propName, + type: 'string', + description: '', + }; + currentValue = stepValue?.[propName]; + } else if (commonProps[editingField]) { + // Editing common property + const prop = commonProps[editingField]; + fieldDef = { + name: editingField, + type: prop.type, + description: prop.description, + default: prop.default, + enum: prop.enum, + pattern: prop.pattern, + }; + currentValue = localStep[editingField]; + } + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType, editingField], + validationStatus: validation.valid, + }), + React.createElement(FieldEditor, { + field: fieldDef, + value: currentValue, + onChange: (newValue) => { + // Update the step + const newStep = { ...localStep }; + + if (editingField === stepType) { + // Simple form + newStep[stepType] = newValue; + } else if (editingField.startsWith(stepType + '.')) { + // Object property + const propName = editingField.replace(stepType + '.', ''); + if (typeof newStep[stepType] !== 'object') { + newStep[stepType] = {}; + } + newStep[stepType] = { ...newStep[stepType], [propName]: newValue }; + } else { + // Common property + newStep[editingField] = newValue; + } + + setLocalStep(newStep); + }, + onSubmit: () => setView('menu'), + onCancel: () => setView('menu'), + }) + ); + } + + // Add field view + if (view === 'addField') { + // Get available fields that aren't already set + const availableFields = []; + + // Type-specific fields (for object form) + if (!isSimpleForm) { + typeFields + .filter((f) => !f.name.startsWith('_') && f.formType !== 'simple') + .forEach((f) => { + const fullName = `${stepType}.${f.name}`; + if (!currentFields.find((cf) => cf.name === fullName)) { + availableFields.push({ + label: `${f.name}${f.required ? ' (required)' : ''}`, + description: f.description || '', + value: fullName, + }); + } + }); + } + + // Common properties + Object.entries(commonProps).forEach(([key, prop]) => { + if (key !== '$schema' && !currentFields.find((cf) => cf.name === key)) { + availableFields.push({ + label: key, + description: prop.description || '', + value: key, + }); + } + }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType, 'Add Field'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select field to add:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(ScrollableSelect, { + items: availableFields, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + setEditingField(item.value); + setView('editField'); + }, + }) + ); + } + + // Preview view + if (view === 'preview') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType, 'Preview'], + validationStatus: validation.valid, + }), + React.createElement(JsonPreview, { + data: localStep, + title: 'Step Preview', + }), + !validation.valid && + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(Text, { color: 'red' }, 'Validation errors: ' + validation.errors) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => setView('menu'), + }) + ) + ); + } + + // Main menu view + const menuItems = []; + let menuIndex = 0; + + // Show current format info if variants exist + if (variants.length > 1 && currentVariant) { + menuItems.push({ + label: `📋 Format: ${currentVariant.title}`, + value: `none_${menuIndex++}`, + }); + } + + // Current fields + currentFields.forEach((field) => { + const displayValue = + typeof field.value === 'object' + ? JSON.stringify(field.value).substring(0, 30) + : String(field.value).substring(0, 30); + menuItems.push({ + label: `✏️ ${field.name}: ${displayValue}${String(field.value).length > 30 ? '...' : ''}`, + value: `edit:${field.name}`, + }); + }); + + // Add separator + if (menuItems.length > 0) { + menuItems.push({ label: '─────── Actions ────────', value: `none_${menuIndex++}` }); + } + + // Actions + menuItems.push({ label: '➕ Add field', value: 'add' }); + menuItems.push({ label: '🔍 Preview JSON', value: 'preview' }); + menuItems.push({ label: '🔄 Change step type', value: 'changeType' }); + + if (currentFields.length > 0) { + menuItems.push({ label: '🗑️ Delete field...', value: 'deleteField' }); + } + + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); + + if (validation.valid) { + menuItems.push({ label: '💾 Save step', value: 'save' }); + } else { + menuItems.push({ + label: '⚠️ Fix errors before saving', + value: `none_${menuIndex++}`, + }); + } + + menuItems.push({ label: '🗑️ Delete step', value: 'delete' }); + menuItems.push({ label: '← Back (discard changes)', value: 'cancel' }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType], + validationStatus: validation.valid, + hint: 'Use ↑↓ to navigate, Enter to select', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Edit Step: '), + React.createElement(Text, { color: 'white' }, stepType) + ), + !validation.valid && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + '⚠️ Step has validation errors' + ) + ), + React.createElement(SelectInput, { + items: menuItems, + onSelect: (item) => { + const value = item.value; + + // Handle edit action (format: "edit:fieldName") + if (value.startsWith('edit:')) { + const field = value.substring(5); + setEditingField(field); + setView('editField'); + return; + } + + // Handle other actions + switch (value) { + case 'add': + setView('addField'); + break; + case 'preview': + setView('preview'); + break; + case 'switchVariant': + setView('selectVariant'); + break; + case 'changeType': + setView('selectType'); + break; + case 'deleteField': + // TODO: Implement delete field submenu + break; + case 'save': + onSave(localStep); + break; + case 'delete': + onDelete(); + break; + case 'cancel': + onCancel(); + break; + // Ignore 'none_*' values + } + }, + }) + ); +}; + +export default StepEditor; diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs new file mode 100644 index 0000000..3efad24 --- /dev/null +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -0,0 +1,1406 @@ +/** + * Main test builder orchestrator (ESM version) + */ + +import React from 'react'; +const { useState, useMemo, useEffect } = React; +import { Box, Text, useInput, useApp } from 'ink'; +import SelectInput from 'ink-select-input'; +import * as fs from 'fs'; +import * as path from 'path'; +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const yaml = require('js-yaml'); +const { analyzeDocument } = require('doc-detective-resolver'); +import { + createDefaultSpec, + createDefaultTest, + validateSpec, + getSpecFields, +} from './schemaUtils.mjs'; +import TestEditor from './TestEditor.mjs'; +import FieldEditor from './FieldEditor.mjs'; +import DebugRunner from './DebugRunner.mjs'; +import { StatusBar, JsonPreview, SimpleTextInput, LabeledTextInput, ConfirmPrompt, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; + +// Import source file utilities for inline test handling +const { + hasInlineSourceLocations, + getInlineSourceFiles, + hasSourceFileChanged, + getFileContentHash, + serializeStepToInline, + serializeTestToInline, + batchUpdateSourceContent, + prepareSourceUpdates, + hasAutoDetectedSteps, +} = require('./sourceFileUtils.js'); + +/** + * Check if AI integrations are available via environment variables or config file. + * @returns {boolean} True if at least one AI integration is configured + */ +const hasAiIntegration = () => { + // Check environment variables + if (process.env.ANTHROPIC_API_KEY) return true; + if (process.env.OPENAI_API_KEY) return true; + if (process.env.GOOGLE_GENERATIVE_AI_API_KEY) return true; + + // Try to load config file and check for integrations + const configPaths = [ + path.resolve(process.cwd(), '.doc-detective.json'), + path.resolve(process.cwd(), '.doc-detective.yaml'), + path.resolve(process.cwd(), '.doc-detective.yml'), + ]; + + for (const configPath of configPaths) { + if (fs.existsSync(configPath)) { + try { + const content = fs.readFileSync(configPath, 'utf-8'); + const ext = path.extname(configPath).toLowerCase(); + const config = ext === '.json' ? JSON.parse(content) : yaml.load(content); + + if (config?.integrations) { + const { anthropic, openAi, google, ollama } = config.integrations; + if (anthropic?.apiKey) return true; + if (openAi?.apiKey) return true; + if (google?.apiKey) return true; + if (ollama?.baseUrl || ollama) return true; // Ollama doesn't need API key + } + } catch { + // Ignore config parsing errors + } + } + } + + return false; +}; + +/** + * Determine the output file path based on input file and extension + * @param {string|null} inputFilePath - Original input file path + * @param {string|null} inputFileExtension - Original file extension + * @param {string} specName - Spec name for new files + * @param {string} outputDir - Default output directory + * @param {string|null} contentPath - The spec's contentPath (for markdown files with inline tests) + * @returns {string} The computed output file path + */ +function computeOutputPath(inputFilePath, inputFileExtension, specName, outputDir, contentPath = null) { + if (inputFilePath) { + const ext = inputFileExtension?.toLowerCase() || path.extname(inputFilePath).toLowerCase(); + + // For JSON or YAML files, overwrite the original + if (ext === '.json' || ext === '.yaml' || ext === '.yml') { + return inputFilePath; + } + + // For markdown files with contentPath (inline tests), use the original file + // The contentPath indicates the spec was extracted from markdown with inline tests + if (contentPath) { + return inputFilePath; + } + + // For other formats (e.g., .md without inline tests), save as .spec.json in the same directory + const dir = path.dirname(inputFilePath); + const baseName = path.basename(inputFilePath, ext); + return path.join(dir, `${baseName}.spec.json`); + } + + // New file - use specName in outputDir + const safeName = specName.replace(/[^a-zA-Z0-9-_]/g, '-') || 'untitled'; + return path.join(outputDir, `${safeName}.spec.json`); +} + +/** + * Determine the output format based on file extension + * @param {string} filePath - The output file path + * @returns {'json'|'yaml'} The format to use + */ +function getOutputFormat(filePath) { + const ext = path.extname(filePath).toLowerCase(); + if (ext === '.yaml' || ext === '.yml') { + return 'yaml'; + } + return 'json'; +} + +/** + * Serialize spec to the appropriate format + * @param {Object} spec - The spec object + * @param {'json'|'yaml'} format - The output format + * @returns {string} Serialized content + */ +function serializeSpec(spec, format) { + if (format === 'yaml') { + return yaml.dump(spec, { + indent: 2, + lineWidth: -1, + noRefs: true, + quotingType: '"', + }); + } + return JSON.stringify(spec, null, 2); +} + +/** + * Main TestBuilder component + * @param {Object} props + * @param {Object|null} props.initialSpec - Initial spec to edit (optional) + * @param {string|null} props.inputFilePath - Path to the input file (for saving) + * @param {string|null} props.inputFileExtension - Original file extension + * @param {boolean} props.isValid - Whether the initial spec passed validation + * @param {string|null} props.validationErrors - Validation error message if invalid + * @param {string} props.outputDir - Output directory for new specs + * @param {Function|null} props.onBack - Callback to navigate back to spec selector (optional) + */ +const TestBuilder = ({ + initialSpec = null, + inputFilePath = null, + inputFileExtension = null, + isValid = true, + validationErrors = null, + outputDir = process.cwd(), + onBack = null, +}) => { + const { exit } = useApp(); + + // Determine if we're editing an existing file + const isEditing = initialSpec !== null && inputFilePath !== null; + + // Derive initial spec name from initialSpec.specId or filename + const deriveSpecName = () => { + if (initialSpec?.specId) { + return initialSpec.specId; + } + if (inputFilePath) { + const ext = path.extname(inputFilePath); + return path.basename(inputFilePath, ext); + } + return ''; + }; + + // State + const [phase, setPhase] = useState(isEditing ? 'menu' : 'name'); // Skip 'name' phase when editing + const [specName, setSpecName] = useState(deriveSpecName()); + const [spec, setSpec] = useState(initialSpec || createDefaultSpec()); + const [editingTestIndex, setEditingTestIndex] = useState(null); + const [editingField, setEditingField] = useState(null); + const [debugTestIndex, setDebugTestIndex] = useState(null); + const [saveDir, setSaveDir] = useState(outputDir); + const [showValidationWarning, setShowValidationWarning] = useState(!isValid && isEditing); + + // Inline source tracking state + const [sourceFileHashes, setSourceFileHashes] = useState(() => { + // Compute initial hashes for all inline source files + const hashes = {}; + if (initialSpec) { + const inlineFiles = getInlineSourceFiles(initialSpec); + for (const file of inlineFiles) { + const hash = getFileContentHash(file); + if (hash) { + hashes[file] = hash; + } + } + } + return hashes; + }); + const [changedSourceFiles, setChangedSourceFiles] = useState([]); + const [inlineUpdateError, setInlineUpdateError] = useState(null); + + // State for analyze feature + const [analyzeError, setAnalyzeError] = useState(null); + const [analyzedSpec, setAnalyzedSpec] = useState(null); + + // Track original spec for detecting which steps were modified + const [originalSpec] = useState(() => initialSpec ? JSON.parse(JSON.stringify(initialSpec)) : null); + + // Track if there are unsaved changes + const hasUnsavedChanges = useMemo(() => { + const currentJson = JSON.stringify(spec); + const originalJson = originalSpec ? JSON.stringify(originalSpec) : JSON.stringify(createDefaultSpec()); + return currentJson !== originalJson; + }, [spec, originalSpec]); + + // Check if spec has inline source locations (either via sourceLocation.isInline or via contentPath) + // contentPath indicates the spec was extracted from a markdown file with inline tests + const hasInlineSources = useMemo(() => { + return hasInlineSourceLocations(spec) || !!spec.contentPath; + }, [spec]); + + // Check if spec has auto-detected steps + const hasAutoDetected = useMemo(() => hasAutoDetectedSteps(spec), [spec]); + + // Check if AI integrations are available + const hasAiConfig = useMemo(() => hasAiIntegration(), []); + + // Check if spec has a source file that can be analyzed + const hasSourceFile = useMemo(() => { + return !!(inputFilePath || spec.contentPath || spec.sourcePath); + }, [inputFilePath, spec]); + + // Get the source file path for analysis + const sourceFilePath = useMemo(() => { + return inputFilePath || spec.contentPath || spec.sourcePath || null; + }, [inputFilePath, spec]); + + // Get spec fields + const { fields: specFields } = useMemo(() => getSpecFields(), []); + + // Validation - wrap in try-catch since validateSpec can throw for invalid specs + const validation = useMemo(() => { + try { + return validateSpec(spec); + } catch (err) { + return { valid: false, errors: err.message, object: spec }; + } + }, [spec]); + + // Get file path - use computed path for existing files, or generate new path + // Pass the spec's contentPath to determine if this is a markdown file with inline tests + const filePath = useMemo(() => { + return computeOutputPath(inputFilePath, inputFileExtension, specName, saveDir, spec.contentPath); + }, [inputFilePath, inputFileExtension, specName, saveDir, spec.contentPath]); + + // Get output format + const outputFormat = useMemo(() => getOutputFormat(filePath), [filePath]); + + // Handle escape - exit from name phase, go back from sub-views + useInput((input, key) => { + if (key.escape) { + if (phase === 'name') { + exit(); + } else if (phase === 'menu') { + // Do nothing on menu, use Exit option + } else { + setPhase('menu'); + setEditingTestIndex(null); + setEditingField(null); + } + } + }); + + // Pre-save check for inline sources - handled by useEffect to avoid state updates during render + // NOTE: All useEffect hooks must be called before any conditional returns to maintain hook order + useEffect(() => { + if (phase !== 'preSave') return; + + // Check if any inline source files have changed + const changed = Array.from(getInlineSourceFiles(spec)).filter( + file => sourceFileHashes[file] && hasSourceFileChanged(file, sourceFileHashes[file]) + ); + + // Determine the next phase + const nextPhase = changed.length > 0 + ? 'sourceChanged' + : (hasInlineSources ? 'inlineSaveChoice' : 'save'); + + // Only update if changed files differ from current + const changedFilesMatch = + changed.length === changedSourceFiles.length && + changed.every((file, i) => changedSourceFiles[i] === file); + + if (!changedFilesMatch) { + setChangedSourceFiles(changed); + } + setPhase(nextPhase); + }, [phase, spec, sourceFileHashes, hasInlineSources, changedSourceFiles]); + + // Effect to handle inline source updates when phase changes to 'inlineUpdate' + useEffect(() => { + if (phase !== 'inlineUpdate') { + return; + } + + let cancelled = false; + + const performInlineUpdate = async () => { + // Use prepareSourceUpdates to handle both explicit inline steps and auto-detected steps + // Auto-detected steps will have new explicit comments inserted after the original content + const updatesByFile = prepareSourceUpdates({ spec, originalSpec }); + + // Apply updates to each file + const errors = []; + for (const [file, updates] of updatesByFile) { + if (cancelled) return; + const result = batchUpdateSourceContent({ filePath: file, updates }); + if (!result.success) { + errors.push(`${path.basename(file)}: ${result.error || 'Unknown error'}`); + } + } + + if (cancelled) return; + + if (errors.length > 0) { + setInlineUpdateError(errors.join('\n')); + setPhase('inlineUpdateError'); + } else { + // Update hashes for modified files + const newHashes = { ...sourceFileHashes }; + for (const file of updatesByFile.keys()) { + const hash = getFileContentHash(file); + if (hash) { + newHashes[file] = hash; + } + } + setSourceFileHashes(newHashes); + setPhase('inlineUpdateSuccess'); + } + }; + + performInlineUpdate(); + + return () => { + cancelled = true; + }; + }, [phase, spec, originalSpec, sourceFileHashes]); + + // Effect to handle AI analysis when phase changes to 'analyzing' + useEffect(() => { + if (phase !== 'analyzing') return; + + let cancelled = false; + + const performAnalysis = async () => { + try { + if (!sourceFilePath) { + throw new Error('No source file found. The spec must have an input file or contentPath to analyze.'); + } + + // Check if file exists and read content + if (!fs.existsSync(sourceFilePath)) { + throw new Error(`Source file not found: ${sourceFilePath}`); + } + + const content = fs.readFileSync(sourceFilePath, 'utf-8'); + + if (!content || content.trim().length === 0) { + throw new Error('Source file is empty.'); + } + + // Call analyzeDocument with the content + const result = await analyzeDocument({ + content, + filePath: sourceFilePath, + }); + + if (cancelled) return; + + setAnalyzedSpec(result); + setPhase('analyzePreview'); + } catch (error) { + if (cancelled) return; + setAnalyzeError(error.message); + setPhase('analyzeError'); + } + }; + + performAnalysis(); + + return () => { + cancelled = true; + }; + }, [phase, sourceFilePath]); + + // Show validation warning for invalid loaded specs + if (showValidationWarning) { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'yellow' }, '⚠️ Validation Warning') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'The loaded specification has validation issues:') + ), + React.createElement( + Box, + { marginBottom: 1, marginLeft: 2 }, + React.createElement(Text, { color: 'yellow' }, validationErrors || 'Unknown validation errors') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'You can still edit the specification, but you may need to fix these issues before saving.') + ), + React.createElement(SelectInput, { + items: [ + { label: 'Continue editing', value: 'continue' }, + { label: 'Exit', value: 'exit' }, + ], + onSelect: (item) => { + if (item.value === 'exit') { + exit(); + } else { + setShowValidationWarning(false); + } + }, + }) + ); + } + + // Name input phase + if (phase === 'name') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🔧 Doc Detective Test Builder') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Create a new test specification step by step.') + ), + React.createElement(LabeledTextInput, { + label: 'Spec name', + value: specName, + placeholder: 'my-tests', + onChange: setSpecName, + onSubmit: () => { + if (specName.trim()) { + // Initialize spec with specId + setSpec({ + ...spec, + specId: specName, + }); + setPhase('menu'); + } + }, + }), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Will be saved as: ' + filePath + ) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Press Enter to continue, Esc to exit' + ) + ) + ); + } + + // Edit test view + if (phase === 'editTest' && editingTestIndex !== null) { + const currentTest = spec.tests?.[editingTestIndex] || createDefaultTest(); + + return React.createElement(TestEditor, { + test: currentTest, + testIndex: editingTestIndex, + onChange: (updatedTest) => { + const newTests = [...(spec.tests || [])]; + newTests[editingTestIndex] = updatedTest; + setSpec({ ...spec, tests: newTests }); + }, + onSave: (updatedTest) => { + const newTests = [...(spec.tests || [])]; + newTests[editingTestIndex] = updatedTest; + setSpec({ ...spec, tests: newTests }); + setPhase('menu'); + setEditingTestIndex(null); + }, + onCancel: () => { + setPhase('menu'); + setEditingTestIndex(null); + }, + onDelete: () => { + const newTests = [...(spec.tests || [])]; + newTests.splice(editingTestIndex, 1); + setSpec({ ...spec, tests: newTests }); + setPhase('menu'); + setEditingTestIndex(null); + }, + }); + } + + // Add test view + if (phase === 'addTest') { + const newTest = createDefaultTest(); + + return React.createElement(TestEditor, { + test: newTest, + testIndex: (spec.tests || []).length, + onChange: () => {}, + onSave: (newTest) => { + const newTests = [...(spec.tests || []), newTest]; + setSpec({ ...spec, tests: newTests }); + setPhase('menu'); + }, + onCancel: () => setPhase('menu'), + onDelete: () => setPhase('menu'), + }); + } + + // Select test to debug + if (phase === 'selectDebugTest') { + const runnableTests = (spec.tests || []) + .map((test, index) => ({ test, index })) + .filter(({ test }) => (test.steps || []).length > 0); + + const items = runnableTests.map(({ test, index }) => { + const description = test.description || `Test ${index + 1}`; + const stepCount = (test.steps || []).length; + return { + label: `${index + 1}. ${description.substring(0, 40)}${description.length > 40 ? '...' : ''} (${stepCount} steps)`, + value: index, + }; + }); + + items.push({ label: '← Back', value: 'back' }); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName, 'Select Test to Debug'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🚀 Select Test to Debug') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Choose a test to run step-by-step with a visible browser:' + ) + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => { + if (item.value === 'back') { + setPhase('menu'); + } else { + setDebugTestIndex(item.value); + setPhase('debugRun'); + } + }, + }) + ); + } + + // Debug run phase + if (phase === 'debugRun' && debugTestIndex !== null) { + const testToDebug = spec.tests?.[debugTestIndex]; + + if (!testToDebug) { + setPhase('menu'); + setDebugTestIndex(null); + return null; + } + + return React.createElement(DebugRunner, { + test: testToDebug, + testIndex: debugTestIndex, + onComplete: (updatedTest) => { + // Update the test with any changes made during debugging + const newTests = [...(spec.tests || [])]; + newTests[debugTestIndex] = updatedTest; + setSpec({ ...spec, tests: newTests }); + setDebugTestIndex(null); + setPhase('menu'); + }, + onCancel: () => { + setDebugTestIndex(null); + setPhase('menu'); + }, + }); + } + + // Edit spec metadata field + if (phase === 'editMeta' && editingField) { + const fieldDef = specFields.find((f) => f.name === editingField); + const currentValue = spec[editingField]; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, editingField], + validationStatus: validation.valid, + }), + React.createElement(FieldEditor, { + field: fieldDef, + value: currentValue, + onChange: (newValue) => { + setSpec({ ...spec, [editingField]: newValue }); + }, + onSubmit: () => setPhase('menu'), + onCancel: () => setPhase('menu'), + }) + ); + } + + // Add spec metadata field + if (phase === 'addMeta') { + const availableFields = specFields.filter((f) => { + if (f.name === 'tests') return false; + if (f.name === '$schema') return false; + return spec[f.name] === undefined; + }); + + const items = availableFields.map((f) => ({ + label: `${f.name}${f.required ? ' (required)' : ''}`, + description: f.description || '', + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, 'Add Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select property to add:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + setEditingField(item.value); + setPhase('editMeta'); + }, + }) + ); + } + + // Delete spec metadata field + if (phase === 'deleteMeta') { + const deletableFields = specFields.filter((f) => { + if (f.name === 'tests') return false; + if (f.name === '$schema') return false; + if (f.required) return false; + return spec[f.name] !== undefined; + }); + + const items = deletableFields.map((f) => ({ + label: `🗑️ ${f.name}: ${String(spec[f.name]).substring(0, 30)}`, + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, 'Delete Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, 'Select property to delete:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => { + const newSpec = { ...spec }; + delete newSpec[item.value]; + setSpec(newSpec); + setPhase('menu'); + }, + }) + ); + } + + // Preview view + if (phase === 'preview') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, 'Preview'], + validationStatus: validation.valid, + }), + React.createElement(JsonPreview, { + data: spec, + title: `Specification Preview (${outputFormat.toUpperCase()})`, + }), + !validation.valid && + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(Text, { color: 'red' }, 'Validation errors: ' + validation.errors) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => setPhase('menu'), + }) + ) + ); + } + + if (phase === 'preSave') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(Text, { color: 'cyan' }, 'Checking source files...') + ); + } + + // Source files changed warning + if (phase === 'sourceChanged') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'yellow' }, '⚠️ Source Files Changed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'The following source files have been modified since they were loaded:') + ), + ...changedSourceFiles.map((file, i) => + React.createElement( + Box, + { key: i, marginLeft: 2, marginBottom: 0 }, + React.createElement(Text, { color: 'yellow' }, `• ${path.basename(file)}`) + ) + ), + React.createElement( + Box, + { marginTop: 1, marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'Updating inline sources may cause conflicts. You can save as a separate .spec.json file instead.') + ), + React.createElement(SelectInput, { + items: [ + { label: '📁 Save as .spec.json (recommended)', value: 'saveAsSpec' }, + { label: '⚠️ Update source files anyway', value: 'updateSources' }, + { label: '← Cancel', value: 'cancel' }, + ], + onSelect: (item) => { + if (item.value === 'saveAsSpec') { + setPhase('save'); + } else if (item.value === 'updateSources') { + setPhase('inlineUpdate'); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Choice between updating inline sources or saving as spec + if (phase === 'inlineSaveChoice') { + const inlineFiles = Array.from(getInlineSourceFiles(spec)); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '📝 Inline Sources Detected') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'This spec contains inline tests from:') + ), + ...inlineFiles.map((file, i) => + React.createElement( + Box, + { key: i, marginLeft: 2, marginBottom: 0 }, + React.createElement(Text, { color: 'gray' }, `• ${path.basename(file)}`) + ) + ), + // Show note about auto-detected steps if present + hasAutoDetected && React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + '⚠️ Some steps were auto-detected from markup. If edited, explicit comments will be added after the original content.' + ) + ), + React.createElement( + Box, + { marginTop: 1, marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'How would you like to save changes?') + ), + React.createElement(SelectInput, { + items: [ + { label: '✏️ Update source files (preserve inline tests)', value: 'updateSources' }, + { label: '📁 Save as .spec.json (separate file)', value: 'saveAsSpec' }, + { label: '← Cancel', value: 'cancel' }, + ], + onSelect: (item) => { + if (item.value === 'updateSources') { + setPhase('inlineUpdate'); + } else if (item.value === 'saveAsSpec') { + setPhase('save'); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Update inline sources - render only, no side effects + if (phase === 'inlineUpdate') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(Text, { color: 'cyan' }, 'Updating source files...') + ); + } + + // Inline update error + if (phase === 'inlineUpdateError') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, '❌ Error Updating Source Files') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red' }, inlineUpdateError) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'You can still save as a separate .spec.json file.') + ), + React.createElement(SelectInput, { + items: [ + { label: '📁 Save as .spec.json instead', value: 'saveAsSpec' }, + { label: '← Back to menu', value: 'menu' }, + ], + onSelect: (item) => { + setInlineUpdateError(null); + if (item.value === 'saveAsSpec') { + setPhase('save'); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Inline update success + if (phase === 'inlineUpdateSuccess') { + const updatedFiles = Array.from(getInlineSourceFiles(spec)); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'green', bold: true }, '✅ Source files updated successfully!') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Updated files:') + ), + ...updatedFiles.map((file, i) => + React.createElement( + Box, + { key: i, marginLeft: 2, marginBottom: 0 }, + React.createElement(Text, { color: 'green' }, `✓ ${path.basename(file)}`) + ) + ), + React.createElement(SelectInput, { + items: [ + { label: 'Continue editing', value: 'continue' }, + { label: 'Exit', value: 'exit' }, + ], + onSelect: (item) => { + if (item.value === 'exit') { + exit(); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Analyzing view - show loading state during AI analysis + if (phase === 'analyzing') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'Spec'), 'Analyze'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '✨ Analyzing Documentation...') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'Using AI to generate test specifications based on the source documentation.') + ), + React.createElement( + Text, + { color: 'yellow' }, + '⏳ This may take a moment...' + ) + ); + } + + // Analyze error view + if (phase === 'analyzeError') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'Spec'), 'Analyze Error'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, '❌ Analysis Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red' }, analyzeError) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Make sure you have configured an AI integration (Anthropic, OpenAI, Google, or Ollama) in your Doc Detective config or via environment variables.' + ) + ), + React.createElement(SelectInput, { + items: [{ label: '← Back to menu', value: 'back' }], + onSelect: () => { + setAnalyzeError(null); + setPhase('menu'); + }, + }) + ); + } + + // Analyze preview view - show the generated spec and allow user to apply or discard + if (phase === 'analyzePreview') { + const newTestsCount = analyzedSpec?.tests?.length || 0; + const currentTestsCount = spec.tests?.length || 0; + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'Spec'), 'Analyze Results'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'green' }, '✨ Analysis Complete!') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + null, + `Generated ${newTestsCount} test(s) (current spec has ${currentTestsCount} test(s))` + ) + ), + React.createElement(JsonPreview, { + data: analyzedSpec, + title: 'Generated Specification', + }), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [ + { label: '✅ Replace tests with generated tests', value: 'replace' }, + { label: '🔀 Merge (keep existing + add new tests)', value: 'merge' }, + { label: '← Discard and go back', value: 'discard' }, + ], + onSelect: (item) => { + if (item.value === 'replace') { + // Replace tests with analyzed version + setSpec({ ...spec, tests: analyzedSpec?.tests || [] }); + setAnalyzedSpec(null); + setPhase('menu'); + } else if (item.value === 'merge') { + // Merge tests: keep existing tests and add new ones + const mergedTests = [ + ...(spec.tests || []), + ...(analyzedSpec?.tests || []), + ]; + setSpec({ ...spec, tests: mergedTests }); + setAnalyzedSpec(null); + setPhase('menu'); + } else { + // Discard + setAnalyzedSpec(null); + setPhase('menu'); + } + }, + }) + ) + ); + } + + // Save confirmation + if (phase === 'save') { + const isOverwrite = inputFilePath && (inputFileExtension === '.json' || inputFileExtension === '.yaml' || inputFileExtension === '.yml'); + const saveMessage = isOverwrite + ? `Overwrite ${filePath}?` + : `Save spec to ${filePath}?`; + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, saveMessage) + ), + outputFormat === 'yaml' && React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Format: YAML') + ), + React.createElement(ConfirmPrompt, { + message: '', + onConfirm: () => { + try { + // Ensure directory exists + const dir = path.dirname(filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + + // Serialize and write + const content = serializeSpec(spec, outputFormat); + fs.writeFileSync(filePath, content); + setPhase('saved'); + } catch (err) { + // TODO: Handle error better + console.error('Failed to save:', err); + setPhase('menu'); + } + }, + onCancel: () => setPhase('menu'), + }) + ); + } + + // Saved confirmation + if (phase === 'saved') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'green', bold: true }, '✅ Specification saved successfully!') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'File: ' + filePath) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Format: ' + outputFormat.toUpperCase()) + ), + React.createElement(SelectInput, { + items: [ + { label: 'Continue editing', value: 'continue' }, + { label: 'Exit', value: 'exit' }, + ], + onSelect: (item) => { + if (item.value === 'exit') { + exit(); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Confirm exit with unsaved changes + if (phase === 'confirmExit') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'yellow' }, '⚠️ Unsaved Changes') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'You have unsaved changes. Are you sure you want to exit?') + ), + React.createElement(ConfirmPrompt, { + message: 'Discard changes and exit?', + onConfirm: () => exit(), + onCancel: () => setPhase('menu'), + }) + ); + } + + // Main menu view + const menuItems = []; + let menuIndex = 0; + + // Spec metadata section + menuItems.push({ + label: '📋 Spec Properties', + value: `none_${menuIndex++}`, + }); + + specFields + .filter((f) => f.name !== 'tests' && f.name !== '$schema' && spec[f.name] !== undefined) + .forEach((f) => { + const val = spec[f.name]; + const displayVal = typeof val === 'object' ? JSON.stringify(val).substring(0, 50) : String(val).substring(0, 50); + menuItems.push({ + label: ` ✏️ ${f.name}: ${displayVal}${String(val).length > 50 ? '...' : ''}`, + value: `editMeta:${f.name}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add property', + value: 'addMeta', + }); + menuItems.push({ + label: ' 🗑️ Delete property', + value: 'deleteMeta', + }); + + menuItems.push({ label: '─────── Tests ──────────', value: `none_${menuIndex++}` }); + + // Tests section + const tests = spec.tests || []; + menuItems.push({ + label: `📝 Tests (${tests.length})`, + value: `none_${menuIndex++}`, + }); + + tests.forEach((test, index) => { + const description = test.description || `Test ${index + 1}`; + const stepCount = (test.steps || []).length; + menuItems.push({ + label: ` ${index + 1}. ${description.substring(0, 30)}${description.length > 30 ? '...' : ''} (${stepCount} steps)`, + value: `editTest:${index}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add test', + value: 'addTest', + }); + + // Debug/run option - only show if there are tests with steps + const hasRunnableTests = tests.some((t) => (t.steps || []).length > 0); + if (hasRunnableTests) { + menuItems.push({ label: '─────── Debug ──────────', value: `none_${menuIndex++}` }); + menuItems.push({ + label: '🚀 Run and debug test', + value: 'debugTest', + }); + } + + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); + + // Actions + menuItems.push({ label: '🔍 Preview', value: 'preview' }); + + // Analyze option - show if spec has a source file + if (hasSourceFile) { + if (hasAiConfig) { + menuItems.push({ label: '✨ Analyze document', value: 'analyze' }); + } else { + menuItems.push({ + label: '✨ Analyze document (requires AI integration)', + value: `none_${menuIndex++}` + }); + } + } + + if (validation.valid && tests.length > 0) { + // Use different label based on whether spec has inline sources + let saveLabel; + if (hasInlineSources) { + saveLabel = '💾 Save changes'; + } else if (isEditing) { + saveLabel = '💾 Save (overwrite)'; + } else { + saveLabel = '💾 Save specification'; + } + menuItems.push({ label: saveLabel, value: 'save' }); + } else if (tests.length === 0) { + menuItems.push({ + label: '⚠️ Add at least one test to save', + value: `none_${menuIndex++}`, + }); + } else { + menuItems.push({ + label: '⚠️ Fix validation errors to save', + value: `none_${menuIndex++}`, + }); + } + + // Add back option if we came from spec selector + if (onBack) { + menuItems.push({ label: '◀️ Back to spec list', value: 'back' }); + } + + menuItems.push({ label: '🚪 Exit (discard changes)', value: 'exit' }); + + // Build header info + const headerInfo = isEditing + ? `Editing: ${path.basename(inputFilePath)}` + : (specName || 'Untitled'); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'New Spec')], + validationStatus: validation.valid, + hint: 'Use ↑↓ to navigate, Enter to select', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🔧 Test Builder: '), + React.createElement(Text, { color: 'white' }, headerInfo) + ), + React.createElement( + Box, + { flexDirection: 'column', marginBottom: 1 }, + // Show inline source info if spec has inline sources + hasInlineSources ? React.createElement( + Text, + { color: 'green', dimColor: true }, + `📝 Source: ${path.basename(inputFilePath || '')} (inline tests detected)` + ) : React.createElement( + Text, + { color: 'gray', dimColor: true }, + `Output: ${filePath} (${outputFormat.toUpperCase()})` + ) + ), + React.createElement(SelectInput, { + items: menuItems, + onSelect: (item) => { + const value = item.value; + + // Handle editMeta action (format: "editMeta:fieldName") + if (value.startsWith('editMeta:')) { + const field = value.substring(9); + setEditingField(field); + setPhase('editMeta'); + return; + } + + // Handle editTest action (format: "editTest:index") + if (value.startsWith('editTest:')) { + const testIndex = parseInt(value.substring(9), 10); + setEditingTestIndex(testIndex); + setPhase('editTest'); + return; + } + + switch (value) { + case 'addMeta': + setPhase('addMeta'); + break; + case 'deleteMeta': + setPhase('deleteMeta'); + break; + case 'addTest': + setPhase('addTest'); + break; + case 'debugTest': + // If only one test with steps, go directly to debug + const runnableTests = tests.filter((t) => (t.steps || []).length > 0); + if (runnableTests.length === 1) { + const runnableIndex = tests.findIndex((t) => (t.steps || []).length > 0); + setDebugTestIndex(runnableIndex); + setPhase('debugRun'); + } else { + setPhase('selectDebugTest'); + } + break; + case 'preview': + setPhase('preview'); + break; + case 'analyze': + setPhase('analyzing'); + break; + case 'save': + // Use preSave to check for inline sources before saving + setPhase('preSave'); + break; + case 'back': + if (onBack) onBack(); + break; + case 'exit': + if (hasUnsavedChanges) { + setPhase('confirmExit'); + } else { + exit(); + } + break; + // Ignore 'none_*' values + } + }, + }) + ); +}; + +export default TestBuilder; diff --git a/cli/src/cli/builder/TestEditor.mjs b/cli/src/cli/builder/TestEditor.mjs new file mode 100644 index 0000000..5885163 --- /dev/null +++ b/cli/src/cli/builder/TestEditor.mjs @@ -0,0 +1,506 @@ +/** + * Test editor component - manages tests and their steps (ESM version) + */ + +import React from 'react'; +const { useState, useMemo } = React; +import { Box, Text, useInput } from 'ink'; +import SelectInput from 'ink-select-input'; +import { + getTestFields, + validateTest, + getCommonStepProperties, + getStepTypes, +} from './schemaUtils.mjs'; +import FieldEditor from './FieldEditor.mjs'; +import StepEditor from './StepEditor.mjs'; +import { StatusBar, JsonPreview, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; + +/** + * Test editor - edit test properties and manage steps + */ +const TestEditor = ({ + test, + testIndex, + onChange, + onSave, + onCancel, + onDelete, +}) => { + const [view, setView] = useState('menu'); // 'menu', 'editMeta', 'editStep', 'addStep', 'preview', 'confirmCancel' + const [editingField, setEditingField] = useState(null); + const [editingStepIndex, setEditingStepIndex] = useState(null); + // Ensure we have a safe test object even if `test` is undefined/null + const safeTest = test || { description: '', steps: [] }; + const [localTest, setLocalTest] = useState(safeTest); + + // Track original test for detecting changes + const [originalTest] = useState(() => JSON.parse(JSON.stringify(safeTest))); + + // Track if there are unsaved changes + const hasUnsavedChanges = useMemo(() => { + return JSON.stringify(localTest) !== JSON.stringify(originalTest); + }, [localTest, originalTest]); + + // Get test fields (default to empty array if util returns nothing) + const { fields: testFields = [] } = useMemo(() => getTestFields() || {}, []); + + // Validation + const validation = useMemo(() => validateTest(localTest), [localTest]); + + // Handle escape - go back from any sub-view, or cancel from main menu + useInput((input, key) => { + if (key.escape) { + if (view === 'menu') { + if (hasUnsavedChanges) { + setView('confirmCancel'); + } else { + onCancel(); + } + } else if (view === 'confirmCancel') { + setView('menu'); + } else { + setView('menu'); + setEditingField(null); + setEditingStepIndex(null); + } + } + }); + + // Edit metadata field view + if (view === 'editMeta' && editingField) { + const fieldDef = testFields.find((f) => f.name === editingField); + + if (!fieldDef) { + console.warn(`[TestEditor] Missing field definition for editingField: "${editingField}"`); + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), editingField], + validationStatus: validation.valid, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow' }, `⚠️ Unknown field: "${editingField}"`) + ), + React.createElement( + Text, + { color: 'gray' }, + 'Press Esc to go back' + ) + ); + } + + const currentValue = localTest[editingField]; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), editingField], + validationStatus: validation.valid, + }), + React.createElement(FieldEditor, { + field: fieldDef, + value: currentValue, + onChange: (newValue) => { + const updatedTest = { ...localTest, [editingField]: newValue }; + setLocalTest(updatedTest); + onChange(updatedTest); + }, + onSubmit: () => setView('menu'), + onCancel: () => setView('menu'), + }) + ); + } + + // Edit step view + if (view === 'editStep' && editingStepIndex !== null) { + const currentStep = localTest.steps?.[editingStepIndex] || {}; + + return React.createElement(StepEditor, { + step: currentStep, + stepIndex: editingStepIndex, + onChange: (updatedStep) => { + const newSteps = [...(localTest.steps || [])]; + newSteps[editingStepIndex] = updatedStep; + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); + }, + onSave: (updatedStep) => { + const newSteps = [...(localTest.steps || [])]; + newSteps[editingStepIndex] = updatedStep; + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); + setView('menu'); + setEditingStepIndex(null); + }, + onCancel: () => { + setView('menu'); + setEditingStepIndex(null); + }, + onDelete: () => { + const newSteps = [...(localTest.steps || [])]; + newSteps.splice(editingStepIndex, 1); + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); + setView('menu'); + setEditingStepIndex(null); + }, + }); + } + + // Add step view + if (view === 'addStep') { + // Create new step - pass empty object so StepEditor will prompt for type selection + const newStep = {}; + + return React.createElement(StepEditor, { + step: newStep, + stepIndex: (localTest.steps || []).length, + onChange: () => {}, + onSave: (newStep) => { + const newSteps = [...(localTest.steps || []), newStep]; + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); + setView('menu'); + }, + onCancel: () => setView('menu'), + onDelete: () => setView('menu'), + }); + } + + // Add metadata field view + if (view === 'addMeta') { + // Get fields that aren't already set + const availableFields = testFields.filter((f) => { + if (f.name === 'steps') return false; // Steps handled separately + if (f.name === '$schema') return false; + return localTest[f.name] === undefined; + }); + + const items = availableFields.map((f) => ({ + label: `${f.name}${f.required ? ' (required)' : ''}`, + description: f.description || '', + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Add Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select property to add:') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to go back)' + ) + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + setEditingField(item.value); + setView('editMeta'); + }, + }) + ); + } + + // Delete metadata field view + if (view === 'deleteMeta') { + const deletableFields = testFields.filter((f) => { + if (f.name === 'steps') return false; + if (f.name === '$schema') return false; + if (f.required) return false; + return localTest[f.name] !== undefined; + }); + + const items = deletableFields.map((f) => { + const val = localTest[f.name]; + const preview = typeof val === 'object' ? JSON.stringify(val) : String(val); + return { + label: `🗑️ ${f.name}: ${preview.substring(0, 30)}`, + value: f.name, + }; + }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Delete Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, 'Select property to delete:') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to go back)' + ) + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => { + const updatedTest = { ...localTest }; + delete updatedTest[item.value]; + setLocalTest(updatedTest); + onChange(updatedTest); + setView('menu'); + }, + }) + ); + } + + // Preview view + if (view === 'preview') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Preview'], + validationStatus: validation.valid, + }), + React.createElement(JsonPreview, { + data: localTest, + title: 'Test Preview', + }), + !validation.valid && + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'red' }, + 'Validation errors: ' + + (Array.isArray(validation.errors) + ? JSON.stringify(validation.errors, null, 2) + : String(validation.errors)) + ) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => setView('menu'), + }) + ) + ); + } + + // Main menu view + const menuItems = []; + let menuIndex = 0; + + // Test metadata + menuItems.push({ + label: '📝 Test Properties', + value: `none_${menuIndex++}`, + }); + + testFields + .filter((f) => f.name !== 'steps' && f.name !== '$schema' && localTest[f.name] !== undefined) + .forEach((f) => { + const val = localTest[f.name]; + const stringSource = typeof val === 'object' ? JSON.stringify(val) : String(val); + const displayVal = stringSource.substring(0, 50); + menuItems.push({ + label: ` ✏️ ${f.name}: ${displayVal}${stringSource.length > 50 ? '...' : ''}`, + value: `editMeta:${f.name}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add property', + value: 'addMeta', + }); + menuItems.push({ + label: ' 🗑️ Delete property', + value: 'deleteMeta', + }); + + menuItems.push({ label: '─────── Steps ──────────', value: `none_${menuIndex++}` }); + + // Steps section + const steps = localTest.steps || []; + menuItems.push({ + label: `📋 Steps (${steps.length})`, + value: `none_${menuIndex++}`, + }); + + // Get common step properties and valid step types once for reuse + const commonStepProps = Object.keys(getCommonStepProperties() || {}); + const validStepTypes = getStepTypes() || []; + + steps.forEach((step, index) => { + // Determine step type by finding a key that is a valid step type (not a common property) + const stepType = Object.keys(step).find((k) => validStepTypes.includes(k) && !commonStepProps.includes(k)); + const stepValue = stepType ? step[stepType] : null; + const displayValue = typeof stepValue === 'string' ? stepValue.substring(0, 40) : ''; + const displayType = stepType || '(unknown step type)'; + + menuItems.push({ + label: ` ${index + 1}. ${displayType}${displayValue ? ': ' + displayValue : ''}${displayValue.length >= 40 ? '...' : ''}`, + value: `editStep:${index}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add step', + value: 'addStep', + }); + + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); + + // Actions + menuItems.push({ label: '🔍 Preview JSON', value: 'preview' }); + + if (validation.valid) { + menuItems.push({ label: '💾 Save test', value: 'save' }); + } else { + menuItems.push({ + label: '⚠️ Fix errors before saving', + value: `none_${menuIndex++}`, + }); + } + + menuItems.push({ label: '🗑️ Delete test', value: 'delete' }); + menuItems.push({ label: '← Back (discard changes)', value: 'cancel' }); + + // Confirm cancel with unsaved changes + if (view === 'confirmCancel') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Confirm'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'yellow' }, '⚠️ Unsaved Changes') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'You have unsaved changes to this test. Are you sure you want to go back?') + ), + React.createElement(SelectInput, { + items: [ + { label: '← Discard changes and go back', value: 'discard' }, + { label: 'Continue editing', value: 'continue' }, + ], + onSelect: (item) => { + if (item.value === 'discard') { + onCancel(); + } else { + setView('menu'); + } + }, + }) + ); + } + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1)], + validationStatus: validation.valid, + hint: 'Use ↑↓ to navigate, Enter to select', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Edit Test'), + localTest.description && + React.createElement(Text, { color: 'gray' }, ': ' + localTest.description) + ), + !validation.valid && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + '⚠️ Test has validation errors' + ) + ), + React.createElement(SelectInput, { + items: menuItems, + onSelect: (item) => { + const value = item.value; + + // Handle editMeta action (format: "editMeta:fieldName") + if (value.startsWith('editMeta:')) { + const field = value.substring(9); + setEditingField(field); + setView('editMeta'); + return; + } + + // Handle editStep action (format: "editStep:index") + if (value.startsWith('editStep:')) { + const stepIndex = parseInt(value.substring(9), 10); + setEditingStepIndex(stepIndex); + setView('editStep'); + return; + } + + switch (value) { + case 'addMeta': + setView('addMeta'); + break; + case 'deleteMeta': + setView('deleteMeta'); + break; + case 'addStep': + setView('addStep'); + break; + case 'preview': + setView('preview'); + break; + case 'save': + onSave(localTest); + break; + case 'delete': + onDelete(); + break; + case 'cancel': + if (hasUnsavedChanges) { + setView('confirmCancel'); + } else { + onCancel(); + } + break; + // Ignore 'none_*' values + } + }, + }) + ); +}; + +export default TestEditor; diff --git a/cli/src/cli/builder/builderRunner.js b/cli/src/cli/builder/builderRunner.js new file mode 100644 index 0000000..c7909e3 --- /dev/null +++ b/cli/src/cli/builder/builderRunner.js @@ -0,0 +1,86 @@ +/** + * Builder runner - launches the Ink-based test builder + * Uses dynamic imports to handle ESM dependencies + */ + +/** + * Run the interactive test builder + * @param {Object} options - Builder options + * @param {string} options.outputDir - Output directory for the spec file + * @param {Object} options.initialSpec - Initial spec to edit (optional, deprecated - use specs instead) + * @param {Array} options.specs - Array of spec objects to choose from: { spec, filePath, extension, isValid, validationErrors } + * @returns {Promise} + */ +async function runBuilder(options = {}) { + const { outputDir = process.cwd(), initialSpec = null, specs = [] } = options; + + // Clear terminal and move cursor to top-left + process.stdout.write('\x1b[2J\x1b[H'); + + // Dynamic import of ESM modules + const [{ render }, React, TestBuilderModule, SpecSelectorModule] = await Promise.all([ + import('ink'), + import('react'), + import('./TestBuilder.mjs'), + import('./SpecSelector.mjs'), + ]); + + const TestBuilder = TestBuilderModule.default; + const SpecSelector = SpecSelectorModule.default; + + return new Promise((resolve, reject) => { + try { + let component; + + if (specs.length > 1) { + // Multiple specs - show selector + component = React.createElement(SpecSelector, { + specs, + outputDir, + }); + } else if (specs.length === 1) { + // Single spec - go directly to editor + const { spec, filePath, extension, isValid, validationErrors } = specs[0]; + component = React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: filePath, + inputFileExtension: extension, + isValid, + validationErrors, + outputDir, + }); + } else if (initialSpec) { + // Legacy: initialSpec provided directly + component = React.createElement(TestBuilder, { + initialSpec, + outputDir, + }); + } else { + // No specs - create new + component = React.createElement(TestBuilder, { + outputDir, + }); + } + + const app = render(component, { + // Use fullscreen mode to fill the terminal + exitOnCtrlC: true, + }); + + // Wait for the app to exit + app.waitUntilExit().then(() => { + // Clear screen on exit for clean terminal + process.stdout.write('\x1b[2J\x1b[H'); + resolve(); + }).catch((err) => { + // Clear screen on error for clean terminal + process.stdout.write('\x1b[2J\x1b[H'); + reject(err); + }); + } catch (error) { + reject(error); + } + }); +} + +module.exports = { runBuilder }; diff --git a/cli/src/cli/builder/components.mjs b/cli/src/cli/builder/components.mjs new file mode 100644 index 0000000..9d1af0c --- /dev/null +++ b/cli/src/cli/builder/components.mjs @@ -0,0 +1,442 @@ +/** + * Reusable components for the test builder (ESM version) + */ + +import React from 'react'; +const { useState, useEffect, useMemo } = React; +import { Box, Text, useInput, useStdout } from 'ink'; +import SelectInput from 'ink-select-input'; + +/** + * Custom item component for SelectInput that wraps text properly + */ +export const DescriptiveItem = ({ isSelected, label, description }) => { + return React.createElement( + Box, + { flexDirection: 'column', marginBottom: description ? 1 : 0 }, + React.createElement( + Text, + { + color: isSelected ? 'cyan' : 'white', + bold: isSelected, + }, + (isSelected ? '❯ ' : ' ') + label + ), + description && React.createElement( + Box, + { marginLeft: 4 }, + React.createElement( + Text, + { color: 'gray', dimColor: true, wrap: 'wrap' }, + description + ) + ) + ); +}; + +/** + * Custom indicator that works with DescriptiveItem (returns null since indicator is in item) + */ +export const NoIndicator = () => null; + +/** + * Scrollable SelectInput with viewport indicators + * Shows ▲ when there are items above the viewport + * Shows ▼ when there are items below the viewport + * @param {Object} props + * @param {Array} props.items - Menu items + * @param {Function} props.onSelect - Selection handler + * @param {Component} props.itemComponent - Custom item renderer + * @param {Component} props.indicatorComponent - Custom indicator + * @param {number} props.limit - Fixed limit (overrides dynamic calculation) + * @param {number} props.linesPerItem - Lines each item takes (for dynamic limit calculation) + * @param {number} props.reservedLines - Lines reserved for header/footer (default: 8) + * @param {number} props.initialIndex - Initial selected index + */ +export const ScrollableSelect = ({ + items, + onSelect, + itemComponent = DescriptiveItem, + indicatorComponent = NoIndicator, + limit: customLimit, + linesPerItem = 3, + reservedLines = 8, + initialIndex = 0, +}) => { + const { stdout } = useStdout(); + // Track the actual index in the full items array (not the visible window) + const [highlightedIndex, setHighlightedIndex] = useState(initialIndex); + + // Sync local state when initialIndex prop changes + useEffect(() => { + setHighlightedIndex(initialIndex); + }, [initialIndex]); + + // Calculate visible items based on terminal height + const terminalHeight = stdout?.rows || 24; + const availableLines = Math.max(terminalHeight - reservedLines, linesPerItem); + const defaultLimit = Math.max(1, Math.floor(availableLines / linesPerItem)); + const limit = customLimit || defaultLimit; + + // Check if we need scrolling at all + const hasLimit = items.length > limit; + + // Calculate scroll indicators based on ink-select-input's rotation behavior + // ink-select-input uses array rotation: when you scroll down past the limit, + // it rotates the array so the selected item stays visible within the limit window + const scrollInfo = useMemo(() => { + if (!hasLimit) { + return { hasItemsAbove: false, hasItemsBelow: false, aboveCount: 0, belowCount: 0 }; + } + + // ink-select-input keeps the selected item visible by rotating the array + // The visible window always contains `limit` items with the selection inside it + // We need to figure out which items are "before" and "after" the visible window + + // When selectedIndex is within [0, limit-1], no rotation needed, window is [0, limit) + // When selectedIndex >= limit, the window has rotated to keep selection visible + + // The rotation keeps the highlighted item visible, so we calculate based on + // where we are in the full list + const aboveCount = Math.max(0, highlightedIndex - (limit - 1)); + const belowCount = Math.max(0, items.length - highlightedIndex - 1); + + // Clamp belowCount to account for visible items + const adjustedBelowCount = Math.max(0, items.length - limit - aboveCount); + + return { + hasItemsAbove: aboveCount > 0, + hasItemsBelow: adjustedBelowCount > 0, + aboveCount, + belowCount: adjustedBelowCount, + }; + }, [highlightedIndex, limit, items.length, hasLimit]); + + return React.createElement( + Box, + { flexDirection: 'column' }, + // Scroll up indicator + scrollInfo.hasItemsAbove && React.createElement( + Box, + { marginLeft: 2 }, + React.createElement( + Text, + { color: 'yellow' }, + `▲ ${scrollInfo.aboveCount} more above` + ) + ), + // The actual select input + React.createElement(SelectInput, { + items, + limit, + initialIndex, + itemComponent, + indicatorComponent, + onSelect, + onHighlight: (item) => { + // Track the highlighted item's index in the full items array + const idx = items.findIndex(i => i.value === item.value); + if (idx !== -1) { + setHighlightedIndex(idx); + } + }, + }), + // Scroll down indicator + scrollInfo.hasItemsBelow && React.createElement( + Box, + { marginLeft: 2 }, + React.createElement( + Text, + { color: 'yellow' }, + `▼ ${scrollInfo.belowCount} more below` + ) + ) + ); +}; + +/** + * Simple text input using ink's useInput hook + */ +export const SimpleTextInput = ({ value, onChange, onSubmit, placeholder = '', focus = true }) => { + const [cursorVisible, setCursorVisible] = useState(true); + + // Blink cursor + useEffect(() => { + if (!focus) return; + const interval = setInterval(() => { + setCursorVisible((v) => !v); + }, 500); + return () => clearInterval(interval); + }, [focus]); + + useInput( + (input, key) => { + if (!focus) return; + + if (key.return) { + if (onSubmit) onSubmit(value); + return; + } + + if (key.backspace || key.delete) { + onChange(value.slice(0, -1)); + return; + } + + // Ignore control characters + if (key.ctrl || key.meta || key.escape) { + return; + } + + // Add printable characters + if (input && !key.ctrl && !key.meta) { + onChange(value + input); + } + }, + { isActive: focus } + ); + + const displayValue = value || ''; + const showPlaceholder = displayValue.length === 0 && placeholder; + + return React.createElement( + Box, + null, + showPlaceholder + ? React.createElement(Text, { color: 'gray', dimColor: true }, placeholder) + : React.createElement(Text, null, displayValue), + focus && cursorVisible && React.createElement(Text, { color: 'cyan' }, '█') + ); +}; + +/** + * Labeled text input with validation support + */ +export const LabeledTextInput = ({ + label, + value, + onChange, + placeholder = '', + error = null, + description = '', + focus = true, + onSubmit, +}) => { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + null, + React.createElement(Text, { bold: true, color: 'cyan' }, label + ': '), + React.createElement(SimpleTextInput, { + value: value || '', + onChange, + placeholder, + focus, + onSubmit, + }) + ), + description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + description + ), + error && + React.createElement(Text, { color: 'red' }, ' ✖ ' + error) + ); +}; + +/** + * Labeled enum selector + */ +export const EnumSelector = ({ + label, + options, + value, + onSelect, + description = '', +}) => { + const items = options.map((opt) => ({ + label: opt, + value: opt, + })); + + // Find initial index + const initialIndex = Math.max(0, options.indexOf(value)); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 0 }, + React.createElement(Text, { bold: true, color: 'cyan' }, label + ':') + ), + description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + description + ), + React.createElement(SelectInput, { + items, + initialIndex, + onSelect: (item) => onSelect(item.value), + }) + ); +}; + +/** + * Navigation menu with title + */ +export const Menu = ({ + title, + items, + onSelect, + description = '', +}) => { + return React.createElement( + Box, + { flexDirection: 'column' }, + title && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, title) + ), + description && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, description) + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => onSelect(item.value, item), + }) + ); +}; + +/** + * Display JSON with syntax highlighting + */ +export const JsonPreview = ({ data, title = 'Preview', maxLines = 30 }) => { + const jsonStr = JSON.stringify(data, null, 2); + const lines = jsonStr.split('\n'); + const truncated = lines.length > maxLines; + const displayLines = truncated ? lines.slice(0, maxLines) : lines; + + const getLineColor = (line) => { + if (line.includes('": "')) return 'green'; + if (line.includes('": true') || line.includes('": false')) return 'yellow'; + if (line.includes('": null')) return 'gray'; + if (/": \d/.test(line)) return 'magenta'; + return 'white'; + }; + + return React.createElement( + Box, + { flexDirection: 'column', borderStyle: 'single', borderColor: 'gray', paddingX: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, title) + ), + React.createElement( + Box, + { flexDirection: 'column' }, + displayLines.map((line, i) => + React.createElement( + Text, + { key: i, color: getLineColor(line) }, + line + ) + ) + ), + truncated && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `... (${lines.length - maxLines} more lines)` + ) + ); +}; + +/** + * Status bar showing current location and validation status + */ +export const StatusBar = ({ + location = [], + validationStatus = null, + hint = '', +}) => { + const locationStr = location.length > 0 ? location.join(' > ') : 'Home'; + + return React.createElement( + Box, + { + flexDirection: 'row', + justifyContent: 'space-between', + borderStyle: 'single', + borderColor: 'gray', + paddingX: 1, + marginBottom: 1, + marginTop: 2, + }, + React.createElement( + Box, + null, + React.createElement(Text, { color: 'cyan' }, '📍 '), + React.createElement(Text, { bold: true }, locationStr) + ), + validationStatus !== null && + React.createElement( + Box, + null, + validationStatus + ? React.createElement(Text, { color: 'green' }, '✓ Valid') + : React.createElement(Text, { color: 'red' }, '✖ Invalid') + ), + hint && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + hint + ) + ); +}; + +/** + * Yes/No confirmation prompt + */ +export const ConfirmPrompt = ({ message, onConfirm, onCancel }) => { + useInput((input, key) => { + if (input.toLowerCase() === 'y' || key.return) { + onConfirm(); + } else if (input.toLowerCase() === 'n' || key.escape) { + onCancel(); + } + }); + + return React.createElement( + Box, + null, + React.createElement(Text, { color: 'yellow' }, message + ' '), + React.createElement(Text, { color: 'gray' }, '(Y/n)') + ); +}; + +export default { + SimpleTextInput, + LabeledTextInput, + EnumSelector, + Menu, + JsonPreview, + StatusBar, + ConfirmPrompt, + DescriptiveItem, + NoIndicator, + ScrollableSelect, +}; diff --git a/cli/src/cli/builder/index.js b/cli/src/cli/builder/index.js new file mode 100644 index 0000000..ed12b4e --- /dev/null +++ b/cli/src/cli/builder/index.js @@ -0,0 +1,11 @@ +/** + * Builder module index + * + * Note: Most builder components are ESM (.mjs files) that are dynamically + * imported by builderRunner.js to avoid ESM/CommonJS compatibility issues + * with ink@6.x which uses top-level await. + */ + +module.exports = { + runBuilder: require('./builderRunner').runBuilder, +}; diff --git a/cli/src/cli/builder/schemaUtils.mjs b/cli/src/cli/builder/schemaUtils.mjs new file mode 100644 index 0000000..54473b1 --- /dev/null +++ b/cli/src/cli/builder/schemaUtils.mjs @@ -0,0 +1,559 @@ +/** + * Schema utilities for the interactive test builder (ESM version) + * Extracts field definitions, enums, patterns, and validation requirements + * from doc-detective-common JSON schemas + */ + +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const { schemas, validate } = require('doc-detective-common'); + +/** + * Get all available step types from the step schema + * @returns {string[]} Array of step type names + */ +export function getStepTypes() { + const stepSchema = schemas.step_v3; + return stepSchema.anyOf + .map((option) => { + const required = option.allOf?.[1]?.required; + return required ? required[0] : null; + }) + .filter(Boolean) + .sort(); +} + +/** + * Get the schema for a specific step type + * @param {string} stepType - The step type (e.g., 'goTo', 'click') + * @returns {Object|null} The schema for the step type + */ +export function getStepTypeSchema(stepType) { + const schemaKey = `${stepType}_v3`; + return schemas[schemaKey] || null; +} + +/** + * Get the common properties shared by all steps + * @returns {Object} Common step properties schema + */ +export function getCommonStepProperties() { + const stepSchema = schemas.step_v3; + return stepSchema.components?.schemas?.common?.properties || {}; +} + +/** + * Get the anyOf variants for a step type (e.g., "simple" vs "detailed") + * @param {string} stepType - The step type + * @returns {Array<{index: number, title: string, type: string, description: string, schema: Object}>} + */ +export function getStepTypeVariants(stepType) { + const schema = getStepTypeSchema(stepType); + if (!schema || !schema.anyOf) { + return []; + } + + return schema.anyOf.map((opt, index) => ({ + index, + title: opt.title || opt.description || `Variant ${index + 1}`, + type: opt.type || 'object', + description: opt.description || '', + schema: opt, + })); +} + +/** + * Get the anyOf variants for a field property + * @param {Object} prop - The property schema + * @returns {Array<{index: number, title: string, type: string, description: string, schema: Object}>} + */ +export function getFieldVariants(prop) { + if (!prop || !prop.anyOf) { + return []; + } + + return prop.anyOf.map((opt, index) => ({ + index, + title: opt.title || opt.type || `Variant ${index + 1}`, + type: opt.type || 'object', + description: opt.description || '', + schema: opt, + })); +} + +/** + * Determine which anyOf variant a value matches + * @param {any} value - The current value + * @param {Array} variants - The anyOf variants + * @returns {number} The index of the matching variant, or 0 if no match + */ +export function detectVariantIndex(value, variants) { + if (variants.length === 0) { + return 0; + } + + // Handle null first (before checking undefined) + if (value === null) { + for (let i = 0; i < variants.length; i++) { + if (variants[i].type === 'null') { + return i; + } + } + return 0; + } + + if (value === undefined) { + return 0; + } + + const valueType = typeof value; + + for (let i = 0; i < variants.length; i++) { + const variant = variants[i]; + if (variant.type === valueType) { + return i; + } + // Handle integer (typeof returns 'number') + if (variant.type === 'integer' && valueType === 'number' && Number.isInteger(value)) { + return i; + } + } + + return 0; +} + +/** + * Extract field information from a schema property + * @param {Object} prop - The property schema + * @param {string} name - The property name + * @returns {Object} Field information + */ +export function extractFieldInfo(prop, name) { + const info = { + name, + type: prop.type, + description: prop.description || '', + required: false, + default: prop.default, + enum: null, + pattern: null, + minimum: prop.minimum, + maximum: prop.maximum, + items: null, + properties: null, + anyOf: null, + }; + + // Handle enum + if (prop.enum) { + info.enum = prop.enum; + info.type = 'enum'; + } + + // Handle pattern + if (prop.pattern) { + info.pattern = prop.pattern; + } + + // Handle anyOf (multiple types or enum options) + if (prop.anyOf) { + info.anyOf = prop.anyOf; + // Check if any option has an enum + const enumOption = prop.anyOf.find((opt) => opt.enum); + if (enumOption) { + info.enum = enumOption.enum; + } + // Check if any option has a pattern + const patternOption = prop.anyOf.find((opt) => opt.pattern); + if (patternOption) { + info.pattern = patternOption.pattern; + } + // Determine combined types + info.type = prop.anyOf + .map((opt) => opt.type) + .filter(Boolean) + .join('|'); + } + + // Handle array items + if (prop.type === 'array' && prop.items) { + info.items = prop.items; + } + + // Handle object properties + if (prop.type === 'object' && prop.properties) { + info.properties = prop.properties; + } + + // Handle patternProperties (for outputs/variables) + if (prop.patternProperties) { + info.patternProperties = prop.patternProperties; + } + + return info; +} + +/** + * Get fields for a step type, including which are required + * @param {string} stepType - The step type + * @returns {Object} { fields: FieldInfo[], requiredFields: string[] } + */ +export function getStepTypeFields(stepType) { + const schema = getStepTypeSchema(stepType); + if (!schema) { + return { fields: [], requiredFields: [] }; + } + + const fields = []; + const requiredFields = []; + + // Handle simple string type (e.g., goTo: "https://...") + const hasSimpleForm = schema.anyOf?.some((opt) => opt.type === 'string'); + const hasObjectForm = schema.anyOf?.some((opt) => opt.type === 'object'); + + if (hasSimpleForm && hasObjectForm) { + // This step type supports both simple string and object forms + const simpleOption = schema.anyOf.find((opt) => opt.type === 'string'); + const objectOption = schema.anyOf.find((opt) => opt.type === 'object'); + + // Add a meta field to indicate the form type + fields.push({ + name: '_formType', + type: 'enum', + description: 'Choose simple (single value) or detailed (multiple options) form', + enum: ['simple', 'detailed'], + default: 'simple', + required: true, + }); + + // Add simple form field + if (simpleOption) { + fields.push({ + ...extractFieldInfo(simpleOption, '_simpleValue'), + formType: 'simple', + required: true, + }); + } + + // Add object form fields + if (objectOption && objectOption.properties) { + const objRequired = objectOption.required || []; + Object.entries(objectOption.properties).forEach(([key, prop]) => { + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.formType = 'detailed'; + fieldInfo.required = objRequired.includes(key); + if (fieldInfo.required) { + requiredFields.push(key); + } + fields.push(fieldInfo); + }); + } + } else if (schema.type === 'object' && schema.properties) { + // Simple object type + const objRequired = schema.required || []; + Object.entries(schema.properties).forEach(([key, prop]) => { + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = objRequired.includes(key); + if (fieldInfo.required) { + requiredFields.push(key); + } + fields.push(fieldInfo); + }); + } else if (schema.anyOf) { + // Handle other anyOf structures (like wait which can be number or boolean) + const objectOption = schema.anyOf.find((opt) => opt.type === 'object'); + if (objectOption && objectOption.properties) { + const objRequired = objectOption.required || []; + Object.entries(objectOption.properties).forEach(([key, prop]) => { + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = objRequired.includes(key); + if (fieldInfo.required) { + requiredFields.push(key); + } + fields.push(fieldInfo); + }); + } else { + // Handle primitive anyOf (number|boolean for wait) + fields.push({ + name: '_value', + type: schema.anyOf.map((opt) => opt.type).filter(Boolean).join('|'), + description: schema.description || '', + required: true, + anyOf: schema.anyOf, + }); + } + } + + return { fields, requiredFields }; +} + +/** + * Get spec-level fields from the spec schema + * @returns {Object} { fields: FieldInfo[], requiredFields: string[] } + */ +export function getSpecFields() { + const schema = schemas.spec_v3; + const fields = []; + const requiredFields = schema.required || []; + + if (schema.properties) { + Object.entries(schema.properties).forEach(([key, prop]) => { + // Skip $schema as it's auto-generated + if (key === '$schema') return; + // Skip tests as they're managed separately + if (key === 'tests') return; + + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = requiredFields.includes(key); + fields.push(fieldInfo); + }); + } + + return { fields, requiredFields }; +} + +/** + * Get test-level fields from the test schema + * @returns {Object} { fields: FieldInfo[], requiredFields: string[] } + */ +export function getTestFields() { + const schema = schemas.test_v3; + const fields = []; + const requiredFields = schema.required || []; + + if (schema.properties) { + Object.entries(schema.properties).forEach(([key, prop]) => { + // Skip steps as they're managed separately + if (key === 'steps') return; + + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = requiredFields.includes(key); + fields.push(fieldInfo); + }); + } + + return { fields, requiredFields }; +} + +/** + * Validate a step object against its schema + * @param {Object} step - The step object to validate + * @returns {{ valid: boolean, errors: string, object: Object }} + */ +export function validateStep(step) { + return validate({ + schemaKey: 'step_v3', + object: step, + addDefaults: true, + }); +} + +/** + * Validate a test object against its schema + * @param {Object} test - The test object to validate + * @returns {{ valid: boolean, errors: string, object: Object }} + */ +export function validateTest(test) { + return validate({ + schemaKey: 'test_v3', + object: test, + addDefaults: true, + }); +} + +/** + * Validate a spec object against its schema + * @param {Object} spec - The spec object to validate + * @returns {{ valid: boolean, errors: string, object: Object }} + */ +export function validateSpec(spec) { + return validate({ + schemaKey: 'spec_v3', + object: spec, + addDefaults: true, + }); +} + +/** + * Validate a value against a regex pattern + * @param {string} value - The value to validate + * @param {string} pattern - The regex pattern + * @returns {boolean} Whether the value matches the pattern + */ +export function validatePattern(value, pattern) { + if (!pattern || !value) return true; + try { + const regex = new RegExp(pattern); + return regex.test(value); + } catch { + return true; // Invalid regex pattern, skip validation + } +} + +/** + * Get a human-readable description for a pattern + * @param {string} pattern - The regex pattern + * @returns {string} Human-readable description + */ +export function describePattern(pattern) { + if (!pattern) return ''; + + // Common patterns + const patterns = { + '(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)': 'Must start with http://, https://, or / (or be a $VARIABLE)', + '(^(http://|https://).*|\\$[A-Za-z0-9_]+)': 'Must start with http:// or https:// (or be a $VARIABLE)', + '([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)': 'Must end with .png or .PNG (or be a $VARIABLE)', + '([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)': 'Must end with .mp4, .webm, or .gif (or be a $VARIABLE)', + '^[A-Za-z0-9_]+$': 'Only letters, numbers, and underscores allowed', + }; + + return patterns[pattern] || `Must match pattern: ${pattern}`; +} + +/** + * Get step type description and examples + * @param {string} stepType - The step type + * @returns {{ description: string, examples: any[] }} + */ +export function getStepTypeInfo(stepType) { + const schema = getStepTypeSchema(stepType); + if (!schema) { + return { description: '', examples: [] }; + } + + return { + description: schema.description || schema.title || stepType, + examples: schema.examples || [], + }; +} + +/** + * Create a default step object for a step type + * @param {string} stepType - The step type + * @returns {Object} Default step object + */ +export function createDefaultStep(stepType) { + const { fields, requiredFields } = getStepTypeFields(stepType); + const step = {}; + + // Check if this step type supports simple form + const formTypeField = fields.find((f) => f.name === '_formType'); + if (formTypeField) { + // Default to simple form + const simpleField = fields.find((f) => f.formType === 'simple'); + if (simpleField && simpleField.default !== undefined) { + step[stepType] = simpleField.default; + } else { + step[stepType] = ''; + } + } else { + // Object form + const stepValue = {}; + fields.forEach((field) => { + if (field.required && field.default !== undefined) { + stepValue[field.name] = field.default; + } else if (field.required) { + // Set empty defaults for required fields + if (field.type === 'string' || field.type?.includes('string')) { + stepValue[field.name] = ''; + } else if (field.type === 'number' || field.type === 'integer') { + stepValue[field.name] = 0; + } else if (field.type === 'boolean') { + stepValue[field.name] = false; + } else if (field.type === 'array') { + stepValue[field.name] = []; + } else if (field.type === 'object') { + stepValue[field.name] = {}; + } + } + }); + + if (Object.keys(stepValue).length > 0) { + step[stepType] = stepValue; + } else { + step[stepType] = {}; + } + } + + return step; +} + +/** + * Create a default test object + * @returns {Object} Default test object + */ +export function createDefaultTest() { + return { + testId: '', + description: '', + steps: [], + }; +} + +/** + * Create a default spec object + * @param {string} specId - The spec ID/name + * @returns {Object} Default spec object + */ +export function createDefaultSpec(specId = '') { + return { + specId: specId, + description: '', + tests: [], + }; +} + +/** + * Get the list of action types that require a browser + * These actions need a goTo step before they can execute + * @returns {string[]} Array of browser-requiring action types + */ +export function getBrowserActions() { + return ['type', 'find', 'click', 'dragAndDrop', 'screenshot', 'record']; +} + +/** + * Get the action type from a step object + * @param {Object} step - The step object + * @returns {string|null} The action type or null if not found + */ +export function getStepActionType(step) { + const commonProps = Object.keys(getCommonStepProperties()); + const stepTypes = getStepTypes(); + return Object.keys(step).find((k) => stepTypes.includes(k) && !commonProps.includes(k)) || null; +} + +/** + * Check if a step requires a browser to execute + * @param {Object} step - The step object + * @returns {boolean} True if the step requires a browser + */ +export function stepRequiresBrowser(step) { + const actionType = getStepActionType(step); + return getBrowserActions().includes(actionType); +} + +export default { + getStepTypes, + getStepTypeSchema, + getCommonStepProperties, + getStepTypeVariants, + getFieldVariants, + detectVariantIndex, + extractFieldInfo, + getStepTypeFields, + getSpecFields, + getTestFields, + validateStep, + validateTest, + validateSpec, + validatePattern, + describePattern, + getStepTypeInfo, + createDefaultStep, + createDefaultTest, + createDefaultSpec, + getBrowserActions, + getStepActionType, + stepRequiresBrowser, +}; diff --git a/cli/src/cli/builder/sourceFileUtils.js b/cli/src/cli/builder/sourceFileUtils.js new file mode 100644 index 0000000..99bb8fc --- /dev/null +++ b/cli/src/cli/builder/sourceFileUtils.js @@ -0,0 +1,892 @@ +/** + * Source file update utilities for inline test editing + * + * This module provides functions to: + * - Serialize steps to inline comment format + * - Update/insert content at specific positions in source files + * - Handle different comment formats (HTML, JSX, link reference) + * - Detect and preserve syntax formats (JSON, YAML, XML) + */ + +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +/** + * Step property names that are excluded when determining the action key or checking for simple serialization. + * These are common step metadata properties, not action-specific properties. + */ +const EXCLUDED_STEP_KEYS = ['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema']; + +/** + * Normalize an object for deterministic comparison by removing excluded keys + * and serializing with sorted object keys. + * + * @param {Object} obj - The object to normalize + * @param {Array} excludeKeys - Keys to exclude from the normalized object + * @returns {string} A deterministic JSON string representation for comparison + */ +function normalizeForComparison(obj, excludeKeys = []) { + if (obj === null || obj === undefined) { + return JSON.stringify(obj); + } + + const sortedStringify = (value) => { + if (value === null || value === undefined) { + return JSON.stringify(value); + } + if (Array.isArray(value)) { + return '[' + value.map(sortedStringify).join(',') + ']'; + } + if (typeof value === 'object') { + const sortedKeys = Object.keys(value).filter(k => !excludeKeys.includes(k)).sort(); + const pairs = sortedKeys.map(k => JSON.stringify(k) + ':' + sortedStringify(value[k])); + return '{' + pairs.join(',') + '}'; + } + return JSON.stringify(value); + }; + + return sortedStringify(obj); +} + +/** + * Detect the syntax format used in an inline statement's original text. + * + * @param {string} originalText - The original inline statement text + * @returns {'json'|'yaml'|'xml'|null} The detected syntax format, or null if unknown + */ +function detectSyntaxFormat(originalText) { + if (!originalText) return null; + + // Remove comment wrappers to get the content + let content = originalText.trim(); + + // Remove HTML comment wrapper: + const htmlMatch = content.match(//); + if (htmlMatch) { + content = htmlMatch[1].trim(); + } + + // Remove JSX comment wrapper: {/* test/step ... */} + const jsxMatch = content.match(/\{\s*\/\*\s*(?:test|step)\s+([\s\S]*?)\s*\*\/\s*\}/); + if (jsxMatch) { + content = jsxMatch[1].trim(); + } + + // Remove link reference wrapper: [comment]: # (test/step ...) + const linkMatch = content.match(/\[comment\]:\s*#\s*\((?:test|step)\s+([\s\S]*?)\s*\)/); + if (linkMatch) { + content = linkMatch[1].trim(); + } + + // Now detect the syntax format of the content + + // JSON: starts with { or contains "key": pattern + if (content.startsWith('{') || /^"?\w+"?\s*:\s*[{["']/.test(content)) { + return 'json'; + } + + // XML-style attributes: key="value" or key=value patterns without JSON structure + if (/^\w+\s*=\s*["']?[^{]/.test(content) || /^\w+\s*=\s*(?:true|false|\d+)/.test(content)) { + return 'xml'; + } + + // YAML: contains key: value patterns with newlines or indentation + if (/^\w+:\s*\n/.test(content) || /\n\s+\w+:/.test(content)) { + return 'yaml'; + } + + // YAML: simple key: value without JSON braces + if (/^\w+:\s+[^{]/.test(content) && !content.includes('{')) { + return 'yaml'; + } + + // Default to JSON if we can't detect + return 'json'; +} + +/** + * Serialize content to the specified syntax format. + * + * @param {Object} obj - The object to serialize + * @param {'json'|'yaml'|'xml'} syntaxFormat - The syntax format to use + * @param {'test'|'step'} type - Whether this is a test or step + * @returns {string} The serialized content (without comment wrappers) + */ +function serializeToSyntax(obj, syntaxFormat, type) { + switch (syntaxFormat) { + case 'xml': + // XML-style attributes: key="value" key=boolean + const attrs = []; + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string') { + attrs.push(`${key}="${value}"`); + } else if (typeof value === 'boolean' || typeof value === 'number') { + attrs.push(`${key}=${value}`); + } else { + // Complex values fall back to JSON + attrs.push(`${key}=${JSON.stringify(value)}`); + } + } + return attrs.join(' '); + + case 'yaml': + // Multiline YAML format + const yamlLines = []; + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string') { + // Quote strings that contain special characters + if (/[:#\[\]{}|>!&*?'"]/.test(value) || value.includes('\n')) { + yamlLines.push(`${key}: "${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`); + } else { + yamlLines.push(`${key}: ${value}`); + } + } else if (typeof value === 'boolean' || typeof value === 'number') { + yamlLines.push(`${key}: ${value}`); + } else if (Array.isArray(value)) { + // Arrays use YAML flow style + yamlLines.push(`${key}: ${JSON.stringify(value)}`); + } else if (typeof value === 'object' && value !== null) { + // Nested objects use indented YAML + yamlLines.push(`${key}:`); + for (const [subKey, subValue] of Object.entries(value)) { + if (typeof subValue === 'string') { + if (/[:#\[\]{}|>!&*?'"]/.test(subValue) || subValue.includes('\n')) { + yamlLines.push(` ${subKey}: "${subValue.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`); + } else { + yamlLines.push(` ${subKey}: ${subValue}`); + } + } else { + yamlLines.push(` ${subKey}: ${JSON.stringify(subValue)}`); + } + } + } else { + yamlLines.push(`${key}: ${JSON.stringify(value)}`); + } + } + return yamlLines.join('\n'); + + case 'json': + default: + return JSON.stringify(obj); + } +} + +/** + * Serialize a step to inline comment format based on the detected or default comment format. + * + * @param {Object} options - Options for serialization + * @param {Object} options.step - The step object to serialize + * @param {string} options.commentFormat - Comment format: 'htmlComment', 'jsxComment', or 'linkReference' + * @param {string} options.fileExtension - File extension (e.g., '.md', '.jsx') for fallback format detection + * @param {string} options.originalText - Original text of the inline statement (for syntax detection) + * @param {'json'|'yaml'|'xml'} options.syntaxFormat - Explicit syntax format override + * @returns {string} The serialized inline step comment + */ +function serializeStepToInline({ step, commentFormat, fileExtension, originalText, syntaxFormat }) { + // Determine the comment format to use + const format = commentFormat || getDefaultCommentFormat(fileExtension); + + // Detect or use provided syntax format + const syntax = syntaxFormat || detectSyntaxFormat(originalText) || 'json'; + + // Clone step and remove sourceLocation (it's read-only metadata, not serializable content) + const stepToSerialize = { ...step }; + delete stepToSerialize.sourceLocation; + + // Determine the step type (action key) + const actionKey = Object.keys(stepToSerialize).find(key => + !EXCLUDED_STEP_KEYS.includes(key) + ); + + if (!actionKey) { + throw new Error('Cannot serialize step: no action found'); + } + + // Check if we can use simple format (just the action value) + const canUseSimpleFormat = canSerializeAsSimple(stepToSerialize, actionKey); + + let stepContent; + if (canUseSimpleFormat) { + // Simple format: just the action and its value + const actionValue = stepToSerialize[actionKey]; + if (typeof actionValue === 'string') { + stepContent = `${actionKey}: "${actionValue}"`; + } else if (typeof actionValue === 'boolean' || typeof actionValue === 'number') { + stepContent = `${actionKey}: ${actionValue}`; + } else { + stepContent = `${actionKey}: ${JSON.stringify(actionValue)}`; + } + } else { + // Full format: use detected/specified syntax + stepContent = serializeToSyntax(stepToSerialize, syntax, 'step'); + } + + // Check if content is multiline + const isMultiline = stepContent.includes('\n'); + + // Wrap in appropriate comment format + switch (format) { + case 'jsxComment': + if (isMultiline) { + return `{/* step\n${stepContent}\n*/}`; + } + return `{/* step ${stepContent} */}`; + case 'linkReference': + // Link reference format doesn't support multiline well, fall back to JSON + if (isMultiline) { + return `[comment]: # (step ${JSON.stringify(stepToSerialize)})`; + } + return `[comment]: # (step ${stepContent})`; + case 'htmlComment': + default: + if (isMultiline) { + return ``; + } + return ``; + } +} + +/** + * Serialize a test declaration to inline comment format. + * + * @param {Object} options - Options for serialization + * @param {Object} options.test - The test object to serialize (only metadata, not steps) + * @param {string} options.commentFormat - Comment format to use + * @param {string} options.fileExtension - File extension for fallback format detection + * @param {string} options.originalText - Original text of the inline statement (for syntax detection) + * @param {'json'|'yaml'|'xml'} options.syntaxFormat - Explicit syntax format override + * @returns {string} The serialized inline test comment + */ +function serializeTestToInline({ test, commentFormat, fileExtension, originalText, syntaxFormat }) { + const format = commentFormat || getDefaultCommentFormat(fileExtension); + + // Detect or use provided syntax format + const syntax = syntaxFormat || detectSyntaxFormat(originalText) || 'json'; + + // Clone test and remove non-serializable properties + const testToSerialize = {}; + if (test.testId) testToSerialize.testId = test.testId; + if (test.description) testToSerialize.description = test.description; + if (test.detectSteps !== undefined) testToSerialize.detectSteps = test.detectSteps; + if (test.runOn) testToSerialize.runOn = test.runOn; + if (test.before) testToSerialize.before = test.before; + if (test.after) testToSerialize.after = test.after; + + // Use detected/specified syntax format + const testContent = serializeToSyntax(testToSerialize, syntax, 'test'); + + // Check if content is multiline + const isMultiline = testContent.includes('\n'); + + switch (format) { + case 'jsxComment': + if (isMultiline) { + return `{/* test\n${testContent}\n*/}`; + } + return `{/* test ${testContent} */}`; + case 'htmlComment': + default: + if (isMultiline) { + return ``; + } + return ``; + } +} + +/** + * Determine the default comment format based on file extension. + * + * @param {string} fileExtension - File extension (e.g., '.md', '.jsx') + * @returns {string} Default comment format for the file type + */ +function getDefaultCommentFormat(fileExtension) { + const ext = (fileExtension || '').toLowerCase(); + + // JSX/TSX/MDX files use JSX comments + if (['.jsx', '.tsx', '.mdx'].includes(ext)) { + return 'jsxComment'; + } + + // All other files (including .md, .html) use HTML comments + return 'htmlComment'; +} + +/** + * Check if a test has metadata worth saving (testId, description, detectSteps, runOn, etc.). + * This is used to determine if a new test declaration should be inserted. + * + * @param {Object} test - The test object + * @returns {boolean} True if the test has saveable metadata + */ +function hasTestMetadata(test) { + if (!test) return false; + + // Check for any test-level properties that should be persisted + return !!( + test.testId || + test.description || + test.detectSteps !== undefined || + test.runOn || + test.before || + test.after + ); +} + +/** + * Check if a step can be serialized in simple format (just action: value). + * + * @param {Object} step - The step object + * @param {string} actionKey - The action key + * @returns {boolean} True if simple format can be used + */ +function canSerializeAsSimple(step, actionKey) { + // Count properties that aren't the action or common step properties + const nonActionKeys = Object.keys(step).filter(key => + key !== actionKey && + !EXCLUDED_STEP_KEYS.includes(key) + ); + + // If there are other non-common properties, can't use simple format + if (nonActionKeys.length > 0) { + return false; + } + + // Check if step has any common properties set (other than default values) + const hasCommonProps = + step.stepId || + step.description || + step.unsafe === true || + (step.outputs && Object.keys(step.outputs).length > 0) || + (step.variables && Object.keys(step.variables).length > 0) || + step.breakpoint === true; + + if (hasCommonProps) { + return false; + } + + // Check if the action value is simple (string, number, boolean) + const actionValue = step[actionKey]; + return typeof actionValue === 'string' || + typeof actionValue === 'number' || + typeof actionValue === 'boolean'; +} + +/** + * Calculate the hash of a file's content for change detection. + * + * @param {string} filePath - Path to the file + * @returns {string|null} MD5 hash of the file content, or null if file doesn't exist + */ +function getFileContentHash(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + return crypto.createHash('md5').update(content).digest('hex'); + } catch (error) { + return null; + } +} + +/** + * Find the start of the line containing the given offset. + * + * @param {string} content - The file content + * @param {number} offset - The offset within the content + * @returns {number} The offset of the start of the line + */ +function findLineStart(content, offset) { + // Search backwards for newline + let pos = offset - 1; + while (pos >= 0 && content[pos] !== '\n') { + pos--; + } + // Return position after the newline (or 0 if at start of file) + return pos + 1; +} + +/** + * Find the end of the line containing the given offset (including the newline if present). + * + * @param {string} content - The file content + * @param {number} offset - The offset within the content + * @returns {number} The offset after the end of the line (after newline if present) + */ +function findLineEnd(content, offset) { + // Search forwards for newline + let pos = offset; + while (pos < content.length && content[pos] !== '\n') { + pos++; + } + // Include the newline character if present + if (pos < content.length && content[pos] === '\n') { + pos++; + } + return pos; +} + +/** + * Get the indentation of a line (leading whitespace). + * + * @param {string} content - The file content + * @param {number} lineStart - The offset of the start of the line + * @returns {string} The indentation string (spaces/tabs) + */ +function getLineIndentation(content, lineStart) { + let indent = ''; + let pos = lineStart; + while (pos < content.length && (content[pos] === ' ' || content[pos] === '\t')) { + indent += content[pos]; + pos++; + } + return indent; +} + +/** + * Check if a source file has changed since it was detected. + * + * @param {string} filePath - Path to the source file + * @param {string} originalContent - Original content (or hash) from detection time + * @returns {boolean} True if the file has changed + */ +function hasSourceFileChanged(filePath, originalContent) { + try { + const currentContent = fs.readFileSync(filePath, 'utf8'); + + // If originalContent is a hash, compare hashes + if (originalContent.length === 32 && /^[a-f0-9]+$/i.test(originalContent)) { + const currentHash = crypto.createHash('md5').update(currentContent).digest('hex'); + return currentHash !== originalContent; + } + + // Otherwise compare content directly + return currentContent !== originalContent; + } catch (error) { + // If file doesn't exist or can't be read, it has changed + return true; + } +} + +/** + * Update content at a specific position in a file. + * + * @param {Object} options - Options for the update + * @param {string} options.filePath - Path to the file to update + * @param {number} options.startOffset - Start offset for replacement + * @param {number} options.endOffset - End offset for replacement + * @param {string} options.newContent - New content to insert + * @returns {Object} Result with success status and any error message + */ +function updateSourceContent({ filePath, startOffset, endOffset, newContent }) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + + // Validate offsets + if (startOffset < 0 || endOffset > content.length || startOffset > endOffset) { + return { + success: false, + error: `Invalid offsets: start=${startOffset}, end=${endOffset}, fileLength=${content.length}`, + }; + } + + // Perform replacement + const before = content.substring(0, startOffset); + const after = content.substring(endOffset); + const updatedContent = before + newContent + after; + + // Write back to file + fs.writeFileSync(filePath, updatedContent, 'utf8'); + + return { + success: true, + offsetDelta: newContent.length - (endOffset - startOffset), + }; + } catch (error) { + return { + success: false, + error: error.message, + }; + } +} + +/** + * Insert content at a specific position in a file. + * + * @param {Object} options - Options for the insertion + * @param {string} options.filePath - Path to the file + * @param {number} options.offset - Offset where to insert + * @param {string} options.content - Content to insert + * @returns {Object} Result with success status + */ +function insertSourceContent({ filePath, offset, content }) { + return updateSourceContent({ + filePath, + startOffset: offset, + endOffset: offset, + newContent: content, + }); +} + +/** + * Apply multiple source location updates to a file. + * Updates are applied in reverse order (from end to start) to maintain offset validity. + * + * Supports line-based operations: + * - replaceEntireLine: Replace the entire line containing the offset range + * - insertLineBefore: Insert new content as a new line before the target line + * - insertLineAfter: Insert new content as a new line after the target line + * + * @param {Object} options - Options for batch updates + * @param {string} options.filePath - Path to the file + * @param {Array} options.updates - Array of update objects with startOffset, endOffset, newContent + * @returns {Object} Result with success status and array of individual results + */ +function batchUpdateSourceContent({ filePath, updates }) { + if (!updates || updates.length === 0) { + return { success: true, results: [] }; + } + + try { + let content = fs.readFileSync(filePath, 'utf8'); + + // Sort updates by startOffset in descending order to maintain offset validity + const sortedUpdates = [...updates].sort((a, b) => b.startOffset - a.startOffset); + + const results = []; + + for (const update of sortedUpdates) { + let { startOffset, endOffset, newContent } = update; + + // Handle line-based operations + if (update.replaceEntireLine) { + // Find the start and end of the line containing this range + const lineStart = findLineStart(content, startOffset); + const lineEnd = findLineEnd(content, endOffset); + + // Get the original indentation + const indent = getLineIndentation(content, lineStart); + + // Replace entire line with indented new content + newline + startOffset = lineStart; + endOffset = lineEnd; + newContent = indent + newContent + '\n'; + } else if (update.insertLineBefore) { + // Insert as a new line before the line containing startOffset + const lineStart = findLineStart(content, startOffset); + + // Get the indentation of the target line + const indent = getLineIndentation(content, lineStart); + + // Insert before the line start + startOffset = lineStart; + endOffset = lineStart; + newContent = indent + newContent + '\n'; + } else if (update.insertLineAfter) { + // Insert as a new line after the line containing endOffset + const lineEnd = findLineEnd(content, endOffset); + + // Get the indentation of the original line + const lineStart = findLineStart(content, startOffset); + const indent = getLineIndentation(content, lineStart); + + // Insert after the line end + startOffset = lineEnd; + endOffset = lineEnd; + newContent = indent + newContent + '\n'; + } + + // Validate offsets + if (startOffset < 0 || endOffset > content.length || startOffset > endOffset) { + results.push({ + success: false, + error: `Invalid offsets: start=${startOffset}, end=${endOffset}`, + update, + }); + continue; + } + + // Perform replacement + const before = content.substring(0, startOffset); + const after = content.substring(endOffset); + content = before + newContent + after; + + results.push({ + success: true, + offsetDelta: newContent.length - (endOffset - startOffset), + update, + }); + } + + // Write the final content + fs.writeFileSync(filePath, content, 'utf8'); + + return { + success: results.every(r => r.success), + results, + }; + } catch (error) { + return { + success: false, + error: error.message, + results: [], + }; + } +} + +/** + * Check if a spec or any of its tests/steps have inline source locations. + * + * @param {Object} spec - The spec object to check + * @returns {boolean} True if any inline source locations exist + */ +function hasInlineSourceLocations(spec) { + if (!spec) return false; + + for (const test of (spec.tests || [])) { + // Check test sourceLocation + if (test.sourceLocation?.isInline) { + return true; + } + + // Check step sourceLocations + for (const step of (test.steps || [])) { + if (step.sourceLocation?.isInline) { + return true; + } + } + } + + return false; +} + +/** + * Get all inline source files referenced by a spec. + * + * @param {Object} spec - The spec object + * @returns {Set} Set of unique file paths + */ +function getInlineSourceFiles(spec) { + const files = new Set(); + + if (!spec) return files; + + // If spec has contentPath, include it as an inline source file + // contentPath indicates the spec was extracted from a markdown file with inline tests + if (spec.contentPath) { + files.add(spec.contentPath); + } + + for (const test of (spec.tests || [])) { + if (test.sourceLocation?.isInline && test.sourceLocation.file) { + files.add(test.sourceLocation.file); + } + + for (const step of (test.steps || [])) { + if (step.sourceLocation?.isInline && step.sourceLocation.file) { + files.add(step.sourceLocation.file); + } + } + } + + return files; +} + +/** + * Check if a step is auto-detected (from markup patterns like code blocks or links). + * Auto-detected steps need special handling when edited - they should be converted + * to explicit inline comments rather than replacing the original markup. + * + * @param {Object} step - The step object to check + * @returns {boolean} True if the step was auto-detected + */ +function isAutoDetectedStep(step) { + return step?.sourceLocation?.isAutoDetected === true; +} + +/** + * Prepare updates for saving inline tests and steps to source files. + * Handles both explicit inline tests/steps (update in place) and auto-detected steps + * (insert new explicit comment after the original content). + * + * @param {Object} options - Options for preparing updates + * @param {Object} options.spec - The spec object containing tests and steps + * @param {Object} options.originalSpec - The original spec before editing (for comparison) + * @returns {Map} Map of file paths to arrays of update operations +*/ +function prepareSourceUpdates({ spec, originalSpec }) { + const updatesByFile = new Map(); + + if (!spec?.tests) return updatesByFile; + + for (let testIndex = 0; testIndex < spec.tests.length; testIndex++) { + const test = spec.tests[testIndex]; + const originalTest = originalSpec?.tests?.[testIndex]; + + // Handle test-level sourceLocation (inline test declarations) + const testLoc = test.sourceLocation; + if (testLoc?.isInline && testLoc.file) { + // Check if test metadata was modified by comparing with original (excluding steps and sourceLocation) + const excludeKeys = ['sourceLocation', 'steps']; + const testMetadata = normalizeForComparison(test, excludeKeys); + const originalMetadata = originalTest ? normalizeForComparison(originalTest, excludeKeys) : null; + + const wasModified = testMetadata !== originalMetadata; + + if (wasModified) { + const fileUpdates = updatesByFile.get(testLoc.file) || []; + + // Serialize the test declaration (without steps), preserving original syntax format + const newContent = serializeTestToInline({ + test, + commentFormat: testLoc.commentFormat || 'htmlComment', + fileExtension: path.extname(testLoc.file), + originalText: testLoc.originalText, + }); + + // Replace the ENTIRE LINE containing the test declaration + fileUpdates.push({ + startOffset: testLoc.startOffset, + endOffset: testLoc.endOffset, + newContent, + replaceEntireLine: true, + isTestDeclaration: true, + }); + + updatesByFile.set(testLoc.file, fileUpdates); + } + } else if (!testLoc && hasTestMetadata(test)) { + // No test-level sourceLocation, but test has metadata that should be saved. + // Find the first inline step to determine where to insert the test declaration. + const firstInlineStep = (test.steps || []).find(s => s.sourceLocation?.isInline && s.sourceLocation.file); + + if (firstInlineStep) { + const stepLoc = firstInlineStep.sourceLocation; + const fileUpdates = updatesByFile.get(stepLoc.file) || []; + + // Serialize the test declaration, using the first step's syntax format as a hint + const newContent = serializeTestToInline({ + test, + commentFormat: stepLoc.commentFormat || 'htmlComment', + fileExtension: path.extname(stepLoc.file), + originalText: stepLoc.originalText, // Use first step's format as hint + }); + + // Insert on the LINE BEFORE the first step + fileUpdates.push({ + startOffset: stepLoc.startOffset, + endOffset: stepLoc.startOffset, + newContent, + insertLineBefore: true, + isTestDeclaration: true, + isNewTestDeclaration: true, + }); + + updatesByFile.set(stepLoc.file, fileUpdates); + } + } + + // Handle step-level sourceLocations + for (let stepIndex = 0; stepIndex < (test.steps || []).length; stepIndex++) { + const step = test.steps[stepIndex]; + const originalStep = originalTest?.steps?.[stepIndex]; + const loc = step.sourceLocation; + + // Skip if no inline source location + if (!loc?.isInline || !loc.file) continue; + + // Check if step was modified by comparing with original + const stepExcludeKeys = ['sourceLocation']; + const stepContent = normalizeForComparison(step, stepExcludeKeys); + const originalContent = originalStep ? normalizeForComparison(originalStep, stepExcludeKeys) : null; + + const wasModified = stepContent !== originalContent; + + // Skip if not modified + if (!wasModified) continue; + + const fileUpdates = updatesByFile.get(loc.file) || []; + + if (loc.isAutoDetected) { + // Auto-detected step: insert new explicit comment on the LINE AFTER the original content + // The original markup (code block, link, etc.) remains intact + const newContent = serializeStepToInline({ + step, + commentFormat: loc.commentFormat || 'htmlComment', + fileExtension: path.extname(loc.file), + // No originalText for auto-detected - use default JSON format + }); + + // Insert on the line after the original content + fileUpdates.push({ + startOffset: loc.startOffset, + endOffset: loc.endOffset, + newContent, + insertLineAfter: true, + isAutoDetectedConversion: true, + }); + } else { + // Explicit inline step: replace the ENTIRE LINE, preserving original syntax format + const newContent = serializeStepToInline({ + step, + commentFormat: loc.commentFormat, + fileExtension: path.extname(loc.file), + originalText: loc.originalText, + }); + + fileUpdates.push({ + startOffset: loc.startOffset, + endOffset: loc.endOffset, + newContent, + replaceEntireLine: true, + }); + } + + updatesByFile.set(loc.file, fileUpdates); + } + } + + return updatesByFile; +} + +/** + * Check if a spec has any auto-detected steps. + * + * @param {Object} spec - The spec object to check + * @returns {boolean} True if any steps are auto-detected + */ +function hasAutoDetectedSteps(spec) { + if (!spec?.tests) return false; + + for (const test of spec.tests) { + for (const step of (test.steps || [])) { + if (isAutoDetectedStep(step)) { + return true; + } + } + } + + return false; +} + +module.exports = { + serializeStepToInline, + serializeTestToInline, + detectSyntaxFormat, + serializeToSyntax, + getDefaultCommentFormat, + canSerializeAsSimple, + hasTestMetadata, + getFileContentHash, + findLineStart, + findLineEnd, + getLineIndentation, + hasSourceFileChanged, + updateSourceContent, + insertSourceContent, + batchUpdateSourceContent, + hasInlineSourceLocations, + getInlineSourceFiles, + isAutoDetectedStep, + prepareSourceUpdates, + hasAutoDetectedSteps, + normalizeForComparison, +}; diff --git a/cli/src/cli/runner.js b/cli/src/cli/runner.js new file mode 100644 index 0000000..e9e2f3e --- /dev/null +++ b/cli/src/cli/runner.js @@ -0,0 +1,110 @@ +const { runTests } = require('doc-detective-core'); + +/** + * Run tests with Ink-based CLI UI + * @param {Object} config - Configuration object + * @param {Object} options - Additional options like resolvedTests + * @returns {Promise} Test results + */ +async function runWithUI(config, options = {}) { + // Dynamic import of ESM modules + const [{ render }, React, { default: App }] = await Promise.all([ + import('ink'), + import('react'), + import('./App.mjs'), + ]); + + let appInstance; + let updateState; + + // Create a promise that resolves when the app is mounted + const mountPromise = new Promise((resolve) => { + const AppWrapper = () => { + const [state, setState] = React.useState({ + phase: 'initializing', + results: null, + error: null, + currentSpec: null, + currentTest: null, + // Note: Progress tracking fields are initialized for future use when + // doc-detective-core adds progress callback support. Currently, runTests() + // does not provide progress callbacks, so these values remain at initial state + // during execution. The UI shows phase transitions (initializing → running → completed) + // rather than granular progress. + progress: { + specs: { current: 0, total: 0 }, + tests: { current: 0, total: 0 }, + steps: { current: 0, total: 0 }, + }, + }); + + // Store the state updater for external use + React.useEffect(() => { + updateState = setState; + resolve(); + }, []); + + return React.createElement(App, { + config, + resolvedTests: options.resolvedTests, + state, + }); + }; + + appInstance = render(React.createElement(AppWrapper)); + }); + + // Wait for the app to mount + await mountPromise; + + try { + // Update to running phase + updateState((prev) => ({ ...prev, phase: 'running' })); + + // Run tests + const results = options.resolvedTests + ? await runTests(config, { resolvedTests: options.resolvedTests }) + : await runTests(config); + + // Update to completed phase with results + updateState((prev) => ({ + ...prev, + phase: 'completed', + results, + })); + + // Wait for React to flush the completed state to the screen + // Uses setImmediate to ensure the event loop processes pending I/O + await new Promise((resolve) => { + setImmediate(() => { + setImmediate(resolve); + }); + }); + + // Unmount the app + if (appInstance) { + appInstance.unmount(); + } + + return results; + } catch (error) { + // Update to error phase + updateState((prev) => ({ + ...prev, + phase: 'error', + error: error.message ? error : new Error(String(error)), + })); + + // Wait a bit to show the error before unmounting + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // Unmount the app + if (appInstance) { + appInstance.unmount(); + } + + throw error; + } +} + +module.exports = { runWithUI }; diff --git a/cli/src/index.js b/cli/src/index.js index 7d1b67f..4a2d3f5 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -1,17 +1,356 @@ #!/usr/bin/env node -const { runTests, runCoverage } = require("doc-detective-core"); -const { setArgs, setConfig, outputResults, setMeta, getVersionData, log } = require("./utils"); +const { + setArgs, + setConfig, + outputResults, + setMeta, + getVersionData, + log, + getResolvedTestsFromEnv, + reportResults, +} = require("./utils"); const { argv } = require("node:process"); const path = require("path"); const fs = require("fs"); +const crypto = require("crypto"); +const { detectTests } = require("doc-detective-resolver"); +const yaml = require("js-yaml"); + +/** + * Compute a content hash for a file to enable content-based matching. + * @param {string} filePath - Absolute path to the file + * @returns {string|null} MD5 hash of file content, or null if file can't be read + */ +function computeFileHash(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + return crypto.createHash('md5').update(content).digest('hex'); + } catch { + return null; + } +} + +/** + * Recursively sort all object keys for consistent comparison. + * @param {*} obj - The value to sort keys for + * @returns {*} The value with all object keys sorted + */ +function sortKeys(obj) { + if (obj === null || typeof obj !== 'object') { + return obj; + } + if (Array.isArray(obj)) { + return obj.map(sortKeys); + } + return Object.keys(obj).sort().reduce((result, key) => { + result[key] = sortKeys(obj[key]); + return result; + }, {}); +} + +/** + * Canonicalize a spec object for content comparison. + * Removes volatile fields like sourcePath, contentPath, specId that don't affect spec content. + * @param {Object} spec - The spec object to canonicalize + * @returns {string} JSON string of canonicalized spec + */ +function canonicalizeSpec(spec) { + const clone = JSON.parse(JSON.stringify(spec)); + // Remove metadata fields that don't represent actual spec content + delete clone.sourcePath; + delete clone.contentPath; + delete clone.specId; + // Recursively sort all object keys for consistent comparison + return JSON.stringify(sortKeys(clone)); +} + +/** + * Match detected specs to their source files using explicit metadata first, + * then falling back to heuristics. + * + * Matching priority: + * 1. Explicit sourcePath property (set by resolver) + * 2. contentPath property (for markdown files) + * 3. Exact filename/basename match + * 4. Content hash comparison (parse file content and compare to spec) + * 5. Error if no reliable match found + * + * @param {Array} detectedSpecs - Specs returned by the resolver + * @param {Array} inputPaths - Input file paths provided by the user + * @returns {Array} Array of { spec, filePath, matchMethod, error } objects + */ +function matchSpecsToSourceFiles(detectedSpecs, inputPaths) { + const results = []; + const usedInputPaths = new Set(); + + // Build a map of input paths by basename for quick lookup + const inputsByBasename = new Map(); + for (const inputPath of inputPaths) { + const basename = path.basename(inputPath); + if (!inputsByBasename.has(basename)) { + inputsByBasename.set(basename, []); + } + inputsByBasename.get(basename).push(inputPath); + } + + // Build a map of input paths by resolved absolute path + const inputsByAbsPath = new Map(); + for (const inputPath of inputPaths) { + const absPath = path.resolve(inputPath); + inputsByAbsPath.set(absPath, inputPath); + } + + for (const detectedSpec of detectedSpecs) { + let matchedPath = null; + let matchMethod = null; + let error = null; + + // Priority 1: Use explicit sourcePath property (set by resolver for all file types) + if (detectedSpec.sourcePath) { + const absSourcePath = path.resolve(detectedSpec.sourcePath); + if (inputsByAbsPath.has(absSourcePath)) { + matchedPath = absSourcePath; + matchMethod = 'sourcePath'; + } else if (fs.existsSync(absSourcePath)) { + // sourcePath exists but wasn't in inputPaths - still use it + matchedPath = absSourcePath; + matchMethod = 'sourcePath'; + } + } + + // Priority 2: Use contentPath property (typically set for markdown files) + if (!matchedPath && detectedSpec.contentPath) { + const absContentPath = path.resolve(detectedSpec.contentPath); + if (inputsByAbsPath.has(absContentPath)) { + matchedPath = absContentPath; + matchMethod = 'contentPath'; + } else if (fs.existsSync(absContentPath)) { + matchedPath = absContentPath; + matchMethod = 'contentPath'; + } + } + + // Priority 3: Try exact filename/basename match + if (!matchedPath) { + // If spec has a specId that looks like a filename, try to match it + const specId = detectedSpec.specId; + if (specId && inputsByBasename.has(specId)) { + const candidates = inputsByBasename.get(specId).filter(p => !usedInputPaths.has(p)); + if (candidates.length === 1) { + matchedPath = path.resolve(candidates[0]); + matchMethod = 'specIdMatch'; + } + } + } + + // Priority 4: Content hash comparison for JSON/YAML files + if (!matchedPath) { + const jsonYamlInputs = inputPaths.filter(p => { + const ext = path.extname(p).toLowerCase(); + return (ext === '.json' || ext === '.yaml' || ext === '.yml') && !usedInputPaths.has(p); + }); + + if (jsonYamlInputs.length > 0) { + const canonicalSpec = canonicalizeSpec(detectedSpec); + const matchingFiles = []; + + for (const inputPath of jsonYamlInputs) { + try { + const content = fs.readFileSync(inputPath, 'utf-8'); + let parsedContent; + const ext = path.extname(inputPath).toLowerCase(); + + if (ext === '.json') { + parsedContent = JSON.parse(content); + } else { + parsedContent = yaml.load(content); + } + + // Canonicalize and compare + const canonicalInput = canonicalizeSpec(parsedContent); + if (canonicalSpec === canonicalInput) { + matchingFiles.push(inputPath); + } + } catch { + // Skip files that can't be parsed + continue; + } + } + + if (matchingFiles.length === 1) { + matchedPath = path.resolve(matchingFiles[0]); + matchMethod = 'contentMatch'; + } else if (matchingFiles.length > 1) { + // Multiple matches - ambiguous, report error + error = `Ambiguous match: spec with ID "${detectedSpec.specId}" matches multiple files: ${matchingFiles.join(', ')}. Please provide explicit file paths.`; + } + } + } + + // Priority 5: Single remaining unmatched input for single unmatched spec + if (!matchedPath && !error) { + const unmatchedInputs = inputPaths.filter(p => !usedInputPaths.has(p)); + const remainingSpecs = detectedSpecs.filter(s => + !results.some(r => r.spec === s && r.filePath) + ); + + // Only use this fallback if there's exactly one unmatched input and one remaining spec + if (unmatchedInputs.length === 1 && remainingSpecs.length === 1 && remainingSpecs[0] === detectedSpec) { + matchedPath = path.resolve(unmatchedInputs[0]); + matchMethod = 'singleRemaining'; + } + } + + // If still no match, report error + if (!matchedPath && !error) { + error = `Unable to reliably match spec with ID "${detectedSpec.specId}" to a source file. ` + + `Provide the source file explicitly as input, or ensure the spec file contains a unique identifier.`; + } + + if (matchedPath) { + usedInputPaths.add(matchedPath); + } + + results.push({ + spec: detectedSpec, + filePath: matchedPath, + matchMethod, + error, + }); + } + + return results; +} // Run setMeta(); main(argv); +/** + * Check if any argument in the array is an exact --editor or -e flag. + * Matches: '--editor', '-e', '--editor=', '-e=' + * Does NOT match substrings like '--editor-mode' or '--some-editor' + * @param {string[]} args - Array of command-line arguments + * @returns {boolean} True if an exact editor flag is found + */ +function hasEditorFlag(args) { + return args.some(arg => + arg === '--editor' || + arg === '-e' || + arg.startsWith('--editor=') || + arg.startsWith('-e=') + ); +} + // Run async function main(argv) { + // Check for --editor flag first (before processing other args) + const rawArgs = argv.slice(2); // Remove 'node' and script path + if (hasEditorFlag(rawArgs)) { + // Parse editor-specific options + const outputDir = process.cwd(); + + // Extract input file paths from args (everything that's not a flag or flag value) + const inputPaths = []; + for (let i = 0; i < rawArgs.length; i++) { + const arg = rawArgs[i]; + // Skip flags and their values + if (arg === '--editor' || arg === '-e') continue; + if (arg === '--input' || arg === '-i') { + // Next arg is the input value + if (i + 1 < rawArgs.length) { + const inputValue = rawArgs[i + 1]; + // Handle comma-separated inputs + inputValue.split(',').forEach(f => { + const trimmed = f.trim(); + if (trimmed) inputPaths.push(path.resolve(trimmed)); + }); + i++; // Skip the value + } + continue; + } + // Handle --input=value format + if (arg.startsWith('--input=') || arg.startsWith('-i=')) { + const inputValue = arg.split('=')[1]; + inputValue.split(',').forEach(f => { + const trimmed = f.trim(); + if (trimmed) inputPaths.push(path.resolve(trimmed)); + }); + continue; + } + // Skip other flags + if (arg.startsWith('-')) continue; + // Assume it's an input path if it exists + const resolved = path.resolve(arg); + if (fs.existsSync(resolved)) { + inputPaths.push(resolved); + } + } + + // Use doc-detective-resolver to detect specs from input paths + const specs = []; + + if (inputPaths.length > 0) { + // Build config for resolver with all input paths + const resolverConfig = { + input: inputPaths, + logLevel: 'silent', // Suppress resolver logging for editor mode + }; + + try { + const detectedSpecs = await detectTests({ config: resolverConfig }); + + if (detectedSpecs && detectedSpecs.length > 0) { + // Match detected specs to their source files using explicit metadata, + // then fallback to heuristics if needed + const matchedSpecs = matchSpecsToSourceFiles(detectedSpecs, inputPaths); + + for (const matched of matchedSpecs) { + const { spec: detectedSpec, filePath, matchMethod, error } = matched; + + if (error) { + console.error(`\x1b[31mError: ${error}\x1b[0m`); + console.error('\x1b[33mPlease ensure each spec file is provided explicitly as input.\x1b[0m'); + process.exit(1); + } + + const ext = filePath ? path.extname(filePath).toLowerCase() : '.json'; + + // detectedSpec is already a valid spec_v3 object from detectTests. + // The resolver validates specs against the spec_v3 schema and only + // returns specs that pass validation (invalid specs are logged and skipped). + const spec = { ...detectedSpec }; + + specs.push({ + spec, + filePath, + extension: ext, + isValid: true, + validationErrors: null, + matchMethod, // Track how the match was made for debugging + }); + } + } + } catch (err) { + console.error(`\x1b[31mError detecting specs: ${err.message}\x1b[0m`); + } + + // If input paths were specified but no specs were detected, exit with error + if (specs.length === 0) { + console.error('\x1b[31mError: No valid spec files could be detected from the provided inputs.\x1b[0m'); + process.exit(1); + } + } + + // Dynamically import the builder to avoid ESM issues at startup + const { runBuilder } = require("./cli/builder"); + + // Run the interactive builder with loaded specs + await runBuilder({ outputDir, specs }); + return; + } + // Find index of `doc-detective` or `run` in argv const index = argv.findIndex( (arg) => arg.endsWith("doc-detective") || arg.endsWith("index.js") @@ -36,16 +375,31 @@ async function main(argv) { // Set config const config = await setConfig({ configPath: configPath, args: argv }); - if (config.logLevel === "debug") { - console.log(`CLI:VERSION INFO:\n${JSON.stringify(getVersionData(), null, 2)}`); - console.log(`CLI:CONFIG:\n${JSON.stringify(config, null, 2)}`); - } + log( + config, + "debug", + `CLI:VERSION INFO:\n${JSON.stringify(getVersionData(), null, 2)}` + ); + log(config, "debug", `CLI:CONFIG:\n${JSON.stringify(config, null, 2)}`); - // Run tests - const output = config.output; - const results = await runTests(config); + // Check for DOC_DETECTIVE_API environment variable + let api = await getResolvedTestsFromEnv(config); + let resolvedTests = api?.resolvedTests || null; + let apiConfig = api?.apiConfig || null; - // Output results - await outputResults(config, output, results, { command: "runTests" }); + // Run tests directly using doc-detective-core + const { runTests } = require("doc-detective-core"); + const output = config.output; + const results = resolvedTests + ? await runTests(config, { resolvedTests }) + : await runTests(config); -} \ No newline at end of file + if (apiConfig) { + await reportResults({ config, apiConfig, results }); + } else { + // Output results + await outputResults(config, output, results, { + command: "runTests", + }); + } +} diff --git a/cli/src/utils.js b/cli/src/utils.js index c9b7650..c808a88 100644 --- a/cli/src/utils.js +++ b/cli/src/utils.js @@ -5,6 +5,7 @@ const path = require("path"); const fs = require("fs"); const { spawn } = require("child_process"); const os = require("os"); +const axios = require("axios"); exports.setArgs = setArgs; exports.setConfig = setConfig; @@ -12,6 +13,26 @@ exports.outputResults = outputResults; exports.spawnCommand = spawnCommand; exports.setMeta = setMeta; exports.getVersionData = getVersionData; +exports.log = log; +exports.getResolvedTestsFromEnv = getResolvedTestsFromEnv; +exports.reportResults = reportResults; + +// Log function that respects logLevel +function log(config = {}, level = "info", message) { + const logLevels = ["silent", "error", "warning", "info", "debug"]; + const currentLevel = config.logLevel || "info"; + const currentLevelIndex = logLevels.indexOf(currentLevel); + const messageLevelIndex = logLevels.indexOf(level); + + // Only log if the message level is at or above the current log level + if (currentLevelIndex >= messageLevelIndex && messageLevelIndex > 0) { + if (level === "error") { + console.error(message); + } else { + console.log(message); + } + } +} // Define args function setArgs(args) { @@ -50,6 +71,119 @@ function setArgs(args) { return argv; } +// Get resolved tests from environment variable, if set +async function getResolvedTestsFromEnv(config = {}) { + if (!process.env.DOC_DETECTIVE_API) { + return null; + } + + let resolvedTests = null; + let apiConfig = null; + try { + // Parse the environment variable as JSON + apiConfig = JSON.parse(process.env.DOC_DETECTIVE_API); + + // Validate the structure: { accountId, url, token, contextIds } + if (!apiConfig.accountId || !apiConfig.url || !apiConfig.token || !apiConfig.contextIds) { + log( + config, + "error", + "Invalid DOC_DETECTIVE_API: must contain 'accountId', 'url', 'token', and 'contextIds' properties" + ); + process.exit(1); + } + + log(config, "debug", `CLI:Fetching resolved tests from ${apiConfig.url}/resolved-tests`); + + // Make GET request to the specified URL with token in header + const response = await axios.get(`${apiConfig.url}/resolved-tests`, { + headers: { + "x-runner-token": apiConfig.token, + }, + }); + + // The response is the resolvedTests + resolvedTests = response.data; + + // Validate against resolvedTests_v3 schema + const validation = validate({ + schemaKey: "resolvedTests_v3", + object: resolvedTests, + }); + + if (!validation.valid) { + log( + config, + "error", + "Invalid resolvedTests from API response. " + validation.errors + ); + process.exit(1); + } + + // Get config from environment variable for merging + const envConfig = await getConfigFromEnv(); + if (envConfig) { + // Apply config overrides to resolvedTests.config + if (resolvedTests.config) { + resolvedTests.config = { ...resolvedTests.config, ...envConfig }; + } else { + resolvedTests.config = envConfig; + } + } + + log( + config, + "debug", + `CLI:RESOLVED_TESTS:\n${JSON.stringify(resolvedTests, null, 2)}` + ); + } catch (error) { + log( + config, + "error", + `Error fetching resolved tests from DOC_DETECTIVE_API: ${error.message}` + ); + process.exit(1); + } + return { apiConfig, resolvedTests }; +} + +async function getConfigFromEnv() { + if (!process.env.DOC_DETECTIVE_CONFIG) { + return null; + } + + let envConfig = null; + try { + // Parse the environment variable as JSON + envConfig = JSON.parse(process.env.DOC_DETECTIVE_CONFIG); + + // Validate the environment variable config + const envValidation = validate({ + schemaKey: "config_v3", + object: envConfig, + }); + + if (!envValidation.valid) { + log( + envConfig, + "error", + `Invalid config from DOC_DETECTIVE_CONFIG environment variable. ${envValidation.errors}` + ); + process.exit(1); + } + + log(envConfig, "debug", `CLI:ENV_CONFIG:\n${JSON.stringify(envConfig, null, 2)}`); + } catch (error) { + log( + {}, + "error", + `Error parsing DOC_DETECTIVE_CONFIG environment variable: ${error.message}` + ); + process.exit(1); + } + return envConfig; +} + // Override config values based on args and validate the config async function setConfig({ configPath, args }) { if (args.config && !configPath) { @@ -67,6 +201,13 @@ async function setConfig({ configPath, args }) { } } + // Check for DOC_DETECTIVE_CONFIG environment variable + const envConfig = await getConfigFromEnv(); + if (envConfig) { + // Merge with file config, preferring environment variable config (use raw envConfig, not validated with defaults) + config = { ...config, ...envConfig }; + } + // Validate config const validation = validate({ schemaKey: "config_v3", @@ -85,10 +226,10 @@ async function setConfig({ configPath, args }) { ...config, input: config.input || ".", output: config.output || ".", - recursive: config.recursive || true, + recursive: config.recursive ?? true, relativePathBase: config.relativePathBase || "file", loadVariables: config.loadVariables || ".env", - detectSteps: config.detectSteps || true, + detectSteps: config.detectSteps ?? true, logLevel: config.logLevel || "info", fileTypes: config.fileTypes || ["markdown", "asciidoc", "html"], telemetry: config.telemetry || { send: true }, @@ -588,6 +729,68 @@ function registerReporter(name, reporterFunction) { // Export the registerReporter function exports.registerReporter = registerReporter; +async function reportResults({ config = {}, apiConfig, results }) { + // Transform results into the required format for the API + // Extract contexts from the nested structure and format them + const contexts = []; + + if (results.specs) { + results.specs.forEach((spec) => { + if (spec.tests) { + spec.tests.forEach((test) => { + if (test.contexts) { + test.contexts.forEach((context) => { + // Extract or generate contextId + const contextId = + context.contextId; + + // Convert result status to lowercase (PASS -> passed, FAIL -> failed, etc.) + let status; + if (context.result === "PASS") { + status = "passed"; + } else if (context.result === "FAIL") { + status = "failed"; + } else if (context.result === "WARNING") { + status = "warning"; + } else if (context.result === "SKIPPED") { + status = "skipped"; + } + if (!status) { + log(config, "error", `Unknown context result status for context ID ${contextId}`); + return; + } + + // Build the context payload with the entire context object embedded + contexts.push({ + contextId: contextId, + status: status, + result: context, + }); + }); + } + }); + } + }); + } + + // POST to the /contexts endpoint + try { + const url = `${apiConfig.url}/contexts`; + const payload = { contexts }; + + const response = await axios.post(url, payload, { + headers: { + "x-runner-token": apiConfig.token, + }, + }); + console.log("Results reported successfully:", response.data); + } catch (error) { + console.error( + `Error reporting results to ${apiConfig.url}/contexts: ${error.message}` + ); + } +} + async function outputResults(config = {}, outputPath, results, options = {}) { // Default to using both built-in reporters if none specified const defaultReporters = ["terminal", "json"]; @@ -653,7 +856,9 @@ async function spawnCommand(cmd, args) { } } - const runCommand = spawn(cmd, args); + const runCommand = spawn(cmd, args, { + env: process.env, // Explicitly pass environment variables + }); // Capture stdout let stdout = ""; diff --git a/cli/test/builder/DebugRunner.test.mjs b/cli/test/builder/DebugRunner.test.mjs new file mode 100644 index 0000000..6615b70 --- /dev/null +++ b/cli/test/builder/DebugRunner.test.mjs @@ -0,0 +1,441 @@ +/** + * Tests for DebugRunner.mjs - Interactive step-by-step test execution component + * + * Uses ink-testing-library for component rendering and Sinon for stubbing getRunner. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; +import * as sinon from 'sinon'; + +const require = createRequire(import.meta.url); + +import DebugRunner from '../../src/cli/builder/DebugRunner.mjs'; +import { + getMockTest, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockStepResult, + getMockFailedStepResult, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +/** + * Polls until a condition is met or timeout is reached. + * @param {() => boolean} conditionFn - Function that returns true when condition is met + * @param {object} options - Polling options + * @param {number} options.timeout - Maximum time to wait in ms (default: 2000) + * @param {number} options.interval - Polling interval in ms (default: 20) + * @returns {Promise} Resolves when condition is met, rejects on timeout + */ +const waitForCondition = async (conditionFn, { timeout = 2000, interval = 20 } = {}) => { + const startTime = Date.now(); + while (Date.now() - startTime < timeout) { + if (conditionFn()) { + return; + } + await new Promise(resolve => setTimeout(resolve, interval)); + } + throw new Error(`waitForCondition timed out after ${timeout}ms`); +}; + +/** + * Waits for the rendered frame to contain specific text. + * @param {() => string} lastFrameFn - Function that returns the current frame + * @param {string} text - Text to wait for + * @param {object} options - Polling options + * @returns {Promise} + */ +const waitForText = async (lastFrameFn, text, options = {}) => { + await waitForCondition(() => { + const frame = lastFrameFn(); + return frame && frame.includes(text); + }, options); +}; + +describe('DebugRunner component', function () { + // Store original require for stubbing + let coreModule; + let sandbox; + + before(function () { + // Get reference to doc-detective-core module + coreModule = require('doc-detective-core'); + }); + + beforeEach(function () { + sandbox = sinon.createSandbox(); + }); + + afterEach(function () { + sandbox.restore(); + }); + + describe('initialization phase', function () { + it('shows loading message during initialization', function () { + // Stub getRunner to delay initialization + sandbox.stub(coreModule, 'getRunner').returns(new Promise(() => {})); // Never resolves + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Starting browser'); + }); + }); + + describe('goTo requirement check', function () { + it('shows warning when first browser action has no goTo', async function () { + // Create a mock runner that resolves quickly + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockClickStep('.button')], // Click without goTo first + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for component to show navigation warning + await waitForText(lastFrame, 'Navigation'); + + const frame = lastFrame(); + expect(frame).to.include('Navigation'); + }); + + it('proceeds to step preview when goTo exists', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + ], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for step preview to render + await waitForText(lastFrame, 'Step 1'); + + const frame = lastFrame(); + expect(frame).to.include('Step 1'); + }); + }); + + describe('step preview phase', function () { + it('displays current step information', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for step info to render + await waitForText(lastFrame, 'goTo'); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + expect(frame).to.include('example.com'); + }); + + it('shows Run this step option', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for menu options to render + await waitForText(lastFrame, 'Run this step'); + + const frame = lastFrame(); + expect(frame).to.include('Run this step'); + }); + + it('shows Edit step option', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for menu options to render + await waitForText(lastFrame, 'Edit step'); + + const frame = lastFrame(); + expect(frame).to.include('Edit step'); + }); + + it('shows Stop debug session option', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for menu options to render + await waitForText(lastFrame, 'Stop debug'); + + const frame = lastFrame(); + expect(frame).to.include('Stop debug'); + }); + + it('displays step count correctly', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + getMockFindStep('.result'), + ], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for step count to render + await waitForText(lastFrame, '1/3'); + + const frame = lastFrame(); + expect(frame).to.include('1/3'); + }); + }); + + describe('error handling', function () { + it('shows error phase when runner initialization fails', async function () { + sandbox.stub(coreModule, 'getRunner').rejects(new Error('Browser not installed')); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for error message to render + await waitForText(lastFrame, 'Error'); + + const frame = lastFrame(); + expect(frame).to.include('Error'); + expect(frame).to.include('Browser'); + }); + }); + + describe('progress tracking', function () { + it('displays passed/failed counts', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for progress tracking to render + await waitForText(lastFrame, 'passed'); + + const frame = lastFrame(); + expect(frame).to.include('passed'); + expect(frame).to.include('failed'); + }); + }); +}); + +describe('DebugRunner smoke test', function () { + this.timeout(60000); // Browser tests can be slow + + // Skip by default - enable for integration testing + // Remove .skip to run actual browser test + describe.skip('real browser execution', function () { + let server; + + before(async function () { + // Use existing test server if available + const { createServer } = await import('../server/index.js'); + server = createServer({ port: 8093 }); + await server.start(); + }); + + after(async function () { + if (server) { + await server.stop(); + } + }); + + it('executes goTo step successfully with real browser', async function () { + const { getRunner } = require('doc-detective-core'); + + const { runner, runStep, cleanup } = await getRunner({ headless: true }); + + try { + const step = getMockGoToStep('http://localhost:8093'); + + const result = await runStep({ + config: {}, + context: {}, + step, + driver: runner, + metaValues: {}, + options: {}, + }); + + expect(result.status).to.equal('PASS'); + } finally { + await cleanup(); + } + }); + }); +}); diff --git a/cli/test/builder/SpecSelector.test.mjs b/cli/test/builder/SpecSelector.test.mjs new file mode 100644 index 0000000..dceb09e --- /dev/null +++ b/cli/test/builder/SpecSelector.test.mjs @@ -0,0 +1,496 @@ +/** + * Tests for SpecSelector.mjs - Spec selector component for choosing which spec to edit + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +import SpecSelector from '../../src/cli/builder/SpecSelector.mjs'; +import { + getMockSpec, + getMockTest, + getMockGoToStep, + getMockCompleteSpec, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('SpecSelector component', function () { + const tempDir = path.join(__dirname, 'temp'); + + describe('header display', function () { + it('displays Doc Detective Test Builder title', function () { + const specs = [{ + spec: getMockSpec({ specId: 'test-spec' }), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Doc Detective Test Builder'); + }); + + it('displays instruction to select a specification', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Select a specification to edit'); + }); + }); + + describe('spec count display', function () { + it('displays single spec count correctly', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Found 1 specification'); + }); + + it('displays multiple specs count correctly', function () { + const specs = [ + { + spec: getMockSpec({ specId: 'spec-1' }), + filePath: path.join(tempDir, 'test1.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: getMockSpec({ specId: 'spec-2' }), + filePath: path.join(tempDir, 'test2.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: getMockSpec({ specId: 'spec-3' }), + filePath: path.join(tempDir, 'test3.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + ]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Found 3 specifications'); + }); + }); + + describe('spec list display', function () { + it('displays spec ID', function () { + const specs = [{ + spec: getMockSpec({ specId: 'my-awesome-spec' }), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('my-awesome-spec'); + }); + + it('displays file name', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'unique-filename.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('unique-filename.spec.json'); + }); + + it('displays test count', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ steps: [getMockGoToStep()] }), + getMockTest({ steps: [getMockGoToStep()] }), + ], + }); + const specs = [{ + spec, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('2 tests'); + }); + + it('displays singular test label for one test', function () { + const spec = getMockSpec({ + tests: [getMockTest({ steps: [getMockGoToStep()] })], + }); + const specs = [{ + spec, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('1 test'); + }); + + it('displays zero tests count', function () { + const spec = getMockSpec({ tests: [] }); + const specs = [{ + spec, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('0 tests'); + }); + }); + + describe('validation status display', function () { + it('displays checkmark for valid spec', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('✅'); + }); + + it('displays warning for invalid spec', function () { + const specs = [{ + spec: { tests: 'invalid' }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: false, + validationErrors: 'tests must be an array', + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('⚠️'); + }); + + it('displays validation error message for invalid spec', function () { + const specs = [{ + spec: { tests: 'invalid' }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: false, + validationErrors: 'tests must be an array', + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('tests must be an array'); + }); + }); + + describe('menu options', function () { + it('displays create new specification option', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Create new specification'); + }); + + // Note: Exit option may be off-screen in ScrollableSelect with many items + // The component does have an exit option but it may not be visible in initial render + it('component includes menu items for navigation', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + // Should have navigation hints + expect(frame).to.include('↑↓'); + }); + }); + + describe('navigation hint', function () { + it('displays keyboard navigation hint', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('↑↓'); + expect(frame).to.include('Enter'); + }); + }); + + describe('multiple specs handling', function () { + it('displays all specs in list', function () { + const specs = [ + { + spec: getMockSpec({ specId: 'first-spec' }), + filePath: path.join(tempDir, 'first.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: getMockSpec({ specId: 'second-spec' }), + filePath: path.join(tempDir, 'second.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + ]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('first-spec'); + expect(frame).to.include('second-spec'); + }); + + it('displays mix of valid and invalid specs', function () { + const specs = [ + { + spec: getMockSpec({ specId: 'valid-spec' }), + filePath: path.join(tempDir, 'valid.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: { specId: 'invalid-spec', tests: 'not-array' }, + filePath: path.join(tempDir, 'invalid.spec.json'), + extension: '.json', + isValid: false, + validationErrors: 'tests must be array', + }, + ]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('✅'); + expect(frame).to.include('⚠️'); + }); + }); + + describe('fallback spec ID', function () { + it('uses id field when specId is not set', function () { + const specs = [{ + spec: { id: 'fallback-id', tests: [] }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('fallback-id'); + }); + + it('uses Spec N when no id fields are set', function () { + const specs = [{ + spec: { tests: [] }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Spec 1'); + }); + }); + + describe('file path handling', function () { + it('handles null file path gracefully', function () { + const specs = [{ + spec: getMockSpec({ specId: 'no-file-spec' }), + filePath: null, + extension: null, + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('no-file-spec'); + }); + }); + + describe('different file extensions', function () { + it('handles JSON extension', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.json'); + }); + + it('handles YAML extension', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.yaml'), + extension: '.yaml', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.yaml'); + }); + + it('handles YML extension', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.yml'), + extension: '.yml', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.yml'); + }); + }); +}); diff --git a/cli/test/builder/StepEditor.test.mjs b/cli/test/builder/StepEditor.test.mjs new file mode 100644 index 0000000..fcd13c2 --- /dev/null +++ b/cli/test/builder/StepEditor.test.mjs @@ -0,0 +1,379 @@ +/** + * Tests for StepEditor.mjs - Step editor component + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; + +const require = createRequire(import.meta.url); + +import StepEditor from '../../src/cli/builder/StepEditor.mjs'; +import { + getMockStep, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockTypeStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('StepEditor component', function () { + // Common callback stubs + const noopCallbacks = { + onChange: () => {}, + onSave: () => {}, + onCancel: () => {}, + onDelete: () => {}, + }; + + describe('step type selection', function () { + it('shows step type selector when step has no action', function () { + const emptyStep = {}; + const { lastFrame } = render( + React.createElement(StepEditor, { + step: emptyStep, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Select Step Type'); + }); + + it('lists available step types', function () { + const emptyStep = {}; + const { lastFrame } = render( + React.createElement(StepEditor, { + step: emptyStep, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + expect(frame).to.include('click'); + expect(frame).to.include('find'); + }); + }); + + describe('menu display for existing step', function () { + it('shows Edit Step header with step type', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Edit Step'); + expect(frame).to.include('goTo'); + }); + + it('displays current step value', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('https://example.com'); + }); + + it('shows Add field option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add field'); + }); + + it('shows Preview JSON option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Preview JSON'); + }); + + it('shows Change step type option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Change step type'); + }); + + it('shows Save step option for valid step', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save step'); + }); + + it('shows Delete step option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Delete step'); + }); + + it('shows Back option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Back'); + }); + }); + + describe('step index display', function () { + it('displays correct step number', function () { + const step = getMockGoToStep(); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 2, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Step 3'); // 0-indexed to 1-indexed + }); + }); + + describe('different step types', function () { + it('displays click step correctly', function () { + const step = getMockClickStep('.submit-button'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('click'); + expect(frame).to.include('.submit-button'); + }); + + it('displays find step correctly', function () { + const step = getMockFindStep('#main-content'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('find'); + expect(frame).to.include('#main-content'); + }); + + it('displays type step with array value', function () { + const step = getMockTypeStep(['test input', '$ENTER$']); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('type'); + }); + }); + + describe('object form steps', function () { + it('displays object properties for detailed step', function () { + const step = { + goTo: { + url: 'https://example.com', + wait: { duration: 5000 }, + }, + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + }); + + describe('step with common properties', function () { + it('displays step with description', function () { + const step = { + goTo: 'https://example.com', + description: 'Navigate to homepage', + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('description'); + expect(frame).to.include('Navigate'); + }); + + it('displays step with stepId', function () { + const step = { + goTo: 'https://example.com', + stepId: 'nav-step', + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('stepId'); + expect(frame).to.include('nav-step'); + }); + }); + + describe('validation display', function () { + it('shows warning message when step has validation errors', function () { + // Create a step with an invalid value that will fail schema validation + // An empty object for goTo is invalid since goTo requires either a string URL + // or an object with required 'url' property + const step = { + goTo: { url: '' }, // Empty required field fails validation + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + // StepEditor shows these specific messages when validation.valid is false: + // 1. A warning banner: '⚠️ Step has validation errors' + // 2. A menu item: '⚠️ Fix errors before saving' (instead of 'Save step') + expect(frame).to.include('Step has validation errors'); + expect(frame).to.include('Fix errors before saving'); + // Additionally, the 'Save step' option should NOT appear when invalid + expect(frame).to.not.include('Save step'); + }); + + it('shows save option when step is valid', function () { + const step = { + goTo: 'https://example.com', // Valid URL format + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + // When validation passes, 'Save step' should appear + expect(frame).to.include('Save step'); + // And the error messages should NOT appear + expect(frame).to.not.include('Step has validation errors'); + expect(frame).to.not.include('Fix errors before saving'); + }); + }); + + describe('source location preservation', function () { + it('handles step with sourceLocation metadata', function () { + const step = { + goTo: 'https://example.com', + sourceLocation: { + file: '/path/to/file.md', + isInline: true, + startOffset: 0, + endOffset: 50, + }, + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + // sourceLocation should not appear in the menu as it's internal metadata + expect(frame).to.include('goTo'); + expect(frame).to.not.include('sourceLocation'); + }); + }); +}); diff --git a/cli/test/builder/TestBuilder.test.mjs b/cli/test/builder/TestBuilder.test.mjs new file mode 100644 index 0000000..74e7ee8 --- /dev/null +++ b/cli/test/builder/TestBuilder.test.mjs @@ -0,0 +1,528 @@ +/** + * Tests for TestBuilder.mjs - Main test builder orchestrator component + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; +import * as fs from 'fs'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +import TestBuilder from '../../src/cli/builder/TestBuilder.mjs'; +import { + getMockSpec, + getMockTest, + getMockGoToStep, + getMockCompleteSpec, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +// Helper to wait for React state updates after input +const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + +describe('TestBuilder component', function () { + // Temp file handling for save tests + const tempDir = path.join(__dirname, 'temp'); + + before(function () { + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + }); + + afterEach(function () { + // Clean up temp files after each test + if (fs.existsSync(tempDir)) { + const files = fs.readdirSync(tempDir); + for (const file of files) { + fs.unlinkSync(path.join(tempDir, file)); + } + } + }); + + after(function () { + // Remove temp directory + if (fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true, force: true }); + } + }); + + describe('initial rendering', function () { + it('shows spec name input when no initial spec provided', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Doc Detective Test Builder'); + expect(frame).to.include('Spec name'); + }); + + it('shows menu when initial spec is provided', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 2 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test Builder'); + }); + + it('displays spec properties section', function () { + const spec = getMockSpec({ specId: 'my-spec', description: 'My description' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Spec Properties'); + }); + + it('displays tests section', function () { + const spec = getMockCompleteSpec({ testCount: 2, stepsPerTest: 1 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Tests'); + expect(frame).to.include('(2)'); + }); + }); + + describe('validation display', function () { + it('shows validation warning for invalid spec', function () { + const invalidSpec = { tests: 'not an array' }; + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: invalidSpec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + isValid: false, + validationErrors: 'tests must be an array', + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Validation Warning'); + }); + + it('shows save disabled message when no tests', function () { + const spec = getMockSpec(); // Empty tests array + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add at least one test'); + }); + }); + + describe('menu items', function () { + it('shows Add property option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add property'); + }); + + it('shows Add test option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add test'); + }); + + it('shows Preview option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Preview'); + }); + + it('shows Exit option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Exit'); + }); + + it('shows Debug option when tests have steps', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 2 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('debug'); + }); + + it('shows Save option when spec is valid with tests', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 1 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save'); + }); + }); + + describe('output path display', function () { + it('displays JSON output path for JSON input', function () { + const spec = getMockSpec(); + const inputPath = path.join(tempDir, 'test.spec.json'); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: inputPath, + inputFileExtension: '.json', + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.json'); + expect(frame).to.include('JSON'); + }); + + it('displays YAML output path for YAML input', function () { + const spec = getMockSpec(); + const inputPath = path.join(tempDir, 'test.spec.yaml'); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: inputPath, + inputFileExtension: '.yaml', + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.yaml'); + expect(frame).to.include('YAML'); + }); + }); + + describe('back button behavior', function () { + it('shows back option when onBack callback provided', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + onBack: () => {}, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Back to spec list'); + }); + + it('does not show back option when onBack not provided', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.not.include('Back to spec list'); + }); + }); + + describe('status bar', function () { + it('displays spec name in status bar', function () { + const spec = getMockSpec({ specId: 'my-test-spec' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'my-test-spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('my-test-spec'); + }); + }); + + describe('test list display', function () { + it('displays test descriptions in menu', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ testId: 'test-1', description: 'First test description', steps: [] }), + getMockTest({ testId: 'test-2', description: 'Second test description', steps: [] }), + ], + }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('First test'); + expect(frame).to.include('Second test'); + }); + + it('displays step count for each test', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 3 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('3 steps'); + }); + }); + + describe('creating a new spec', function () { + it('shows name input phase when no initial spec is provided', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Doc Detective Test Builder'); + expect(frame).to.include('Spec name'); + expect(frame).to.include('Create a new test specification'); + }); + + it('shows expected output path hint in name input phase', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Will be saved as'); + expect(frame).to.include('.spec.json'); + }); + + it('shows navigation hints in name input phase', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Press Enter to continue'); + expect(frame).to.include('Esc to exit'); + }); + + it('skips name phase when initial spec is provided', function () { + const spec = getMockSpec({ specId: 'pre-existing-spec' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'pre-existing-spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + // Should go directly to menu, not name input + expect(frame).to.not.include('Create a new test specification'); + expect(frame).to.include('Test Builder'); + expect(frame).to.include('pre-existing-spec'); + }); + + it('shows empty test list for new spec', function () { + const spec = getMockSpec({ specId: 'new-empty-spec', tests: [] }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'new-empty-spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Tests (0)'); + expect(frame).to.include('Add at least one test'); + }); + + it('uses specId from initialSpec when provided', function () { + const spec = getMockSpec({ specId: 'custom-spec-id' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('custom-spec-id'); + }); + + it('derives spec name from filename when specId not in initialSpec', function () { + const spec = getMockSpec(); + delete spec.specId; + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'my-derived-name.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('my-derived-name.spec'); + }); + + it('allows entering a spec name via keyboard input', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Initial state: name input phase with placeholder + let frame = lastFrame(); + expect(frame).to.include('Spec name'); + expect(frame).to.include('my-tests'); // placeholder + + // Type a spec name (full string at once) + stdin.write('my-spec'); + + // Wait for React to process the input + await delay(50); + + frame = lastFrame(); + expect(frame).to.include('my-spec'); + expect(frame).to.include('my-spec.spec.json'); + }); + + it('transitions to menu phase after entering name and pressing Enter', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Type a spec name + stdin.write('test-spec'); + await delay(50); + + // Press Enter to submit + stdin.write('\r'); + await delay(50); + + // Should transition to menu phase + const frame = lastFrame(); + expect(frame).to.include('Test Builder'); + expect(frame).to.include('test-spec'); + expect(frame).to.include('Tests (0)'); + expect(frame).to.include('Add test'); + }); + + it('does not transition to menu if spec name is empty when Enter is pressed', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Initial state: name input phase + let frame = lastFrame(); + expect(frame).to.include('Spec name'); + + // Press Enter without entering a name (spec name is empty by default) + stdin.write('\r'); + await delay(50); + + // Should stay in name input phase + frame = lastFrame(); + expect(frame).to.include('Spec name'); + expect(frame).to.include('Create a new test specification'); + }); + + it('initializes spec with specId matching entered name', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Type a spec name and submit + stdin.write('my-initialized-spec'); + await delay(50); + + stdin.write('\r'); + await delay(50); + + // Should be in menu phase with the spec initialized + const frame = lastFrame(); + expect(frame).to.include('my-initialized-spec'); + expect(frame).to.include('specId: my-initialized-spec'); + }); + }); +}); diff --git a/cli/test/builder/TestEditor.test.mjs b/cli/test/builder/TestEditor.test.mjs new file mode 100644 index 0000000..5f95dc6 --- /dev/null +++ b/cli/test/builder/TestEditor.test.mjs @@ -0,0 +1,672 @@ +/** + * Tests for TestEditor.mjs - Test editor component + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import TestEditor from '../../src/cli/builder/TestEditor.mjs'; +import { + getMockTest, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockTypeStep, + getMockInlineStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('TestEditor component', function () { + // Common callback stubs + const noopCallbacks = { + onChange: () => {}, + onSave: () => {}, + onCancel: () => {}, + onDelete: () => {}, + }; + + describe('initial rendering', function () { + it('displays Edit Test header', function () { + const test = getMockTest({ description: 'My test' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Edit Test'); + }); + + it('displays test description in header', function () { + const test = getMockTest({ description: 'Navigation test suite' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Navigation test suite'); + }); + + it('displays correct test index in status bar', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 2, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test 3'); // 0-indexed to 1-indexed + }); + }); + + describe('menu structure', function () { + it('displays Test Properties section', function () { + const test = getMockTest({ testId: 'my-test' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test Properties'); + }); + + it('displays Steps section', function () { + const test = getMockTest({ steps: [] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps'); + }); + + it('shows Add property option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add property'); + }); + + it('shows Delete property option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Delete property'); + }); + + it('shows Add step option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add step'); + }); + + it('shows Preview JSON option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Preview JSON'); + }); + + it('shows Save test option for valid test', function () { + const test = getMockTest({ steps: [getMockGoToStep()] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save test'); + }); + + it('shows Delete test option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Delete test'); + }); + + it('shows Back option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Back'); + }); + }); + + describe('test metadata display', function () { + it('displays testId when set', function () { + const test = getMockTest({ testId: 'nav-test-001' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('testId'); + expect(frame).to.include('nav-test-001'); + }); + + it('displays description when set', function () { + const test = getMockTest({ description: 'Test user login flow' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('description'); + expect(frame).to.include('Test user login'); + }); + + it('truncates long values', function () { + const longDescription = 'A'.repeat(100); + const test = getMockTest({ description: longDescription }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('...'); + }); + }); + + describe('steps display', function () { + it('displays step count', function () { + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + getMockFindStep('.element'), + ], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (3)'); + }); + + it('displays zero steps count', function () { + const test = getMockTest({ steps: [] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (0)'); + }); + + it('displays step type and number', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('1.'); + expect(frame).to.include('goTo'); + }); + + it('displays step value for string actions', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com/page')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('https://example.com/page'); + }); + + it('displays multiple steps in order', function () { + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.submit'), + getMockFindStep('.result'), + ], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('1.'); + expect(frame).to.include('goTo'); + expect(frame).to.include('2.'); + expect(frame).to.include('click'); + expect(frame).to.include('3.'); + expect(frame).to.include('find'); + }); + + it('truncates long step values', function () { + const longUrl = 'https://example.com/' + 'a'.repeat(100); + const test = getMockTest({ + steps: [getMockGoToStep(longUrl)], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('...'); + }); + }); + + describe('step types handling', function () { + it('displays goTo step correctly', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + + it('displays click step correctly', function () { + const test = getMockTest({ + steps: [getMockClickStep('.button')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('click'); + }); + + it('displays find step correctly', function () { + const test = getMockTest({ + steps: [getMockFindStep('#element')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('find'); + }); + + it('displays type step correctly', function () { + const test = getMockTest({ + steps: [getMockTypeStep(['test input'])], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('type'); + }); + + it('handles step with object value', function () { + const test = getMockTest({ + steps: [{ + goTo: { + url: 'https://example.com', + wait: { duration: 5000 }, + }, + }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + + it('handles step with unknown action type gracefully', function () { + const test = getMockTest({ + steps: [{ unknownAction: 'value' }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('unknown'); + }); + }); + + describe('validation display', function () { + it('shows validation warning for invalid test', function () { + // A test with steps containing unknown action types might fail validation + const test = { + testId: 'test-1', + steps: [{ invalidStep: true }], + }; + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('validation errors'); + }); + + it('shows fix errors message for invalid test', function () { + const test = { + testId: 'test-1', + steps: [{ invalidStep: true }], + }; + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Fix errors'); + }); + + it('shows save option for valid test', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save test'); + }); + }); + + describe('sourceLocation handling', function () { + it('does not display sourceLocation in step list', function () { + const test = getMockTest({ + steps: [getMockInlineStep('goTo', 'https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.not.include('sourceLocation'); + }); + }); + + describe('hint display', function () { + it('shows navigation hint', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('↑↓'); + expect(frame).to.include('Enter'); + }); + }); + + describe('steps with common properties', function () { + it('displays step with description', function () { + const test = getMockTest({ + steps: [{ + goTo: 'https://example.com', + description: 'Navigate to homepage', + }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + + it('displays step with stepId', function () { + const test = getMockTest({ + steps: [{ + goTo: 'https://example.com', + stepId: 'step-1', + }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + }); + + describe('empty test handling', function () { + it('handles test with no steps', function () { + const test = getMockTest({ steps: [] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (0)'); + expect(frame).to.include('Add step'); + }); + + it('handles test with undefined steps', function () { + const test = { testId: 'test-1' }; // No steps property + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (0)'); + }); + + it('handles test with minimal properties', function () { + const test = { testId: 'minimal-test' }; + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Edit Test'); + expect(frame).to.include('testId'); + }); + }); + + describe('status bar display', function () { + it('displays test number in status bar', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test 1'); + }); + + it('displays different test numbers correctly', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 4, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test 5'); + }); + }); +}); diff --git a/cli/test/builder/editor.test.mjs b/cli/test/builder/editor.test.mjs new file mode 100644 index 0000000..e4d76f7 --- /dev/null +++ b/cli/test/builder/editor.test.mjs @@ -0,0 +1,452 @@ +/** + * CLI Editor Integration Tests + * + * Tests the --editor flag CLI entry point and argument parsing. + * Uses spawnCommand() pattern from existing CLI tests. + */ + +import { createRequire } from 'module'; +import path from 'path'; +import fs from 'fs'; +import os from 'os'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const { expect } = await import('chai'); + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Path to CLI entry point +const CLI_PATH = path.resolve(__dirname, '../../src/index.js'); + +// Helper to create temp directory with cleanup +const createTempDir = () => { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'dd-editor-test-')); + return tempDir; +}; + +// Helper to create a test spec file +const createTestSpecFile = (dir, filename, content) => { + const filePath = path.join(dir, filename); + fs.writeFileSync(filePath, JSON.stringify(content, null, 2)); + return filePath; +}; + +// Helper to spawn CLI with timeout (for interactive commands) +const spawnWithTimeout = async (args, options = {}) => { + const { spawn } = await import('child_process'); + const timeout = options.timeout || 3000; + + return new Promise((resolve) => { + const child = spawn('node', [CLI_PATH, ...args], { + env: { ...process.env, ...options.env }, + cwd: options.cwd || process.cwd(), + stdio: ['pipe', 'pipe', 'pipe'], + }); + + let stdout = ''; + let stderr = ''; + + child.stdout.on('data', (data) => { + stdout += data.toString(); + }); + + child.stderr.on('data', (data) => { + stderr += data.toString(); + }); + + // For interactive commands, we can't wait for natural exit + // Send interrupt after timeout to capture initial output + const timer = setTimeout(() => { + child.kill('SIGTERM'); + }, timeout); + + child.on('close', (exitCode) => { + clearTimeout(timer); + resolve({ stdout, stderr, exitCode }); + }); + + child.on('error', (err) => { + clearTimeout(timer); + resolve({ stdout, stderr, exitCode: null, error: err.message }); + }); + }); +}; + +describe('CLI Editor Integration', function() { + // These tests may take time due to CLI startup + this.timeout(30000); + + let tempDir; + + beforeEach(() => { + tempDir = createTempDir(); + }); + + afterEach(() => { + // Clean up temp directory + if (tempDir && fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true, force: true }); + } + }); + + describe('--editor flag recognition', () => { + it('should recognize --editor flag', async () => { + // Create a valid spec file + const specContent = { + specId: 'test-spec', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'test.spec.json', specContent); + + // Run with --editor flag - it will start interactive mode + // We just want to verify it starts without immediate errors + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + // Interactive mode should not produce errors on startup + // It may exit with SIGTERM since we kill it + expect(result.stderr).to.not.include('Error:'); + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should recognize -e short flag', async () => { + const specContent = { + specId: 'test-spec', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'test.spec.json', specContent); + + const result = await spawnWithTimeout(['-e', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('Error:'); + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('input file handling', () => { + it('should accept --input flag with spec file', async () => { + const specContent = { + specId: 'input-test-spec', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'input-test.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '--input', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + // Should not have startup errors + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should accept -i short flag with spec file', async () => { + const specContent = { + specId: 'short-flag-test', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'short-flag.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should accept --input=value format', async () => { + const specContent = { + specId: 'equals-format-test', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'equals-format.spec.json', specContent); + + const result = await spawnWithTimeout([`--editor`, `--input=${specPath}`], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should error when no valid specs found', async () => { + // Create an empty file that won't be detected as a valid spec + const emptyPath = path.join(tempDir, 'empty.txt'); + fs.writeFileSync(emptyPath, ''); + + const result = await spawnWithTimeout(['--editor', '-i', emptyPath], { + timeout: 3000, + cwd: tempDir, + }); + + // Should have an error message about no valid specs + expect(result.stderr).to.include('No valid spec files'); + }); + + it('should accept comma-separated input paths', async () => { + const spec1Content = { + specId: 'multi-input-1', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const spec2Content = { + specId: 'multi-input-2', + tests: [{ + testId: 'test-2', + steps: [{ wait: 100 }] + }] + }; + const specPath1 = createTestSpecFile(tempDir, 'multi1.spec.json', spec1Content); + const specPath2 = createTestSpecFile(tempDir, 'multi2.spec.json', spec2Content); + + const result = await spawnWithTimeout( + ['--editor', '-i', `${specPath1},${specPath2}`], + { + timeout: 2000, + cwd: tempDir, + } + ); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('YAML spec file support', () => { + it('should accept YAML spec files', async () => { + // Create a YAML spec file + const yamlContent = `id: yaml-test-spec +tests: + - id: yaml-test-1 + steps: + - action: wait + duration: 100 +`; + const yamlPath = path.join(tempDir, 'test.spec.yaml'); + fs.writeFileSync(yamlPath, yamlContent); + + const result = await spawnWithTimeout(['--editor', '-i', yamlPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('positional arguments', () => { + it('should accept spec file path as positional argument', async () => { + const specContent = { + specId: 'positional-test', + tests: [{ + testId: 'test-1', + steps: [{ wait: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'positional.spec.json', specContent); + + // Pass file path as positional argument (after --editor) + const result = await spawnWithTimeout(['--editor', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('markdown file support', () => { + it('should accept markdown files with inline tests', async () => { + const markdownContent = `# Test Documentation + +This is a test document with inline tests. + + + + +More documentation content. +`; + const mdPath = path.join(tempDir, 'doc-with-tests.md'); + fs.writeFileSync(mdPath, markdownContent); + + const result = await spawnWithTimeout(['--editor', '-i', mdPath], { + timeout: 3000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('output handling', () => { + it('should not produce JavaScript errors on startup', async () => { + const specContent = { + id: 'startup-test', + tests: [{ + id: 'test-1', + steps: [{ goTo: 'https://example.com' }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'startup.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('ReferenceError'); + expect(result.stderr).to.not.include('TypeError'); + expect(result.stderr).to.not.include('Cannot find module'); + }); + }); + + describe('complex spec files', () => { + it('should handle spec with multiple tests', async () => { + const specContent = { + specId: 'multi-test-spec', + tests: [ + { + testId: 'test-1', + description: 'First test', + steps: [{ goTo: 'https://example.com/page1' }] + }, + { + testId: 'test-2', + description: 'Second test', + steps: [ + { goTo: 'https://example.com/page2' }, + { click: '.button' } + ] + }, + { + testId: 'test-3', + description: 'Third test', + steps: [ + { goTo: 'https://example.com/page3' }, + { find: '.element' }, + { screenshot: 'result.png' } + ] + } + ] + }; + const specPath = createTestSpecFile(tempDir, 'multi-test.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + expect(result.stderr).to.not.include('Error:'); + }); + + it('should handle spec with all step types', async () => { + const specContent = { + specId: 'all-steps-spec', + tests: [{ + testId: 'test-1', + steps: [ + { goTo: 'https://example.com' }, + { click: '.button' }, + { find: '.element' }, + { type: ['test input', '$ENTER$'] }, + { screenshot: 'screenshot.png' }, + { wait: 1000 }, + { httpRequest: { url: 'https://api.example.com', method: 'GET' } }, + { runShell: 'echo test' } + ] + }] + }; + const specPath = createTestSpecFile(tempDir, 'all-steps.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('invalid spec handling', () => { + it('should handle spec with validation errors gracefully', async () => { + // Spec with invalid structure but parseable JSON + const specContent = { + id: 'invalid-spec', + tests: 'this should be an array' + }; + const specPath = createTestSpecFile(tempDir, 'invalid.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 3000, + cwd: tempDir, + }); + + // Should not crash with JavaScript errors + expect(result.stderr).to.not.include('TypeError'); + expect(result.stderr).to.not.include('Cannot read properties'); + }); + + it('should error on unparseable JSON', async () => { + const invalidJson = '{ this is not valid json }'; + const jsonPath = path.join(tempDir, 'broken.spec.json'); + fs.writeFileSync(jsonPath, invalidJson); + + const result = await spawnWithTimeout(['--editor', '-i', jsonPath], { + timeout: 3000, + cwd: tempDir, + }); + + // Should report the file couldn't be parsed + expect(result.stderr).to.include('No valid spec files'); + }); + }); + + describe('environment handling', () => { + it('should work without any environment variables', async () => { + const specContent = { + id: 'env-test', + tests: [{ + id: 'test-1', + steps: [{ goTo: 'https://example.com' }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'env-test.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + env: { + PATH: process.env.PATH, + NODE_PATH: process.env.NODE_PATH, + }, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); +}); diff --git a/cli/test/builder/fixtures.mjs b/cli/test/builder/fixtures.mjs new file mode 100644 index 0000000..c88f82e --- /dev/null +++ b/cli/test/builder/fixtures.mjs @@ -0,0 +1,266 @@ +/** + * Test data factories for CLI builder tests + * + * These factories create valid test objects with sensible defaults, + * accepting optional partial overrides following the project pattern. + */ + +/** + * Create a mock spec object with sensible defaults. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid spec object + */ +export const getMockSpec = (overrides = {}) => { + return { + specId: 'test-spec', + description: 'Test specification', + tests: [], + ...overrides, + }; +}; + +/** + * Create a mock test object with sensible defaults. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid test object + */ +export const getMockTest = (overrides = {}) => { + return { + testId: 'test-1', + description: 'Test description', + steps: [], + ...overrides, + }; +}; + +/** + * Create a mock step object with sensible defaults. + * @param {string} actionType - The step action type (e.g., 'goTo', 'click', 'find') + * @param {*} actionValue - The value for the action + * @param {Object} overrides - Optional partial overrides for additional step properties + * @returns {Object} A valid step object + */ +export const getMockStep = (actionType = 'goTo', actionValue = 'https://example.com', overrides = {}) => { + return { + [actionType]: actionValue, + ...overrides, + }; +}; + +/** + * Create a mock goTo step. + * @param {string} url - The URL to navigate to + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid goTo step + */ +export const getMockGoToStep = (url = 'https://example.com', overrides = {}) => { + return getMockStep('goTo', url, overrides); +}; + +/** + * Create a mock click step. + * @param {string|Object} selectorOrOptions - CSS selector string or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid click step + */ +export const getMockClickStep = (selectorOrOptions = '.button', overrides = {}) => { + return getMockStep('click', selectorOrOptions, overrides); +}; + +/** + * Create a mock find step. + * @param {string|Object} selectorOrOptions - CSS selector string or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid find step + */ +export const getMockFindStep = (selectorOrOptions = '.element', overrides = {}) => { + return getMockStep('find', selectorOrOptions, overrides); +}; + +/** + * Create a mock type step. + * @param {string[]|Object} keysOrOptions - Array of keys or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid type step + */ +export const getMockTypeStep = (keysOrOptions = ['test input'], overrides = {}) => { + return getMockStep('type', keysOrOptions, overrides); +}; + +/** + * Create a mock screenshot step. + * @param {string|Object} pathOrOptions - Screenshot path or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid screenshot step + */ +export const getMockScreenshotStep = (pathOrOptions = 'screenshot.png', overrides = {}) => { + return getMockStep('screenshot', pathOrOptions, overrides); +}; + +/** + * Create a mock httpRequest step. + * @param {Object} options - HTTP request options + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid httpRequest step + */ +export const getMockHttpRequestStep = (options = {}, overrides = {}) => { + const defaultOptions = { + url: 'https://api.example.com/endpoint', + method: 'GET', + ...options, + }; + return getMockStep('httpRequest', defaultOptions, overrides); +}; + +/** + * Create a mock runShell step. + * @param {string|Object} commandOrOptions - Shell command or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid runShell step + */ +export const getMockRunShellStep = (commandOrOptions = 'echo "test"', overrides = {}) => { + return getMockStep('runShell', commandOrOptions, overrides); +}; + +/** + * Create a mock wait step. + * @param {number|Object} durationOrOptions - Duration in ms or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid wait step + */ +export const getMockWaitStep = (durationOrOptions = 1000, overrides = {}) => { + return getMockStep('wait', durationOrOptions, overrides); +}; + +/** + * Create a mock source location object for inline tests/steps. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid source location object + */ +export const getMockSourceLocation = (overrides = {}) => { + return { + file: '/path/to/source.md', + isInline: true, + startOffset: 0, + endOffset: 50, + commentFormat: 'htmlComment', + originalText: '', + isAutoDetected: false, + ...overrides, + }; +}; + +/** + * Create a mock step with source location metadata. + * @param {string} actionType - The step action type + * @param {*} actionValue - The value for the action + * @param {Object} sourceLocationOverrides - Overrides for the source location + * @returns {Object} A step with sourceLocation property + */ +export const getMockInlineStep = ( + actionType = 'goTo', + actionValue = 'https://example.com', + sourceLocationOverrides = {} +) => { + return { + [actionType]: actionValue, + sourceLocation: getMockSourceLocation(sourceLocationOverrides), + }; +}; + +/** + * Create a complete mock spec with tests and steps. + * @param {Object} options - Options for spec creation + * @param {number} options.testCount - Number of tests to create (default: 1) + * @param {number} options.stepsPerTest - Number of steps per test (default: 2) + * @param {Object} options.specOverrides - Overrides for the spec + * @returns {Object} A complete spec with tests and steps + */ +export const getMockCompleteSpec = (options = {}) => { + const { testCount = 1, stepsPerTest = 2, specOverrides = {} } = options; + + const tests = []; + for (let t = 0; t < testCount; t++) { + const steps = []; + + // First step is always goTo for browser tests + steps.push(getMockGoToStep(`https://example.com/page${t + 1}`)); + + // Add additional steps + for (let s = 1; s < stepsPerTest; s++) { + const stepTypes = ['find', 'click', 'screenshot']; + const stepType = stepTypes[s % stepTypes.length]; + + switch (stepType) { + case 'find': + steps.push(getMockFindStep(`#element-${t}-${s}`)); + break; + case 'click': + steps.push(getMockClickStep(`#button-${t}-${s}`)); + break; + case 'screenshot': + steps.push(getMockScreenshotStep(`screenshot-${t}-${s}.png`)); + break; + } + } + + tests.push(getMockTest({ + testId: `test-${t + 1}`, + description: `Test ${t + 1} description`, + steps, + })); + } + + return getMockSpec({ + specId: 'complete-spec', + description: 'Complete test specification', + tests, + ...specOverrides, + }); +}; + +/** + * Create a mock runner result for DebugRunner tests. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A mock step execution result + */ +export const getMockStepResult = (overrides = {}) => { + return { + status: 'PASS', + description: 'Step completed successfully', + ...overrides, + }; +}; + +/** + * Create a failed mock runner result. + * @param {string} errorMessage - The error message + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A mock failed step execution result + */ +export const getMockFailedStepResult = (errorMessage = 'Element not found', overrides = {}) => { + return getMockStepResult({ + status: 'FAIL', + description: errorMessage, + ...overrides, + }); +}; + +export default { + getMockSpec, + getMockTest, + getMockStep, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockTypeStep, + getMockScreenshotStep, + getMockHttpRequestStep, + getMockRunShellStep, + getMockWaitStep, + getMockSourceLocation, + getMockInlineStep, + getMockCompleteSpec, + getMockStepResult, + getMockFailedStepResult, +}; diff --git a/cli/test/builder/inlineSourceUpdates.test.mjs b/cli/test/builder/inlineSourceUpdates.test.mjs new file mode 100644 index 0000000..c900814 --- /dev/null +++ b/cli/test/builder/inlineSourceUpdates.test.mjs @@ -0,0 +1,977 @@ +/** + * Tests for inline source file updates - simulating user inputs to update markdown files + * + * Tests the complete flow of: + * 1. Creating markdown files with inline statements + * 2. Modifying the statements (simulating user edits) + * 3. Writing the updates back to the file + * 4. Verifying the output matches expected format + * + * Each test validates: + * - Comment types: htmlComment, jsxComment, linkReference + * - Syntax types: json, yaml, xml + */ + +import { createRequire } from 'module'; +import * as fs from 'fs'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const { + serializeStepToInline, + serializeTestToInline, + detectSyntaxFormat, + serializeToSyntax, + getDefaultCommentFormat, + prepareSourceUpdates, + batchUpdateSourceContent, +} = require('../../src/cli/builder/sourceFileUtils.js'); + +import { + getMockSpec, + getMockTest, + getMockGoToStep, + getMockClickStep, + getMockSourceLocation, + getMockInlineStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('Inline Source Updates - User Input Simulation', function () { + // Temp file handling + const tempDir = path.join(__dirname, 'temp-inline'); + + before(function () { + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + }); + + afterEach(function () { + // Clean up temp files after each test + if (fs.existsSync(tempDir)) { + const files = fs.readdirSync(tempDir); + for (const file of files) { + fs.unlinkSync(path.join(tempDir, file)); + } + } + }); + + after(function () { + // Remove temp directory + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir); + } + }); + + describe('Comment Type: htmlComment', function () { + describe('with JSON syntax', function () { + it('creates and updates a markdown file with HTML comment JSON step', function () { + const tempFile = path.join(tempDir, 'html-json-step.md'); + const originalContent = `# Test Documentation + +This is a test document. + + + +More content here. +`; + fs.writeFileSync(tempFile, originalContent); + + // Simulate user modifying the step + const modifiedStep = { + goTo: 'https://modified.com', + sourceLocation: { + file: tempFile, + isInline: true, + startOffset: originalContent.indexOf(''.length, + commentFormat: 'htmlComment', + originalText: '', + }, + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Verify serialization preserves JSON format + expect(serialized).to.match(/^$/); + expect(serialized).to.include('goTo'); + expect(serialized).to.include('https://modified.com'); + + // Apply update to file + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset: modifiedStep.sourceLocation.startOffset, + endOffset: modifiedStep.sourceLocation.endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + // Verify file content + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified.com'); + expect(updatedContent).to.not.include('https://original.com'); + expect(updatedContent).to.include(''); + }); + + it('creates and updates a test declaration with HTML comment JSON', function () { + const tempFile = path.join(tempDir, 'html-json-test.md'); + const originalContent = `# Test Documentation + + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const modifiedTest = { + testId: 'modified-test', + description: 'Modified description', + steps: [], + }; + + const serialized = serializeTestToInline({ + test: modifiedTest, + commentFormat: 'htmlComment', + originalText: '', + }); + + expect(serialized).to.match(/^') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('modified-test'); + expect(updatedContent).to.include('Modified description'); + }); + }); + + describe('with YAML syntax', function () { + it('creates and updates a markdown file with HTML comment YAML step', function () { + const tempFile = path.join(tempDir, 'html-yaml-step.md'); + const originalContent = `# Test Documentation + + + +More content. +`; + fs.writeFileSync(tempFile, originalContent); + + // Detect original syntax + const detectedSyntax = detectSyntaxFormat(''); + expect(detectedSyntax).to.equal('yaml'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Verify YAML format is preserved + expect(serialized).to.match(/^') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified.com'); + expect(updatedContent).to.include('goTo:'); + }); + + it('creates and updates multiline YAML step', function () { + const tempFile = path.join(tempDir, 'html-yaml-multiline.md'); + const originalContent = `# Test Documentation + + + +More content. +`; + fs.writeFileSync(tempFile, originalContent); + + const detectedSyntax = detectSyntaxFormat(originalContent.substring( + originalContent.indexOf('') + 3 + )); + expect(detectedSyntax).to.equal('yaml'); + + // Serialize with object form to get multiline YAML + const modifiedStep = { + goTo: { + url: 'https://modified.com', + timeout: 5000, + }, + }; + + const yamlContent = serializeToSyntax(modifiedStep, 'yaml', 'step'); + expect(yamlContent).to.include('\n'); + expect(yamlContent).to.include('goTo:'); + }); + + it('creates and updates a test declaration with HTML comment YAML', function () { + const tempFile = path.join(tempDir, 'html-yaml-test.md'); + const originalContent = `# Test Documentation + + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const modifiedTest = { + testId: 'modified-test', + description: 'Added description', + }; + + const serialized = serializeTestToInline({ + test: modifiedTest, + commentFormat: 'htmlComment', + originalText: '', + }); + + expect(serialized).to.include('testId:'); + expect(serialized).to.include('modified-test'); + + const startOffset = originalContent.indexOf(''.length, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('modified-test'); + }); + }); + + describe('with XML syntax', function () { + it('creates and updates a markdown file with HTML comment XML step', function () { + const tempFile = path.join(tempDir, 'html-xml-step.md'); + const originalContent = `# Test Documentation + + + +More content. +`; + fs.writeFileSync(tempFile, originalContent); + + const detectedSyntax = detectSyntaxFormat(''); + expect(detectedSyntax).to.equal('xml'); + + // Serialize to XML format + const xmlContent = serializeToSyntax({ goTo: 'https://modified.com' }, 'xml', 'step'); + expect(xmlContent).to.equal('goTo="https://modified.com"'); + + // Full serialization for step + const serialized = ``; + + const startOffset = originalContent.indexOf('') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('goTo="https://modified.com"'); + expect(updatedContent).to.not.include('https://original.com'); + }); + + it('serializes boolean and number values correctly in XML format', function () { + const xmlContent = serializeToSyntax({ enabled: true, timeout: 5000 }, 'xml', 'step'); + + expect(xmlContent).to.include('enabled=true'); + expect(xmlContent).to.include('timeout=5000'); + }); + + it('creates and updates a test declaration with HTML comment XML', function () { + const tempFile = path.join(tempDir, 'html-xml-test.md'); + const originalContent = `# Test Documentation + + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const detectedSyntax = detectSyntaxFormat(''); + expect(detectedSyntax).to.equal('xml'); + + const xmlContent = serializeToSyntax({ testId: 'modified-test', description: 'New description' }, 'xml', 'test'); + expect(xmlContent).to.include('testId="modified-test"'); + expect(xmlContent).to.include('description="New description"'); + }); + }); + }); + + describe('Comment Type: jsxComment', function () { + describe('with JSON syntax', function () { + it('creates and updates a JSX file with JSX comment JSON step', function () { + const tempFile = path.join(tempDir, 'jsx-json-step.jsx'); + const originalContent = `export default function Page() { + return ( +
+ {/* step {"goTo":"https://original.com"} */} +

Hello World

+
+ ); +} +`; + fs.writeFileSync(tempFile, originalContent); + + // Verify default comment format for JSX + expect(getDefaultCommentFormat('.jsx')).to.equal('jsxComment'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + originalText: '{/* step {"goTo":"https://original.com"} */}', + }); + + expect(serialized).to.match(/^\{\s*\/\*/); + expect(serialized).to.match(/\*\/\s*\}$/); + expect(serialized).to.include('https://modified.com'); + + const startOffset = originalContent.indexOf('{/* step'); + const endOffset = originalContent.indexOf('*/}') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified.com'); + expect(updatedContent).to.include('{/*'); + expect(updatedContent).to.include('*/}'); + }); + + it('creates and updates a TSX file with JSX comment', function () { + const tempFile = path.join(tempDir, 'tsx-json-step.tsx'); + const originalContent = `import React from 'react'; + +export const Component: React.FC = () => { + return ( +
+ {/* step {"click":".button"} */} + +
+ ); +}; +`; + fs.writeFileSync(tempFile, originalContent); + + expect(getDefaultCommentFormat('.tsx')).to.equal('jsxComment'); + + const modifiedStep = { + click: '.new-button', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + }); + + expect(serialized).to.include('{/*'); + expect(serialized).to.include('*/}'); + expect(serialized).to.include('.new-button'); + }); + + it('creates and updates an MDX file with JSX comment', function () { + const tempFile = path.join(tempDir, 'mdx-json-step.mdx'); + const originalContent = `# Documentation + +{/* step {"goTo":"https://original.com"} */} + + +`; + fs.writeFileSync(tempFile, originalContent); + + expect(getDefaultCommentFormat('.mdx')).to.equal('jsxComment'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + }); + + expect(serialized).to.include('{/*'); + expect(serialized).to.include('*/}'); + }); + }); + + describe('with YAML syntax', function () { + it('creates and updates a JSX file with JSX comment YAML step', function () { + const tempFile = path.join(tempDir, 'jsx-yaml-step.jsx'); + const originalContent = `export default function Page() { + return ( +
+ {/* step goTo: https://original.com */} +

Hello World

+
+ ); +} +`; + fs.writeFileSync(tempFile, originalContent); + + // Detect the syntax from JSX comment + const detectedSyntax = detectSyntaxFormat('{/* step goTo: https://original.com */}'); + expect(detectedSyntax).to.equal('yaml'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + originalText: '{/* step goTo: https://original.com */}', + }); + + expect(serialized).to.include('{/*'); + expect(serialized).to.include('*/}'); + expect(serialized).to.include('goTo:'); + }); + }); + + describe('with multiline content', function () { + it('creates multiline JSX comment for complex steps', function () { + const complexStep = { + goTo: { + url: 'https://example.com', + timeout: 5000, + }, + }; + + const yamlContent = serializeToSyntax(complexStep, 'yaml', 'step'); + expect(yamlContent).to.include('\n'); + + // Multiline JSX comment format + const multilineJsx = `{/* step\n${yamlContent}\n*/}`; + expect(multilineJsx).to.include('{/* step'); + expect(multilineJsx).to.include('*/}'); + }); + }); + }); + + describe('Comment Type: linkReference', function () { + describe('with JSON syntax', function () { + it('serializes step to link reference format', function () { + const step = { + goTo: 'https://example.com', + }; + + const serialized = serializeStepToInline({ + step, + commentFormat: 'linkReference', + }); + + expect(serialized).to.include('[comment]: #'); + expect(serialized).to.include('step'); + }); + + it('falls back to JSON for multiline content in link reference', function () { + // Link reference format doesn't support multiline well + const complexStep = { + goTo: 'https://example.com', + description: 'Navigate to page', + stepId: 'nav-step', + }; + + const serialized = serializeStepToInline({ + step: complexStep, + commentFormat: 'linkReference', + }); + + expect(serialized).to.include('[comment]: #'); + // Should use JSON stringify for complex content + expect(serialized).to.include('{'); + }); + }); + }); + + describe('Full Update Flow - prepareSourceUpdates', function () { + it('prepares updates for modified inline steps', function () { + const tempFile = path.join(tempDir, 'prepare-updates.md'); + + const originalSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://original.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + originalText: '', + }), + ], + }], + }); + + const modifiedSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://modified.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + originalText: '', + }), + ], + }], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + expect(updates.has(tempFile)).to.be.true; + + const fileUpdates = updates.get(tempFile); + expect(fileUpdates).to.be.an('array'); + expect(fileUpdates.length).to.equal(1); + expect(fileUpdates[0]).to.have.property('newContent'); + expect(fileUpdates[0].newContent).to.include('https://modified.com'); + }); + + it('skips unmodified steps', function () { + const tempFile = path.join(tempDir, 'skip-unmodified.md'); + + const spec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + }), + ], + }], + }); + + // Deep clone to create identical original + const originalSpec = JSON.parse(JSON.stringify(spec)); + + const updates = prepareSourceUpdates({ spec, originalSpec }); + + expect(updates.size).to.equal(0); + }); + + it('handles auto-detected steps with insertLineAfter', function () { + const tempFile = path.join(tempDir, 'auto-detected.md'); + + const originalSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://original.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + isAutoDetected: true, + }), + ], + }], + }); + + const modifiedSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://modified.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + isAutoDetected: true, + }), + ], + }], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + const fileUpdates = updates.get(tempFile); + expect(fileUpdates[0]).to.have.property('insertLineAfter', true); + }); + + it('inserts new test declaration when test has metadata but no source location', function () { + const tempFile = path.join(tempDir, 'new-test-decl.md'); + + const originalSpec = getMockSpec({ + tests: [{ + testId: 'new-test', + description: 'New test description', + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + }), + ], + }], + }); + + // Original has no test metadata + const emptyOriginalSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + }), + ], + }], + }); + + const updates = prepareSourceUpdates({ spec: originalSpec, originalSpec: emptyOriginalSpec }); + + expect(updates.size).to.equal(1); + const fileUpdates = updates.get(tempFile); + + // Should have a test declaration insertion + const testDeclUpdate = fileUpdates.find(u => u.isNewTestDeclaration); + expect(testDeclUpdate).to.exist; + expect(testDeclUpdate.insertLineBefore).to.be.true; + }); + }); + + describe('Complete File Update Workflow', function () { + it('updates markdown file with multiple inline steps', function () { + const tempFile = path.join(tempDir, 'complete-workflow.md'); + const originalContent = `# Documentation + +This is an introduction. + + + +Navigate to the homepage: + + +Click the button: + + +Take a screenshot: + + +Done! +`; + fs.writeFileSync(tempFile, originalContent); + + // Find offsets for each step + const step1Start = originalContent.indexOf('', step1Start) + 3; + + const step2Start = originalContent.indexOf('', step2Start) + 3; + + const step3Start = originalContent.indexOf('', step3Start) + 3; + + // Create updates + const updates = [ + { + startOffset: step1Start, + endOffset: step1End, + newContent: '', + replaceEntireLine: true, + }, + { + startOffset: step2Start, + endOffset: step2End, + newContent: '', + replaceEntireLine: true, + }, + { + startOffset: step3Start, + endOffset: step3End, + newContent: '', + replaceEntireLine: true, + }, + ]; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates, + }); + + expect(result.success).to.be.true; + expect(result.results).to.have.lengthOf(3); + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified1.com'); + expect(updatedContent).to.include('.modified-button'); + expect(updatedContent).to.include('modified.png'); + expect(updatedContent).to.not.include('https://original1.com'); + expect(updatedContent).to.not.include('.original-button'); + expect(updatedContent).to.not.include('original.png'); + + // Verify structure is preserved + expect(updatedContent).to.include('# Documentation'); + expect(updatedContent).to.include('Navigate to the homepage:'); + expect(updatedContent).to.include('Click the button:'); + expect(updatedContent).to.include('Take a screenshot:'); + expect(updatedContent).to.include('Done!'); + }); + + it('handles mixed comment and syntax formats in same file', function () { + const tempFile = path.join(tempDir, 'mixed-formats.md'); + const originalContent = `# Mixed Format Documentation + + + +JSON format step: + + +YAML format step (unquoted value for clear YAML detection): + + +XML format step: + + +`; + fs.writeFileSync(tempFile, originalContent); + + // Verify syntax detection + // JSON: starts with { or has quoted key/value patterns + expect(detectSyntaxFormat('')).to.equal('json'); + // YAML: key: value without JSON-like quotes - using numeric value for clear detection + expect(detectSyntaxFormat('')).to.equal('yaml'); + // XML: key="value" or key=value attribute syntax + expect(detectSyntaxFormat('')).to.equal('xml'); + + // Create serialized updates preserving each format + const jsonStep = serializeStepToInline({ + step: { goTo: 'https://json-modified.com' }, + commentFormat: 'htmlComment', + originalText: '', + }); + + const yamlStep = serializeStepToInline({ + step: { wait: 3000 }, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Verify formats are preserved + expect(jsonStep).to.include('goTo:'); // Simple format uses YAML-like syntax + expect(yamlStep).to.include('wait:'); + }); + + it('preserves indentation when updating steps', function () { + const tempFile = path.join(tempDir, 'preserve-indent.md'); + const originalContent = `# Indented Documentation + + This section is indented. + + + + More indented content. +`; + fs.writeFileSync(tempFile, originalContent); + + const startOffset = originalContent.indexOf(' ', startOffset) + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: '', + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + // Indentation should be preserved + expect(updatedContent).to.include(' '); + }); + + it('handles inserting new lines before and after existing content', function () { + const tempFile = path.join(tempDir, 'insert-lines.md'); + const originalContent = `# Documentation + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const stepOffset = originalContent.indexOf('', + insertLineBefore: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + const testPos = updatedContent.indexOf('', + }], + }); + + expect(result.success).to.be.true; + + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content).to.equal(''); + }); + + it('handles special characters in URLs', function () { + const step = { goTo: 'https://example.com/path?query=value&other=123#section' }; + + const jsonSerialized = serializeToSyntax(step, 'json', 'step'); + expect(jsonSerialized).to.include('https://example.com/path?query=value&other=123#section'); + + const yamlSerialized = serializeToSyntax(step, 'yaml', 'step'); + expect(yamlSerialized).to.include('goTo:'); + }); + + it('handles quotes in values', function () { + const step = { find: '[data-test="my-element"]' }; + + const jsonSerialized = serializeToSyntax(step, 'json', 'step'); + expect(jsonSerialized).to.include('\\"my-element\\"'); + + const yamlSerialized = serializeToSyntax(step, 'yaml', 'step'); + expect(yamlSerialized).to.include('data-test'); + }); + + it('handles Unicode characters', function () { + const step = { type: ['Hello 世界 🌍'] }; + + const serialized = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(serialized).to.include('世界'); + expect(serialized).to.include('🌍'); + }); + + it('handles very long URLs', function () { + const longUrl = 'https://example.com/' + 'a'.repeat(500); + const step = { goTo: longUrl }; + + const serialized = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(serialized).to.include(longUrl); + }); + }); +}); diff --git a/cli/test/builder/schemaUtils.test.mjs b/cli/test/builder/schemaUtils.test.mjs new file mode 100644 index 0000000..e859e38 --- /dev/null +++ b/cli/test/builder/schemaUtils.test.mjs @@ -0,0 +1,576 @@ +/** + * Tests for schemaUtils.mjs - Schema utilities for the interactive test builder + * + * Tests the schema extraction and validation functions that power the builder UI. + */ + +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); + +import { + getMockSpec, + getMockTest, + getMockStep, + getMockGoToStep, + getMockClickStep, + getMockCompleteSpec, +} from './fixtures.mjs'; + +import { + getStepTypes, + getStepTypeSchema, + getCommonStepProperties, + getStepTypeVariants, + getFieldVariants, + detectVariantIndex, + extractFieldInfo, + getStepTypeFields, + getSpecFields, + getTestFields, + validateStep, + validateTest, + validateSpec, + validatePattern, + describePattern, + getStepTypeInfo, + createDefaultStep, + createDefaultTest, + createDefaultSpec, + getBrowserActions, + getStepActionType, + stepRequiresBrowser, +} from '../../src/cli/builder/schemaUtils.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('schemaUtils', function () { + describe('getStepTypes', function () { + it('returns an array of step type names', function () { + const stepTypes = getStepTypes(); + + expect(stepTypes).to.be.an('array'); + expect(stepTypes.length).to.be.greaterThan(0); + }); + + it('includes common action types', function () { + const stepTypes = getStepTypes(); + + expect(stepTypes).to.include('goTo'); + expect(stepTypes).to.include('click'); + expect(stepTypes).to.include('find'); + expect(stepTypes).to.include('type'); + expect(stepTypes).to.include('screenshot'); + expect(stepTypes).to.include('httpRequest'); + expect(stepTypes).to.include('runShell'); + expect(stepTypes).to.include('wait'); + }); + + it('returns sorted step types', function () { + const stepTypes = getStepTypes(); + const sorted = [...stepTypes].sort(); + + expect(stepTypes).to.deep.equal(sorted); + }); + }); + + describe('getStepTypeSchema', function () { + it('returns schema for valid step type', function () { + const schema = getStepTypeSchema('goTo'); + + expect(schema).to.be.an('object'); + expect(schema.anyOf !== undefined || schema.type !== undefined).to.be.true; + }); + + it('returns null for invalid step type', function () { + const schema = getStepTypeSchema('nonExistentStepType'); + + expect(schema).to.be.null; + }); + + it('returns schemas with descriptions', function () { + const schema = getStepTypeSchema('click'); + + expect(schema.description !== undefined || schema.title !== undefined).to.be.true; + }); + }); + + describe('getCommonStepProperties', function () { + it('returns common step properties object', function () { + const commonProps = getCommonStepProperties(); + + expect(commonProps).to.be.an('object'); + }); + }); + + describe('getStepTypeVariants', function () { + it('returns variants for step types with anyOf', function () { + const variants = getStepTypeVariants('goTo'); + + // goTo should support string (simple) and object (detailed) forms + expect(variants).to.be.an('array'); + }); + + it('returns empty array for step type without variants', function () { + const variants = getStepTypeVariants('nonExistentType'); + + expect(variants).to.deep.equal([]); + }); + + it('each variant has expected properties', function () { + const variants = getStepTypeVariants('goTo'); + + if (variants.length > 0) { + const variant = variants[0]; + expect(variant).to.have.property('index'); + expect(variant).to.have.property('title'); + expect(variant).to.have.property('type'); + expect(variant).to.have.property('schema'); + } + }); + }); + + describe('detectVariantIndex', function () { + it('returns 0 for undefined value', function () { + const variants = [{ type: 'string' }, { type: 'object' }]; + const index = detectVariantIndex(undefined, variants); + + expect(index).to.equal(0); + }); + + it('detects string variant correctly', function () { + const variants = [{ type: 'object' }, { type: 'string' }]; + const index = detectVariantIndex('https://example.com', variants); + + expect(index).to.equal(1); + }); + + it('detects object variant correctly', function () { + const variants = [{ type: 'string' }, { type: 'object' }]; + const index = detectVariantIndex({ url: 'https://example.com' }, variants); + + expect(index).to.equal(1); + }); + + it('returns 0 for empty variants array', function () { + const index = detectVariantIndex('test', []); + + expect(index).to.equal(0); + }); + + it('detects null variant correctly', function () { + const variants = [{ type: 'string' }, { type: 'null' }]; + const index = detectVariantIndex(null, variants); + + expect(index).to.equal(1); + }); + }); + + describe('extractFieldInfo', function () { + it('extracts basic field information', function () { + const prop = { + type: 'string', + description: 'Test field', + default: 'default value', + }; + + const info = extractFieldInfo(prop, 'testField'); + + expect(info.name).to.equal('testField'); + expect(info.type).to.equal('string'); + expect(info.description).to.equal('Test field'); + expect(info.default).to.equal('default value'); + }); + + it('extracts enum information', function () { + const prop = { + type: 'string', + enum: ['option1', 'option2', 'option3'], + }; + + const info = extractFieldInfo(prop, 'enumField'); + + expect(info.type).to.equal('enum'); + expect(info.enum).to.deep.equal(['option1', 'option2', 'option3']); + }); + + it('extracts pattern information', function () { + const prop = { + type: 'string', + pattern: '^https?://', + }; + + const info = extractFieldInfo(prop, 'urlField'); + + expect(info.pattern).to.equal('^https?://'); + }); + + it('extracts anyOf information', function () { + const prop = { + anyOf: [ + { type: 'string' }, + { type: 'number' }, + ], + }; + + const info = extractFieldInfo(prop, 'unionField'); + + expect(info.anyOf).to.deep.equal(prop.anyOf); + expect(info.type).to.equal('string|number'); + }); + }); + + describe('getStepTypeFields', function () { + it('returns fields and required fields for valid step type', function () { + const { fields, requiredFields } = getStepTypeFields('goTo'); + + expect(fields).to.be.an('array'); + expect(requiredFields).to.be.an('array'); + }); + + it('returns empty arrays for invalid step type', function () { + const { fields, requiredFields } = getStepTypeFields('nonExistentType'); + + expect(fields).to.deep.equal([]); + expect(requiredFields).to.deep.equal([]); + }); + }); + + describe('getSpecFields', function () { + it('returns spec fields', function () { + const { fields, requiredFields } = getSpecFields(); + + expect(fields).to.be.an('array'); + expect(requiredFields).to.be.an('array'); + }); + + it('does not include tests field', function () { + const { fields } = getSpecFields(); + const testsField = fields.find(f => f.name === 'tests'); + + expect(testsField).to.be.undefined; + }); + + it('does not include $schema field', function () { + const { fields } = getSpecFields(); + const schemaField = fields.find(f => f.name === '$schema'); + + expect(schemaField).to.be.undefined; + }); + }); + + describe('getTestFields', function () { + it('returns test fields', function () { + const { fields, requiredFields } = getTestFields(); + + expect(fields).to.be.an('array'); + expect(requiredFields).to.be.an('array'); + }); + + it('does not include steps field', function () { + const { fields } = getTestFields(); + const stepsField = fields.find(f => f.name === 'steps'); + + expect(stepsField).to.be.undefined; + }); + }); + + describe('validateStep', function () { + it('validates a correct goTo step', function () { + const step = getMockGoToStep('https://example.com'); + const result = validateStep(step); + + expect(result.valid).to.be.true; + }); + + it('validates a correct click step', function () { + const step = getMockClickStep('.button'); + const result = validateStep(step); + + expect(result.valid).to.be.true; + }); + + it('returns validation errors for invalid step', function () { + const step = { unknownAction: 'value' }; + const result = validateStep(step); + + expect(result.valid).to.be.false; + }); + }); + + describe('validateTest', function () { + it('validates a correct test', function () { + const test = getMockTest({ + steps: [getMockGoToStep()], + }); + const result = validateTest(test); + + expect(result.valid).to.be.true; + }); + + it('validates a test with multiple steps', function () { + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + ], + }); + const result = validateTest(test); + + expect(result.valid).to.be.true; + }); + }); + + describe('validateSpec', function () { + it('validates a correct spec', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 2 }); + const result = validateSpec(spec); + + expect(result.valid).to.be.true; + }); + + it('validates an empty spec', function () { + // A spec with empty steps array is invalid per schema (minItems: 1 on steps) + const spec = getMockSpec({ tests: [{ steps: [] }] }); + const result = validateSpec(spec); + + expect(result.valid).to.be.false; + }); + + it('returns validation errors for invalid spec', function () { + const spec = { tests: 'not an array' }; + const result = validateSpec(spec); + + expect(result.valid).to.be.false; + }); + }); + + describe('validatePattern', function () { + it('returns true for matching pattern', function () { + const result = validatePattern('https://example.com', '^https?://'); + + expect(result).to.be.true; + }); + + it('returns false for non-matching pattern', function () { + const result = validatePattern('ftp://example.com', '^https?://'); + + expect(result).to.be.false; + }); + + it('returns true for null/undefined value', function () { + expect(validatePattern(null, '^test')).to.be.true; + expect(validatePattern(undefined, '^test')).to.be.true; + }); + + it('returns true for null/undefined pattern', function () { + expect(validatePattern('test', null)).to.be.true; + expect(validatePattern('test', undefined)).to.be.true; + }); + + it('returns true for invalid regex pattern', function () { + const result = validatePattern('test', '[invalid(regex'); + + expect(result).to.be.true; + }); + }); + + describe('describePattern', function () { + it('returns empty string for null pattern', function () { + const description = describePattern(null); + + expect(description).to.equal(''); + }); + + it('returns human-readable description for known patterns', function () { + const description = describePattern('(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)'); + + expect(description).to.include('http'); + }); + + it('returns pattern itself for unknown patterns', function () { + const pattern = '^custom-pattern$'; + const description = describePattern(pattern); + + expect(description).to.include(pattern); + }); + }); + + describe('getStepTypeInfo', function () { + it('returns description and examples for valid step type', function () { + const info = getStepTypeInfo('goTo'); + + expect(info).to.have.property('description'); + expect(info).to.have.property('examples'); + }); + + it('returns empty values for invalid step type', function () { + const info = getStepTypeInfo('nonExistentType'); + + expect(info.description).to.equal(''); + expect(info.examples).to.deep.equal([]); + }); + }); + + describe('createDefaultStep', function () { + it('creates default goTo step', function () { + const step = createDefaultStep('goTo'); + + expect(step).to.have.property('goTo'); + }); + + it('creates default click step', function () { + const step = createDefaultStep('click'); + + expect(step).to.have.property('click'); + }); + + it('creates default find step', function () { + const step = createDefaultStep('find'); + + expect(step).to.have.property('find'); + }); + + it('creates valid steps that pass validation', function () { + const stepTypes = getStepTypes(); + + for (const stepType of stepTypes) { + const step = createDefaultStep(stepType); + expect(step).to.have.property(stepType); + } + }); + }); + + describe('createDefaultTest', function () { + it('creates test with expected properties', function () { + const test = createDefaultTest(); + + expect(test).to.have.property('testId'); + expect(test).to.have.property('description'); + expect(test).to.have.property('steps'); + expect(test.steps).to.be.an('array'); + expect(test.steps).to.have.lengthOf(0); + }); + }); + + describe('createDefaultSpec', function () { + it('creates spec with expected properties', function () { + const spec = createDefaultSpec('my-spec'); + + expect(spec).to.have.property('specId', 'my-spec'); + expect(spec).to.have.property('description'); + expect(spec).to.have.property('tests'); + expect(spec.tests).to.be.an('array'); + expect(spec.tests).to.have.lengthOf(0); + }); + + it('creates spec with empty specId when not provided', function () { + const spec = createDefaultSpec(); + + expect(spec.specId).to.equal(''); + }); + }); + + describe('getBrowserActions', function () { + it('returns array of browser-requiring action types', function () { + const browserActions = getBrowserActions(); + + expect(browserActions).to.be.an('array'); + expect(browserActions).to.include('click'); + expect(browserActions).to.include('find'); + expect(browserActions).to.include('type'); + expect(browserActions).to.include('screenshot'); + }); + + it('does not include non-browser actions', function () { + const browserActions = getBrowserActions(); + + expect(browserActions).to.not.include('goTo'); + expect(browserActions).to.not.include('httpRequest'); + expect(browserActions).to.not.include('runShell'); + }); + }); + + describe('getStepActionType', function () { + it('returns action type for goTo step', function () { + const step = getMockGoToStep(); + const actionType = getStepActionType(step); + + expect(actionType).to.equal('goTo'); + }); + + it('returns action type for click step', function () { + const step = getMockClickStep(); + const actionType = getStepActionType(step); + + expect(actionType).to.equal('click'); + }); + + it('returns null for step without recognized action', function () { + const step = { unknownProp: 'value' }; + const actionType = getStepActionType(step); + + expect(actionType).to.be.null; + }); + + it('ignores common step properties', function () { + const step = { + goTo: 'https://example.com', + description: 'Navigate to page', + stepId: 'step-1', + }; + const actionType = getStepActionType(step); + + expect(actionType).to.equal('goTo'); + }); + }); + + describe('stepRequiresBrowser', function () { + it('returns true for click step', function () { + const step = getMockClickStep(); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns true for find step', function () { + const step = getMockStep('find', '.element'); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns true for type step', function () { + const step = getMockStep('type', ['test']); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns true for screenshot step', function () { + const step = getMockStep('screenshot', 'test.png'); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns false for goTo step', function () { + const step = getMockGoToStep(); + + expect(stepRequiresBrowser(step)).to.be.false; + }); + + it('returns false for httpRequest step', function () { + const step = getMockStep('httpRequest', { url: 'https://api.example.com' }); + + expect(stepRequiresBrowser(step)).to.be.false; + }); + + it('returns false for runShell step', function () { + const step = getMockStep('runShell', 'echo test'); + + expect(stepRequiresBrowser(step)).to.be.false; + }); + }); +}); diff --git a/cli/test/builder/sourceFileUtils.test.mjs b/cli/test/builder/sourceFileUtils.test.mjs new file mode 100644 index 0000000..83e7389 --- /dev/null +++ b/cli/test/builder/sourceFileUtils.test.mjs @@ -0,0 +1,823 @@ +/** + * Tests for sourceFileUtils.js - Source file update utilities for inline test editing + * + * Tests serialization, syntax detection, and file update operations. + */ + +import { createRequire } from 'module'; +import * as fs from 'fs'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const { + serializeStepToInline, + serializeTestToInline, + detectSyntaxFormat, + serializeToSyntax, + getDefaultCommentFormat, + canSerializeAsSimple, + hasTestMetadata, + getFileContentHash, + findLineStart, + findLineEnd, + getLineIndentation, + hasSourceFileChanged, + updateSourceContent, + insertSourceContent, + batchUpdateSourceContent, + hasInlineSourceLocations, + getInlineSourceFiles, + isAutoDetectedStep, + prepareSourceUpdates, + hasAutoDetectedSteps, +} = require('../../src/cli/builder/sourceFileUtils.js'); + +import { + getMockSpec, + getMockTest, + getMockStep, + getMockGoToStep, + getMockSourceLocation, + getMockInlineStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('sourceFileUtils', function () { + // Temp file handling + const tempDir = path.join(__dirname, 'temp'); + + before(function () { + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + }); + + afterEach(function () { + // Clean up temp files after each test + const files = fs.readdirSync(tempDir); + for (const file of files) { + fs.unlinkSync(path.join(tempDir, file)); + } + }); + + after(function () { + // Remove temp directory + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir); + } + }); + + describe('detectSyntaxFormat', function () { + it('detects JSON format from object syntax', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('json'); + }); + + it('detects YAML format from key: value syntax', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('yaml'); + }); + + it('detects XML format from attribute syntax', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('xml'); + }); + + it('returns null for empty input', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.be.null; + }); + + it('returns null for undefined input', function () { + const result = detectSyntaxFormat(undefined); + + expect(result).to.be.null; + }); + + it('handles JSX comment format', function () { + const result = detectSyntaxFormat('{/* step {"goTo": "url"} */}'); + + expect(result).to.equal('json'); + }); + + it('handles multiline YAML format', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('yaml'); + }); + }); + + describe('serializeToSyntax', function () { + it('serializes to JSON format', function () { + const obj = { goTo: 'https://example.com' }; + const result = serializeToSyntax(obj, 'json', 'step'); + + expect(result).to.equal('{"goTo":"https://example.com"}'); + }); + + it('serializes to YAML format', function () { + const obj = { goTo: 'https://example.com' }; + const result = serializeToSyntax(obj, 'yaml', 'step'); + + expect(result).to.include('goTo:'); + }); + + it('serializes to XML format', function () { + const obj = { goTo: 'https://example.com' }; + const result = serializeToSyntax(obj, 'xml', 'step'); + + expect(result).to.include('goTo="https://example.com"'); + }); + + it('handles boolean values in XML format', function () { + const obj = { enabled: true }; + const result = serializeToSyntax(obj, 'xml', 'step'); + + expect(result).to.include('enabled=true'); + }); + + it('handles number values in XML format', function () { + const obj = { timeout: 5000 }; + const result = serializeToSyntax(obj, 'xml', 'step'); + + expect(result).to.include('timeout=5000'); + }); + }); + + describe('getDefaultCommentFormat', function () { + it('returns htmlComment for .md files', function () { + expect(getDefaultCommentFormat('.md')).to.equal('htmlComment'); + }); + + it('returns htmlComment for .html files', function () { + expect(getDefaultCommentFormat('.html')).to.equal('htmlComment'); + }); + + it('returns jsxComment for .jsx files', function () { + expect(getDefaultCommentFormat('.jsx')).to.equal('jsxComment'); + }); + + it('returns jsxComment for .tsx files', function () { + expect(getDefaultCommentFormat('.tsx')).to.equal('jsxComment'); + }); + + it('returns jsxComment for .mdx files', function () { + expect(getDefaultCommentFormat('.mdx')).to.equal('jsxComment'); + }); + + it('returns htmlComment for unknown extensions', function () { + expect(getDefaultCommentFormat('.unknown')).to.equal('htmlComment'); + }); + + it('handles null/undefined extension', function () { + expect(getDefaultCommentFormat(null)).to.equal('htmlComment'); + expect(getDefaultCommentFormat(undefined)).to.equal('htmlComment'); + }); + }); + + describe('serializeStepToInline', function () { + it('serializes simple goTo step to HTML comment', function () { + const step = getMockGoToStep('https://example.com'); + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(result).to.match(/^$/); + expect(result).to.include('goTo'); + expect(result).to.include('https://example.com'); + }); + + it('serializes step to JSX comment format', function () { + const step = getMockGoToStep('https://example.com'); + const result = serializeStepToInline({ + step, + commentFormat: 'jsxComment', + }); + + expect(result).to.match(/^\{\s*\/\*/); + expect(result).to.match(/\*\/\s*\}$/); + }); + + it('removes sourceLocation from serialized output', function () { + const step = getMockInlineStep('goTo', 'https://example.com'); + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(result).to.not.include('sourceLocation'); + }); + + it('uses simple format for simple steps', function () { + const step = { goTo: 'https://example.com' }; + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(result).to.include('goTo:'); + }); + + it('preserves original syntax format when available', function () { + const step = { goTo: 'https://example.com' }; + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Should detect YAML format from original and use it + expect(result).to.include('goTo:'); + }); + }); + + describe('serializeTestToInline', function () { + it('serializes test declaration to HTML comment', function () { + const test = getMockTest({ testId: 'my-test', description: 'Test description' }); + const result = serializeTestToInline({ + test, + commentFormat: 'htmlComment', + }); + + expect(result).to.match(/^$/); + }); + + it('includes testId in serialized output', function () { + const test = getMockTest({ testId: 'my-test' }); + const result = serializeTestToInline({ + test, + commentFormat: 'htmlComment', + }); + + expect(result).to.include('testId'); + expect(result).to.include('my-test'); + }); + + it('includes description in serialized output', function () { + const test = getMockTest({ description: 'My test description' }); + const result = serializeTestToInline({ + test, + commentFormat: 'htmlComment', + }); + + expect(result).to.include('description'); + }); + }); + + describe('canSerializeAsSimple', function () { + it('returns true for step with only action', function () { + const step = { goTo: 'https://example.com' }; + + expect(canSerializeAsSimple(step, 'goTo')).to.be.true; + }); + + it('returns false for step with additional properties', function () { + const step = { goTo: 'https://example.com', description: 'Navigate' }; + + expect(canSerializeAsSimple(step, 'goTo')).to.be.false; + }); + + it('returns false for step with object action value', function () { + const step = { goTo: { url: 'https://example.com', timeout: 5000 } }; + + expect(canSerializeAsSimple(step, 'goTo')).to.be.false; + }); + + it('returns true for boolean action value', function () { + const step = { wait: true }; + + expect(canSerializeAsSimple(step, 'wait')).to.be.true; + }); + + it('returns true for numeric action value', function () { + const step = { wait: 5000 }; + + expect(canSerializeAsSimple(step, 'wait')).to.be.true; + }); + }); + + describe('hasTestMetadata', function () { + it('returns true for test with testId', function () { + const test = { testId: 'my-test', steps: [] }; + + expect(hasTestMetadata(test)).to.be.true; + }); + + it('returns true for test with description', function () { + const test = { description: 'My test', steps: [] }; + + expect(hasTestMetadata(test)).to.be.true; + }); + + it('returns false for test with only steps', function () { + const test = { steps: [{ goTo: 'https://example.com' }] }; + + expect(hasTestMetadata(test)).to.be.false; + }); + + it('returns false for null/undefined', function () { + expect(hasTestMetadata(null)).to.be.false; + expect(hasTestMetadata(undefined)).to.be.false; + }); + }); + + describe('getFileContentHash', function () { + it('returns hash for existing file', function () { + const tempFile = path.join(tempDir, 'hash-test.txt'); + fs.writeFileSync(tempFile, 'test content'); + + const hash = getFileContentHash(tempFile); + + expect(hash).to.be.a('string'); + expect(hash).to.have.lengthOf(32); // MD5 hex length + }); + + it('returns null for non-existent file', function () { + const hash = getFileContentHash('/non/existent/file.txt'); + + expect(hash).to.be.null; + }); + + it('returns consistent hash for same content', function () { + const tempFile = path.join(tempDir, 'hash-consistent.txt'); + fs.writeFileSync(tempFile, 'consistent content'); + + const hash1 = getFileContentHash(tempFile); + const hash2 = getFileContentHash(tempFile); + + expect(hash1).to.equal(hash2); + }); + + it('returns different hash for different content', function () { + const tempFile1 = path.join(tempDir, 'hash-diff1.txt'); + const tempFile2 = path.join(tempDir, 'hash-diff2.txt'); + fs.writeFileSync(tempFile1, 'content 1'); + fs.writeFileSync(tempFile2, 'content 2'); + + const hash1 = getFileContentHash(tempFile1); + const hash2 = getFileContentHash(tempFile2); + + expect(hash1).to.not.equal(hash2); + }); + }); + + describe('findLineStart', function () { + it('finds start of first line', function () { + const content = 'first line\nsecond line'; + + expect(findLineStart(content, 5)).to.equal(0); + }); + + it('finds start of second line', function () { + const content = 'first line\nsecond line'; + + expect(findLineStart(content, 15)).to.equal(11); + }); + + it('handles offset at start of file', function () { + const content = 'line content'; + + expect(findLineStart(content, 0)).to.equal(0); + }); + }); + + describe('findLineEnd', function () { + it('finds end of first line', function () { + const content = 'first line\nsecond line'; + + expect(findLineEnd(content, 5)).to.equal(11); // After newline + }); + + it('finds end of last line', function () { + const content = 'first line\nsecond line'; + + expect(findLineEnd(content, 15)).to.equal(22); // End of content + }); + }); + + describe('getLineIndentation', function () { + it('returns spaces for space-indented line', function () { + const content = ' indented line'; + + expect(getLineIndentation(content, 0)).to.equal(' '); + }); + + it('returns tabs for tab-indented line', function () { + const content = '\t\tindented line'; + + expect(getLineIndentation(content, 0)).to.equal('\t\t'); + }); + + it('returns empty string for non-indented line', function () { + const content = 'not indented'; + + expect(getLineIndentation(content, 0)).to.equal(''); + }); + }); + + describe('hasSourceFileChanged', function () { + it('returns false when file has not changed', function () { + const tempFile = path.join(tempDir, 'unchanged.txt'); + fs.writeFileSync(tempFile, 'original content'); + + const hash = getFileContentHash(tempFile); + + expect(hasSourceFileChanged(tempFile, hash)).to.be.false; + }); + + it('returns true when file has changed', function () { + const tempFile = path.join(tempDir, 'changed.txt'); + fs.writeFileSync(tempFile, 'original content'); + + const hash = getFileContentHash(tempFile); + fs.writeFileSync(tempFile, 'modified content'); + + expect(hasSourceFileChanged(tempFile, hash)).to.be.true; + }); + + it('returns true for non-existent file', function () { + expect(hasSourceFileChanged('/non/existent/file.txt', 'somehash')).to.be.true; + }); + }); + + describe('updateSourceContent', function () { + it('replaces content at specified offsets', function () { + const tempFile = path.join(tempDir, 'update-test.txt'); + fs.writeFileSync(tempFile, 'Hello World'); + + const result = updateSourceContent({ + filePath: tempFile, + startOffset: 6, + endOffset: 11, + newContent: 'Universe', + }); + + expect(result.success).to.be.true; + expect(fs.readFileSync(tempFile, 'utf8')).to.equal('Hello Universe'); + }); + + it('returns offset delta', function () { + const tempFile = path.join(tempDir, 'delta-test.txt'); + fs.writeFileSync(tempFile, 'short'); + + const result = updateSourceContent({ + filePath: tempFile, + startOffset: 0, + endOffset: 5, + newContent: 'much longer text', + }); + + expect(result.success).to.be.true; + expect(result.offsetDelta).to.equal(11); // 16 - 5 + }); + + it('returns error for invalid offsets', function () { + const tempFile = path.join(tempDir, 'invalid-offset.txt'); + fs.writeFileSync(tempFile, 'content'); + + const result = updateSourceContent({ + filePath: tempFile, + startOffset: 100, + endOffset: 200, + newContent: 'new', + }); + + expect(result.success).to.be.false; + expect(result.error).to.include('Invalid offsets'); + }); + + it('returns error for non-existent file', function () { + const result = updateSourceContent({ + filePath: '/non/existent/file.txt', + startOffset: 0, + endOffset: 5, + newContent: 'new', + }); + + expect(result.success).to.be.false; + }); + }); + + describe('batchUpdateSourceContent', function () { + it('applies multiple updates in correct order', function () { + const tempFile = path.join(tempDir, 'batch-test.txt'); + fs.writeFileSync(tempFile, 'line1\nline2\nline3'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 0, endOffset: 5, newContent: 'first' }, + { startOffset: 12, endOffset: 17, newContent: 'third' }, + ], + }); + + expect(result.success).to.be.true; + expect(fs.readFileSync(tempFile, 'utf8')).to.equal('first\nline2\nthird'); + }); + + it('handles replaceEntireLine option', function () { + const tempFile = path.join(tempDir, 'replace-line.txt'); + fs.writeFileSync(tempFile, ' indented line\nnext line'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 2, endOffset: 15, newContent: 'new content', replaceEntireLine: true }, + ], + }); + + expect(result.success).to.be.true; + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content).to.include('new content'); + expect(content).to.include('next line'); + }); + + it('handles insertLineBefore option', function () { + const tempFile = path.join(tempDir, 'insert-before.txt'); + fs.writeFileSync(tempFile, ' existing line\n'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 2, endOffset: 2, newContent: 'inserted line', insertLineBefore: true }, + ], + }); + + expect(result.success).to.be.true; + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content.indexOf('inserted line')).to.be.lessThan(content.indexOf('existing line')); + }); + + it('handles insertLineAfter option', function () { + const tempFile = path.join(tempDir, 'insert-after.txt'); + fs.writeFileSync(tempFile, 'existing line\n'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 0, endOffset: 13, newContent: 'inserted line', insertLineAfter: true }, + ], + }); + + expect(result.success).to.be.true; + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content.indexOf('existing line')).to.be.lessThan(content.indexOf('inserted line')); + }); + + it('returns success for empty updates array', function () { + const result = batchUpdateSourceContent({ + filePath: '/any/path.txt', + updates: [], + }); + + expect(result.success).to.be.true; + expect(result.results).to.deep.equal([]); + }); + }); + + describe('hasInlineSourceLocations', function () { + it('returns false for spec without inline sources', function () { + const spec = getMockSpec({ + tests: [getMockTest({ steps: [getMockGoToStep()] })], + }); + + expect(hasInlineSourceLocations(spec)).to.be.false; + }); + + it('returns true for spec with inline step sources', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [getMockInlineStep('goTo', 'https://example.com')], + }), + ], + }); + + expect(hasInlineSourceLocations(spec)).to.be.true; + }); + + it('returns true for spec with inline test sources', function () { + const spec = getMockSpec({ + tests: [ + { + ...getMockTest(), + sourceLocation: getMockSourceLocation(), + }, + ], + }); + + expect(hasInlineSourceLocations(spec)).to.be.true; + }); + + it('returns false for null/undefined spec', function () { + expect(hasInlineSourceLocations(null)).to.be.false; + expect(hasInlineSourceLocations(undefined)).to.be.false; + }); + }); + + describe('getInlineSourceFiles', function () { + it('returns empty set for spec without inline sources', function () { + const spec = getMockSpec(); + const files = getInlineSourceFiles(spec); + + expect(files.size).to.equal(0); + }); + + it('returns unique file paths from inline sources', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'url1', { file: '/path/to/file1.md' }), + getMockInlineStep('click', '.btn', { file: '/path/to/file1.md' }), + getMockInlineStep('find', '.elem', { file: '/path/to/file2.md' }), + ], + }), + ], + }); + + const files = getInlineSourceFiles(spec); + + expect(files.size).to.equal(2); + expect(files.has('/path/to/file1.md')).to.be.true; + expect(files.has('/path/to/file2.md')).to.be.true; + }); + }); + + describe('isAutoDetectedStep', function () { + it('returns true for auto-detected step', function () { + const step = getMockInlineStep('goTo', 'url', { isAutoDetected: true }); + + expect(isAutoDetectedStep(step)).to.be.true; + }); + + it('returns false for explicit inline step', function () { + const step = getMockInlineStep('goTo', 'url', { isAutoDetected: false }); + + expect(isAutoDetectedStep(step)).to.be.false; + }); + + it('returns false for step without sourceLocation', function () { + const step = getMockGoToStep(); + + expect(isAutoDetectedStep(step)).to.be.false; + }); + }); + + describe('hasAutoDetectedSteps', function () { + it('returns true for spec with auto-detected steps', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [getMockInlineStep('goTo', 'url', { isAutoDetected: true })], + }), + ], + }); + + expect(hasAutoDetectedSteps(spec)).to.be.true; + }); + + it('returns false for spec without auto-detected steps', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [getMockGoToStep()], + }), + ], + }); + + expect(hasAutoDetectedSteps(spec)).to.be.false; + }); + }); + + describe('prepareSourceUpdates', function () { + it('returns empty map for spec without inline sources', function () { + const spec = getMockSpec({ + tests: [getMockTest({ steps: [getMockGoToStep()] })], + }); + + const updates = prepareSourceUpdates({ spec, originalSpec: spec }); + + expect(updates.size).to.equal(0); + }); + + it('includes updates for modified inline steps', function () { + const originalSpec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://old.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + }), + ], + }), + ], + }); + + const modifiedSpec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://new.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + }), + ], + }), + ], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + expect(updates.has('/path/to/file.md')).to.be.true; + }); + + it('skips unmodified inline steps', function () { + // Use test without metadata (testId/description) to avoid triggering test declaration insertion + const originalSpec = getMockSpec({ + tests: [ + { + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + }), + ], + }, + ], + }); + + // Create a deep clone with identical content + const spec = JSON.parse(JSON.stringify(originalSpec)); + + // Same content as original - no modifications + const updates = prepareSourceUpdates({ spec, originalSpec }); + + expect(updates.size).to.equal(0); + }); + + it('handles auto-detected steps with insertLineAfter', function () { + // Use test without metadata (testId/description) to avoid triggering test declaration insertion + const originalSpec = getMockSpec({ + tests: [ + { + steps: [ + getMockInlineStep('goTo', 'https://old.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + isAutoDetected: true, + }), + ], + }, + ], + }); + + const modifiedSpec = getMockSpec({ + tests: [ + { + steps: [ + getMockInlineStep('goTo', 'https://new.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + isAutoDetected: true, + }), + ], + }, + ], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + const fileUpdates = updates.get('/path/to/file.md'); + expect(fileUpdates).to.be.an('array'); + expect(fileUpdates.length).to.be.greaterThan(0); + expect(fileUpdates[0]).to.have.property('insertLineAfter', true); + }); + }); +}); diff --git a/cli/test/resolvedTests.test.js b/cli/test/resolvedTests.test.js new file mode 100644 index 0000000..95e689f --- /dev/null +++ b/cli/test/resolvedTests.test.js @@ -0,0 +1,201 @@ +const { createServer } = require("./server"); +const path = require("path"); +const { spawnCommand } = require("../src/utils"); +const assert = require("assert").strict; +const fs = require("fs"); +const artifactPath = path.resolve(__dirname, "./artifacts"); +const outputFile = path.resolve(`${artifactPath}/resolvedTestsResults.json`); + +// Create a server with custom options +const server = createServer({ + port: 8093, + staticDir: "./test/server/public", +}); + +// Start the server before tests +before(async () => { + try { + await server.start(); + } catch (error) { + console.error(`Failed to start test server: ${error.message}`); + throw error; + } +}); + +// Stop the server after tests +after(async () => { + try { + await server.stop(); + } catch (error) { + console.error(`Failed to stop test server: ${error.message}`); + } +}); + +describe("DOC_DETECTIVE_API environment variable", function () { + // Set indefinite timeout + this.timeout(0); + + it("Should fetch and run resolved tests from API", async () => { + const apiConfig = { + accountId: "test-account", + url: "http://localhost:8093/api", + token: "test-token-123", + contextIds: "test-context", + }; + + // Set environment variable + const originalEnv = process.env.DOC_DETECTIVE_API; + process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfig); + + try { + // Note: When DOC_DETECTIVE_API is set, results are POSTed to the API, not written to a file + // So we don't pass -o flag and instead check stdout for execution results + const result = await spawnCommand(`node ./src/index.js`); + + // Assert spawnCommand exited successfully + assert.strictEqual( + result.exitCode, + 0, + `Command should exit with code 0, got ${result.exitCode}. stderr: ${result.stderr}` + ); + + // Validate that tests were executed by checking for results summary output + // The CLI outputs a summary with spec/test/step counts + assert.ok( + result.stdout.includes("Specs:") || result.stdout.includes("specs"), + `Output should contain test results summary. stdout: ${result.stdout.substring(0, 1000)}` + ); + + // Validate the output includes test counts + assert.ok( + result.stdout.includes("Passed:") || + result.stdout.includes("passed") || + result.stdout.includes("pass"), + `Output should contain pass/fail information. stdout: ${result.stdout.substring(0, 1000)}` + ); + + // Validate that the checkLink step from the mock API was executed + // The mock server returns a spec with a checkLink step to localhost:8093 + assert.ok( + result.stdout.includes("Steps:") || + result.stdout.includes("steps") || + result.stdout.includes("checkLink"), + `Output should indicate step execution. stdout: ${result.stdout.substring(0, 1000)}` + ); + } finally { + // Restore original env + if (originalEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + } + }); + + it("Should reject API config without required fields", async () => { + const invalidApiConfig = { + accountId: "test-account", + // Missing url and token + }; + + const originalEnv = process.env.DOC_DETECTIVE_API; + process.env.DOC_DETECTIVE_API = JSON.stringify(invalidApiConfig); + + try { + const result = await spawnCommand( + `node ./src/index.js -o ${outputFile}` + ); + + // Should exit with non-zero code + assert.notEqual(result.exitCode, 0); + } finally { + // Restore original env + if (originalEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + } + }); + + it("Should reject unauthorized API requests", async () => { + const apiConfigBadToken = { + accountId: "test-account", + url: "http://localhost:8093/api", + token: "wrong-token", + contextIds: "test-context", + }; + + const originalEnv = process.env.DOC_DETECTIVE_API; + process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfigBadToken); + + try { + const result = await spawnCommand( + `node ./src/index.js -o ${outputFile}` + ); + + // Should exit with non-zero code due to 401 response + assert.notEqual(result.exitCode, 0); + } finally { + // Restore original env + if (originalEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + } + }); + + it("Should apply config overrides from DOC_DETECTIVE_CONFIG to API-fetched tests", async () => { + const apiConfig = { + accountId: "test-account", + url: "http://localhost:8093/api", + token: "test-token-123", + contextIds: "test-context", + }; + + const configOverride = { + logLevel: "debug", + }; + + const originalApiEnv = process.env.DOC_DETECTIVE_API; + const originalConfigEnv = process.env.DOC_DETECTIVE_CONFIG; + process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfig); + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify(configOverride); + + try { + const result = await spawnCommand( + `node ./src/index.js` + ); + + // Assert the command exited successfully + assert.strictEqual(result.exitCode, 0, `Command should exit with code 0, got ${result.exitCode}. stderr: ${result.stderr}`); + + // Verify that the DOC_DETECTIVE_CONFIG override (logLevel: "debug") was applied + // When logLevel is set to debug, the CLI outputs debug logs including "CLI:RESOLVED_TESTS" + // Note: When DOC_DETECTIVE_API is set, results are POSTed to the API, not written to a file + assert.ok( + result.stdout.includes("CLI:RESOLVED_TESTS") || result.stdout.includes("CLI:CONFIG"), + `Debug log output should be present when logLevel is set to 'debug'. stdout: ${result.stdout.substring(0, 500)}` + ); + + // Verify the resolved tests output includes the merged config with logLevel: "debug" + assert.ok( + result.stdout.includes('"logLevel": "debug"') || result.stdout.includes('"logLevel":"debug"'), + `Resolved tests output should show logLevel: "debug" from the config override. stdout: ${result.stdout.substring(0, 1000)}` + ); + } finally { + // Restore original env + if (originalApiEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalApiEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + if (originalConfigEnv !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalConfigEnv; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); +}); diff --git a/cli/test/server/index.js b/cli/test/server/index.js index 83c8a8d..2c07c98 100644 --- a/cli/test/server/index.js +++ b/cli/test/server/index.js @@ -30,7 +30,55 @@ function createServer(options = {}) { app.use(express.static(staticDir)); } + // Endpoint for testing DOC_DETECTIVE_API - returns resolved tests + // NOTE: This specific route MUST be defined before the wildcard /api/:path route + app.get("/api/resolved-tests", (req, res) => { + try { + // Check for x-runner-token header + const token = req.headers['x-runner-token']; + + if (!token || token !== 'test-token-123') { + return res.status(401).json({ error: "Unauthorized" }); + } + + // Return a valid resolvedTests object + const resolvedTests = { + "resolvedTestsId": "api-resolved-tests-id", + "config": { + "logLevel": "info" + }, + "specs": [ + { + "specId": "api-spec", + "tests": [ + { + "testId": "api-test", + "contexts": [ + { + "contextId": "api-context", + "steps": [ + { + "stepId": "step-1", + "checkLink": `http://localhost:${port}` + } + ] + } + ] + } + ] + } + ] + }; + + res.json(resolvedTests); + } catch (error) { + console.error("Error processing resolved tests request:", error); + res.status(500).json({ error: "Internal server error" }); + } + }); + // Echo API endpoint that returns the request body + // NOTE: This wildcard route must be defined AFTER specific /api/* routes app.all("/api/:path", (req, res) => { try { const requestBody = req.method === "GET" ? req.query : req.body; @@ -85,7 +133,7 @@ function createServer(options = {}) { * @returns {Promise} Promise that resolves when server is stopped */ stop: () => { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { if (server) { server.close((error) => { if (error) { diff --git a/cli/test/utils.test.js b/cli/test/utils.test.js index 08218dd..bc58a73 100644 --- a/cli/test/utils.test.js +++ b/cli/test/utils.test.js @@ -83,7 +83,7 @@ describe("Util tests", function () { it("Config overrides are set correctly", async function () { // This test takes a bit longer this.timeout(5000); - + configSets = [ { // Input override @@ -100,7 +100,10 @@ describe("Util tests", function () { "--logLevel", "debug", ], - expected: { input: [path.resolve(process.cwd(), "input.spec.json")], logLevel: "debug" }, + expected: { + input: [path.resolve(process.cwd(), "input.spec.json")], + logLevel: "debug", + }, }, { // Input, logLevel, and setup overrides @@ -153,7 +156,10 @@ describe("Util tests", function () { "input.spec.json,anotherInput.spec.json", ], expected: { - input: [path.resolve(process.cwd(), "input.spec.json"), path.resolve(process.cwd(), "anotherInput.spec.json")], + input: [ + path.resolve(process.cwd(), "input.spec.json"), + path.resolve(process.cwd(), "anotherInput.spec.json"), + ], output: process.cwd(), recursive: true, }, @@ -171,22 +177,28 @@ describe("Util tests", function () { input: [path.resolve(process.cwd(), "input.spec.json")], allowUnsafeSteps: true, }, - } + }, ]; // Use process.stdout.write directly to force console output during tests - console.log('\n===== CONFIG TEST RESULTS =====\n'); - + console.log("\n===== CONFIG TEST RESULTS =====\n"); + // Use Promise.all with map instead of forEach to properly handle async operations - await Promise.all(configSets.map(async (configSet, index) => { - // Set config with the args - console.log(`Config test ${index}: ${JSON.stringify(configSet, null, 2)}`); - const configResult = await setConfig({ args: setArgs(configSet.args) }); - console.log(`Config result ${index}: ${JSON.stringify(configResult, null, 2)}\n`); - // Deeply compare the config result with the expected result - deepObjectExpect(configResult, configSet.expected); - })); - process.stdout.write('===== END CONFIG TEST RESULTS =====\n'); + await Promise.all( + configSets.map(async (configSet, index) => { + // Set config with the args + console.log( + `Config test ${index}: ${JSON.stringify(configSet, null, 2)}` + ); + const configResult = await setConfig({ args: setArgs(configSet.args) }); + console.log( + `Config result ${index}: ${JSON.stringify(configResult, null, 2)}\n` + ); + // Deeply compare the config result with the expected result + deepObjectExpect(configResult, configSet.expected); + }) + ); + process.stdout.write("===== END CONFIG TEST RESULTS =====\n"); }); // Test that results output correctly. @@ -204,6 +216,377 @@ describe("Util tests", function () { // Clean up fs.unlinkSync(outputResultsPath); }); + + // Test environment variable config detection + it("Config from DOC_DETECTIVE_CONFIG environment variable is loaded and merged", async function () { + this.timeout(5000); + + // Save the original environment variable value + const originalEnvConfig = process.env.DOC_DETECTIVE_CONFIG; + + try { + // Ensure env override is not set for the default-value test + delete process.env.DOC_DETECTIVE_CONFIG; + + // Test 1: Valid environment variable config without file config + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + logLevel: "debug", + }); + + const config1 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config1.logLevel).to.equal("debug"); + + // Test 2: Environment variable config merged with file config (env var takes precedence) + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + logLevel: "error", + }); + + const config2 = await setConfig({ + configPath: "./test/test-config.json", + args: setArgs([ + "node", + "runTests.js", + "--config", + "./test/test-config.json", + ]), + }); + // Environment variable should override file config + expect(config2.logLevel).to.equal("error"); + // Check that other values from file config are preserved + expect(config2.telemetry.send).to.equal(false); + + // Test 3: Environment variable config with command line args (args take precedence) + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + logLevel: "warning", + input: "env-input.json", + }); + + const config3 = await setConfig({ + args: setArgs([ + "node", + "runTests.js", + "--input", + "cli-input.json", + "--logLevel", + "debug", + ]), + }); + // Command line args should override environment variable + expect(config3.logLevel).to.equal("debug"); + expect(config3.input).to.deep.equal([ + path.resolve(process.cwd(), "cli-input.json"), + ]); + } finally { + // Restore the original environment variable value + if (originalEnvConfig !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalEnvConfig; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); + + // Test that false values for recursive and detectSteps are preserved + it("Preserves false values for recursive and detectSteps config properties", async function () { + this.timeout(5000); + + // Save original environment variable + const originalEnvConfig = process.env.DOC_DETECTIVE_CONFIG; + + try { + // Test 1: Default values when not specified (should be true) + const config1 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config1.recursive).to.equal( + true, + "recursive should default to true" + ); + expect(config1.detectSteps).to.equal( + true, + "detectSteps should default to true" + ); + + // Test 2: Explicitly set to false in environment variable + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: false, + detectSteps: false, + }); + + const config2 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config2.recursive).to.equal( + false, + "recursive should be false from env var" + ); + expect(config2.detectSteps).to.equal( + false, + "detectSteps should be false from env var" + ); + + // Test 3: Explicitly set to true in environment variable + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: true, + detectSteps: true, + }); + + const config3 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config3.recursive).to.equal( + true, + "recursive should be true from env var" + ); + expect(config3.detectSteps).to.equal( + true, + "detectSteps should be true from env var" + ); + + // Test 4: Only one set to false + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: false, + }); + + const config4 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config4.recursive).to.equal( + false, + "recursive should be false from env var" + ); + expect(config4.detectSteps).to.equal( + true, + "detectSteps should default to true" + ); + + // Test 5: Only detectSteps set to false + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + detectSteps: false, + }); + + const config5 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config5.recursive).to.equal( + true, + "recursive should default to true" + ); + expect(config5.detectSteps).to.equal( + false, + "detectSteps should be false from env var" + ); + } finally { + // Restore the original environment variable value + if (originalEnvConfig !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalEnvConfig; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); + + // Test that false values from config file are preserved + it("Preserves false values for recursive and detectSteps from config file", async function () { + this.timeout(5000); + + const testConfigDir = path.resolve("./test"); + + // Create temporary config files for testing + const configWithFalseValues = path.join( + testConfigDir, + "test-config-false-values.json" + ); + const configWithTrueValues = path.join( + testConfigDir, + "test-config-true-values.json" + ); + const configWithMixedValues = path.join( + testConfigDir, + "test-config-mixed-values.json" + ); + + try { + // Create config file with both set to false + fs.writeFileSync( + configWithFalseValues, + JSON.stringify( + { + recursive: false, + detectSteps: false, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Create config file with both set to true + fs.writeFileSync( + configWithTrueValues, + JSON.stringify( + { + recursive: true, + detectSteps: true, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Create config file with mixed values + fs.writeFileSync( + configWithMixedValues, + JSON.stringify( + { + recursive: false, + detectSteps: true, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Test 1: Config file with false values + const config1 = await setConfig({ + configPath: configWithFalseValues, + args: setArgs([ + "node", + "runTests.js", + "--config", + configWithFalseValues, + ]), + }); + expect(config1.recursive).to.equal( + false, + "recursive should be false from config file" + ); + expect(config1.detectSteps).to.equal( + false, + "detectSteps should be false from config file" + ); + + // Test 2: Config file with true values + const config2 = await setConfig({ + configPath: configWithTrueValues, + args: setArgs([ + "node", + "runTests.js", + "--config", + configWithTrueValues, + ]), + }); + expect(config2.recursive).to.equal( + true, + "recursive should be true from config file" + ); + expect(config2.detectSteps).to.equal( + true, + "detectSteps should be true from config file" + ); + + // Test 3: Config file with mixed values + const config3 = await setConfig({ + configPath: configWithMixedValues, + args: setArgs([ + "node", + "runTests.js", + "--config", + configWithMixedValues, + ]), + }); + expect(config3.recursive).to.equal( + false, + "recursive should be false from config file" + ); + expect(config3.detectSteps).to.equal( + true, + "detectSteps should be true from config file" + ); + } finally { + // Clean up temporary config files + if (fs.existsSync(configWithFalseValues)) { + fs.unlinkSync(configWithFalseValues); + } + if (fs.existsSync(configWithTrueValues)) { + fs.unlinkSync(configWithTrueValues); + } + if (fs.existsSync(configWithMixedValues)) { + fs.unlinkSync(configWithMixedValues); + } + } + }); + + // Test that environment variable overrides config file for recursive and detectSteps + it("Environment variable overrides config file for recursive and detectSteps", async function () { + this.timeout(5000); + + const testConfigDir = path.resolve("./test"); + const testConfigPath = path.join( + testConfigDir, + "test-config-override.json" + ); + + // Save original environment variable + const originalEnvConfig = process.env.DOC_DETECTIVE_CONFIG; + + try { + // Create config file with true values + fs.writeFileSync( + testConfigPath, + JSON.stringify( + { + recursive: true, + detectSteps: true, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Set environment variable with false values + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: false, + detectSteps: false, + }); + + // Environment variable should override file config + const config = await setConfig({ + configPath: testConfigPath, + args: setArgs(["node", "runTests.js", "--config", testConfigPath]), + }); + + expect(config.recursive).to.equal( + false, + "recursive should be false from env var (overriding config file)" + ); + expect(config.detectSteps).to.equal( + false, + "detectSteps should be false from env var (overriding config file)" + ); + expect(config.logLevel).to.equal( + "silent", + "logLevel should be preserved from config file" + ); + } finally { + // Clean up + if (fs.existsSync(testConfigPath)) { + fs.unlinkSync(testConfigPath); + } + + // Restore the original environment variable value + if (originalEnvConfig !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalEnvConfig; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); }); // Deeply compares two objects @@ -212,15 +595,21 @@ function deepObjectExpect(actual, expected) { Object.entries(expected).forEach(([key, value]) => { // Make sure the property exists in actual expect(actual).to.have.property(key); - + // If value is null, check directly if (value === null) { expect(actual[key]).to.equal(null); } // If value is an array, check each item else if (Array.isArray(value)) { - expect(Array.isArray(actual[key])).to.equal(true, `Expected ${key} to be an array. Expected: ${expected[key]}. Actual: ${actual[key]}.`); - expect(actual[key].length).to.equal(value.length, `Expected ${key} array to have length ${value.length}. Actual: ${actual[key].length}`); + expect(Array.isArray(actual[key])).to.equal( + true, + `Expected ${key} to be an array. Expected: ${expected[key]}. Actual: ${actual[key]}.` + ); + expect(actual[key].length).to.equal( + value.length, + `Expected ${key} array to have length ${value.length}. Actual: ${actual[key].length}` + ); // Check each array item value.forEach((item, index) => { @@ -234,7 +623,7 @@ function deepObjectExpect(actual, expected) { // If value is an object but not null, recursively check it else if (typeof value === "object") { deepObjectExpect(actual[key], expected[key]); - } + } // Otherwise, check that the value is correct else { const expectedObject = {}; diff --git a/common/dev/dev.js b/common/dev/dev.js index f67d9d1..075e4fd 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -1,31 +1,49 @@ -const { validate, schemas } = require("../src/index"); +const { validate, schemas, refineStep } = require("../src/index"); +const { detectProvider, generate, modelMap } = require("../src/ai"); -const object = { - tests: [ - { - steps: [ - { - goTo: { - url: "http://localhost:8092", - waitUntil: { - find: { - selector: "button", - elementText: "Standard Button", - elementTestId: "standard-btn", - elementAria: "Sample Standard Button", - elementId: "standard-btn", - elementClass: ["btn"], - elementAttribute: { - type: "button", - value: "Standard Button", - }, - }, - }, - }, - }, - ], +const testRefineStep = async (model) => { + const originalStep = { + stepId: "step-123", + find: { selector: ".old-button-class" }, + }; + + const startTime = performance.now(); + const refinedStep = await refineStep({ + step: originalStep, + failureMessage: "Element not found: .old-button-class", + context: { + dom: ` + + `, }, - ], + }); + const endTime = performance.now(); + const duration = endTime - startTime; + + console.log("Refined Step:", refinedStep); + return { model, duration }; }; -console.log(validate({ schemaKey: "spec_v3", object })); +(async () => { + // get list of models from modelMap + const models = Object.keys(modelMap).filter((m) => m.startsWith("ollama/")); + const results = []; + + for (const model of models) { + console.log(`\n=== Testing refineStep with model: ${model} ===`); + const result = await testRefineStep(model); + results.push(result); + } + + // Print results summary + console.log("\n=== Refinement Duration Summary ==="); + results.forEach(({ model, duration }) => { + console.log(`${model}: ${duration.toFixed(2)}ms`); + }); + + // Print sorted by duration + console.log("\n=== Sorted by Duration (fastest first) ==="); + [...results].sort((a, b) => a.duration - b.duration).forEach(({ model, duration }) => { + console.log(`${model}: ${duration.toFixed(2)}ms`); + }); +})(); diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index 37355c3..c187bfa 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -807,6 +807,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -859,6 +965,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -919,6 +1131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1135,6 +1453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1458,6 +1882,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2878,6 +3408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3368,6 +4004,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4433,14 +5175,120 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false }, "outputs": { "type": "object", @@ -4740,6 +5588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5033,6 +5987,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5348,6 +6408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6000,6 +7166,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6316,6 +7588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6488,6 +7866,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6573,6 +8057,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6649,10 +8239,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7220,6 +8916,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7519,6 +9321,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8486,6 +10394,55 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" @@ -8715,6 +10672,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8767,6 +10830,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8827,6 +10996,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9018,30 +11293,136 @@ ] } ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "checkLink" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -9366,6 +11747,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10786,6 +13273,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11276,6 +13869,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12341,6 +15040,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12648,6 +15453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12941,6 +15852,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13252,10 +16269,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13908,6 +17031,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14224,6 +17453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14396,6 +17731,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14481,6 +17922,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14561,6 +18108,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15128,6 +18781,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15427,6 +19186,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/report_v3.schema.json b/common/dist/schemas/report_v3.schema.json index 6cc1350..6955451 100644 --- a/common/dist/schemas/report_v3.schema.json +++ b/common/dist/schemas/report_v3.schema.json @@ -627,6 +627,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1240,6 +1346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1292,6 +1504,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1352,6 +1670,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1568,6 +1992,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1891,6 +2421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3311,6 +3947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3801,20 +4543,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4866,6 +5714,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5173,6 +6127,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5466,6 +6526,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5781,6 +6947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6433,6 +7705,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6749,33 +8127,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6921,6 +8405,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7006,6 +8596,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7086,6 +8782,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7653,6 +9455,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7952,6 +9860,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8717,24 +10731,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8769,6 +10889,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8829,6 +11055,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9045,6 +11377,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9368,6 +11806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10788,6 +13332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11278,23 +13928,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12343,6 +15099,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12650,6 +15512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12943,6 +15911,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13258,6 +16332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13910,6 +17090,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14226,6 +17512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14398,6 +17790,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14483,6 +17981,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14563,6 +18167,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15130,6 +18840,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15429,6 +19245,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index a0f89f7..ba60461 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -820,6 +820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -872,6 +978,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -932,6 +1144,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1148,6 +1466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1471,6 +1895,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2891,6 +3421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3381,33 +4017,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -4446,6 +5188,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4753,6 +5601,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5046,6 +6000,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5361,6 +6421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6013,6 +7179,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6329,12 +7601,118 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, @@ -6501,6 +7879,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6586,6 +8070,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6666,6 +8256,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7233,6 +8929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7532,6 +9334,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8499,29 +10407,78 @@ } }, "title": "Doc Detective Orchestration API" - } - }, - "title": "Integrations options" - }, - "telemetry": { - "description": "Options around sending telemetry for Doc Detective usage.", - "type": "object", - "additionalProperties": false, - "properties": { - "send": { - "description": "If `true`, sends Doc Detective telemetry.", - "type": "boolean", - "default": true }, - "userId": { - "description": "Identifier for the organization, group, or individual running Doc Detective.", - "type": "string" - } - }, - "required": [ - "send" - ], - "default": { + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" + } + }, + "title": "Integrations options" + }, + "telemetry": { + "description": "Options around sending telemetry for Doc Detective usage.", + "type": "object", + "additionalProperties": false, + "properties": { + "send": { + "description": "If `true`, sends Doc Detective telemetry.", + "type": "boolean", + "default": true + }, + "userId": { + "description": "Identifier for the organization, group, or individual running Doc Detective.", + "type": "string" + } + }, + "required": [ + "send" + ], + "default": { "send": true }, "title": "Telemetry options" @@ -8728,6 +10685,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8780,6 +10843,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8840,6 +11009,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9056,6 +11331,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9379,6 +11760,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10799,23 +13286,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -11289,6 +13882,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12354,6 +15053,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12661,6 +15466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12954,6 +15865,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13269,6 +16286,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13921,27 +17044,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -14237,6 +17466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14409,6 +17744,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14494,6 +17935,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14574,6 +18121,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15141,6 +18794,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15440,23 +19199,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -16792,6 +20657,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -17405,6 +21376,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17457,6 +21534,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17517,6 +21700,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17733,6 +22022,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -18056,29 +22451,135 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", "description": "Environment variables to set from user-defined expressions.", "default": {}, "patternProperties": { @@ -19476,6 +23977,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -19966,6 +24573,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21031,6 +25744,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21338,6 +26157,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21631,6 +26556,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21946,27 +26977,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -22598,6 +27735,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -22914,6 +28157,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23086,6 +28435,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23171,6 +28626,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23251,6 +28812,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23818,6 +29485,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24083,39 +29856,145 @@ "path": "test-cookie.txt" }, { - "name": "session_token", - "path": "session-token.txt", - "directory": "./test-data" + "name": "session_token", + "path": "session-token.txt", + "directory": "./test-data" + }, + { + "name": "user_session", + "path": "saved-cookies.txt", + "domain": "app.example.com" + } + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" }, { - "name": "user_session", - "path": "saved-cookies.txt", - "domain": "app.example.com" + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." }, "description": { "type": "string", @@ -24882,6 +30761,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24934,6 +30919,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24994,6 +31085,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25210,6 +31407,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25533,6 +31836,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26949,10 +33358,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27443,6 +33958,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28508,6 +35129,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28815,6 +35542,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29108,6 +35941,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29423,6 +36362,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30050,30 +37095,136 @@ } } ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "screenshot" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -30391,6 +37542,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30563,6 +37820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30648,6 +38011,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30728,6 +38197,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31295,6 +38870,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31594,6 +39275,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/sourceLocation_v3.schema.json b/common/dist/schemas/sourceLocation_v3.schema.json new file mode 100644 index 0000000..a94b9b3 --- /dev/null +++ b/common/dist/schemas/sourceLocation_v3.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] +} \ No newline at end of file diff --git a/common/dist/schemas/spec_v3.schema.json b/common/dist/schemas/spec_v3.schema.json index 6c1d56a..d36c97c 100644 --- a/common/dist/schemas/spec_v3.schema.json +++ b/common/dist/schemas/spec_v3.schema.json @@ -609,6 +609,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1222,6 +1328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1274,6 +1486,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1334,6 +1652,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1550,6 +1974,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1873,6 +2403,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3293,6 +3929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3783,20 +4525,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4848,6 +5696,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5155,6 +6109,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5448,6 +6508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5763,6 +6929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6415,6 +7687,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6731,33 +8109,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6903,6 +8387,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6988,6 +8578,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7068,6 +8764,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7635,6 +9437,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7934,6 +9842,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8699,24 +10713,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8751,6 +10871,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8811,6 +11037,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9027,6 +11359,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9350,6 +11788,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10770,6 +13314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11260,23 +13910,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12325,6 +15081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12632,6 +15494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12925,6 +15893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13240,6 +16314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13892,6 +17072,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14208,6 +17494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14380,6 +17772,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14465,6 +17963,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14545,6 +18149,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15112,6 +18822,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15411,6 +19227,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/step_v3.schema.json b/common/dist/schemas/step_v3.schema.json index 8960667..3de27b4 100644 --- a/common/dist/schemas/step_v3.schema.json +++ b/common/dist/schemas/step_v3.schema.json @@ -22,6 +22,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -74,6 +180,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -134,6 +346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -350,6 +668,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +1097,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2093,6 +2623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2583,6 +3219,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3648,6 +4390,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3955,13 +4803,119 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, "outputs": { @@ -4248,6 +5202,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4563,6 +5623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5215,6 +6381,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5531,6 +6803,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5703,6 +7081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5788,6 +7272,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5868,6 +7458,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6435,6 +8131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6734,6 +8536,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/test_v3.schema.json b/common/dist/schemas/test_v3.schema.json index 9d86ed1..19f99ec 100644 --- a/common/dist/schemas/test_v3.schema.json +++ b/common/dist/schemas/test_v3.schema.json @@ -8,6 +8,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -621,6 +727,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +885,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -733,6 +1051,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -949,6 +1373,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1272,6 +1802,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2692,6 +3328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3182,25 +3924,131 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, "title": "Outputs (step)" }, "variables": { @@ -4247,6 +5095,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4554,6 +5508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4847,6 +5907,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5162,6 +6328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5814,6 +7086,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6130,31 +7508,137 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", @@ -6302,6 +7786,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6387,6 +7977,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6467,6 +8163,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7034,6 +8836,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7333,6 +9241,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8098,26 +10112,132 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" }, "variables": { "type": "object", @@ -8150,6 +10270,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8210,6 +10436,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8426,6 +10758,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8749,6 +11187,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10169,6 +12713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10659,22 +13309,128 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", "description": "Runtime expression for a user-defined output value." } }, @@ -11724,6 +14480,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12031,6 +14893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12324,6 +15292,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12639,6 +15713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13291,6 +16471,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13607,6 +16893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13779,6 +17171,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13864,6 +17362,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13944,6 +17548,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14511,6 +18221,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14810,6 +18626,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/package-lock.json b/common/package-lock.json index 633aa5a..8bf9649 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -1,21 +1,27 @@ { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/google": "^3.0.0-beta.72", + "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "yaml": "^2.8.2" + "ollama-ai-provider-v2": "^1.2.0", + "yaml": "^2.8.2", + "zod": "^4.1.13" }, "devDependencies": { "chai": "^6.2.1", @@ -23,6 +29,143 @@ "sinon": "^21.0.0" } }, + "node_modules/@ai-sdk/anthropic": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.54.tgz", + "integrity": "sha512-6OSFMkt5NkAchH7o0W+dI2h6yR8EPXx7Yl6txyh0gadLlkf1UU/ScyoYlkxAW8UtGju/+apvwVTdLYEQuIsVVQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/google": { + "version": "3.0.0-beta.72", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.0-beta.72.tgz", + "integrity": "sha512-PIK3PGt3XUFaPxIAwrEx/dmcdzSA6cyGdUGUHMIDedi+ILMdfjGavtEjdYANM3Z5xnO+5Skx+2hcHyHdwIqkgQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.0-beta.26", + "@ai-sdk/provider-utils": "4.0.0-beta.47" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider": { + "version": "3.0.0-beta.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.0-beta.26.tgz", + "integrity": "sha512-UQyOlrpahFL1CZ/QA0ZpFhAkE32fw1XXBx+6gu23YWSCMJCjaf/fiJUPV7xUhp/nXqVO/IC+PIIfLomx55D16A==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.0-beta.47.tgz", + "integrity": "sha512-nTR25V0+M/TGRegVXdhaCPqy6iaJfiyvhwtZ3ZDKhHmSVQXuwUb8zSXCPhEtpNgWXzWP3XNZvlzzgIHqByi6aw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.0-beta.26", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@valibot/to-json-schema": "^1.3.0", + "arktype": "^2.1.22", + "effect": "^3.18.4", + "zod": "^3.25.76 || ^4.1.8" + }, + "peerDependenciesMeta": { + "@valibot/to-json-schema": { + "optional": true + }, + "arktype": { + "optional": true + }, + "effect": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.80", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", + "integrity": "sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -141,6 +284,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -191,12 +343,45 @@ "node": ">=4" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "peer": true }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/ai": { + "version": "5.0.109", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", + "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -563,6 +748,15 @@ "node": ">=6" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -866,6 +1060,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -1072,6 +1272,22 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/ollama-ai-provider-v2": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/ollama-ai-provider-v2/-/ollama-ai-provider-v2-1.5.5.tgz", + "integrity": "sha512-1YwTFdPjhPNHny/DrOHO+s8oVGGIE5Jib61/KnnjPRNWQhVVimrJJdaAX3e6nNRRDXrY5zbb9cfm2+yVvgsrqw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/provider-utils": "^3.0.17" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^4.0.16" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -1507,6 +1723,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/common/package.json b/common/package.json index 1bfacfa..bab8fed 100644 --- a/common/package.json +++ b/common/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "description": "Shared components for Doc Detective projects.", "main": "src/index.js", "scripts": { @@ -25,12 +25,18 @@ "sinon": "^21.0.0" }, "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/google": "^3.0.0-beta.72", + "@ai-sdk/openai": "^2.0.80", + "ollama-ai-provider-v2": "^1.2.0", "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "yaml": "^2.8.2" + "yaml": "^2.8.2", + "zod": "^4.1.13" } } diff --git a/common/src/ai.js b/common/src/ai.js new file mode 100644 index 0000000..21fd114 --- /dev/null +++ b/common/src/ai.js @@ -0,0 +1,893 @@ +const { generateText, generateObject, jsonSchema } = require("ai"); +const { createOpenAI } = require("@ai-sdk/openai"); +const { createAnthropic } = require("@ai-sdk/anthropic"); +const { createGoogleGenerativeAI } = require("@ai-sdk/google"); +const { createOllama } = require("ollama-ai-provider-v2"); +const { z } = require("zod"); +const Ajv = require("ajv"); +const addFormats = require("ajv-formats"); +const { ensureModelAvailable, isOllamaAvailable, DEFAULT_OLLAMA_BASE_URL } = require("./ollama"); + +const DEFAULT_MODEL = "ollama/qwen3:4b"; +const MAX_SCHEMA_VALIDATION_RETRIES = 3; + +/** + * Maps our supported model enums to the model identifiers that platforms expect. + */ +const modelMap = { + // Anthropic models + "anthropic/claude-haiku-4.5": "claude-haiku-4-5", + "anthropic/claude-sonnet-4.5": "claude-sonnet-4-5", + "anthropic/claude-opus-4.5": "claude-opus-4-5", + // OpenAI models + "openai/gpt-5.2": "gpt-5.2", + "openai/gpt-5-mini": "gpt-5-mini", + "openai/gpt-5-nano": "gpt-5-nano", + // Google Gemini models + "google/gemini-2.5-flash": "gemini-2.5-flash", + "google/gemini-2.5-pro": "gemini-2.5-pro", + "google/gemini-3-pro": "gemini-3-pro-preview", + // Ollama models (text models that support standard chat API) + "ollama/qwen3:4b": "qwen3:4b", + "ollama/qwen3:8b": "qwen3:8b", + "ollama/gemma3:4bq4": "gemma3:4b-it-q4_K_M", + "ollama/gemma3:4bq8": "gemma3:4b-it-q8_0", + "ollama/gemma3:12bq4": "gemma3:12b-it-q4_K_M", + "ollama/gemma3:12bq8": "gemma3:12b-it-q8_0", +}; + +const getDefaultProvider = async (config = {}) => { + const ollamaBaseUrl = config?.integrations?.ollama?.baseUrl; + // Try to detect from environment variables if no model is provided + if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { + return { + provider: "anthropic", + model: "claude-haiku-4-5", + apiKey: + process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey, + }; + } else if (process.env.OPENAI_API_KEY || config.integrations?.openAi) { + return { + provider: "openai", + model: "gpt-5-mini", + apiKey: process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey, + }; + } else if ( + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations?.google + ) { + return { + provider: "google", + model: "gemini-2.5-flash", + apiKey: + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations.google.apiKey, + }; + } else if (await isOllamaAvailable(ollamaBaseUrl)) { + // Local, no API key needed + return { + provider: "ollama", + model: modelMap["ollama/qwen3:4b"], + apiKey: null, + baseURL: ollamaBaseUrl || undefined, + }; + } else { + return { provider: null, model: null, apiKey: null }; + } +}; + +/** + * Detects the provider, model, and API from a model string and environment variables. + * @param {Object} config - The Doc Detective configuration object. + * @param {string} model - The model identifier. + * @returns {Promise<{ provider: "openai" | "anthropic" | "ollama" | null, model: string | null, apiKey: string | null, baseURL?: string }>} The detected provider, model, and API key. + */ +const detectProvider = async (config, model) => { + const detectedModel = modelMap[model] || null; + if (!detectedModel) return getDefaultProvider(config); + + if (model.startsWith("ollama/")) { + const ollamaBaseUrl = + config.integrations?.ollama?.baseUrl || DEFAULT_OLLAMA_BASE_URL; + await ensureModelAvailable({ + model: detectedModel, + baseUrl: ollamaBaseUrl, + }); + return { + provider: "ollama", + model: detectedModel, + apiKey: null, + baseURL: ollamaBaseUrl, + }; + } + + if ( + model.startsWith("anthropic/") && + (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) + ) { + const apiKey = + process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; + return { provider: "anthropic", model: detectedModel, apiKey }; + } + + if ( + model.startsWith("openai/") && + (process.env.OPENAI_API_KEY || config.integrations?.openAi) + ) { + const apiKey = + process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey; + return { provider: "openai", model: detectedModel, apiKey }; + } + + if ( + model.startsWith("google/") && + (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations?.google) + ) { + const apiKey = + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations.google.apiKey; + return { provider: "google", model: detectedModel, apiKey }; + } + + return { provider: null, model: null }; +}; + +/** + * Creates a provider instance based on the provider name. + * @param {Object} options + * @param {"openai" | "anthropic" | "ollama"} options.provider - The provider name. + * @param {string} [options.apiKey] - Optional API key override. + * @param {string} [options.baseURL] - Optional base URL override. + * @returns {Function} The provider factory function. + */ +const createProvider = ({ provider, apiKey, baseURL }) => { + if (provider === "ollama") { + const options = {}; + if (baseURL) options.baseURL = baseURL; + return createOllama(options); + } + + if (provider === "openai") { + const options = {}; + if (apiKey) options.apiKey = apiKey; + if (baseURL) options.baseURL = baseURL; + return createOpenAI(options); + } + + if (provider === "anthropic") { + const options = {}; + if (apiKey) options.apiKey = apiKey; + if (baseURL) options.baseURL = baseURL; + return createAnthropic(options); + } + + if (provider === "google") { + const options = {}; + if (apiKey) options.apiKey = apiKey; + if (baseURL) options.baseURL = baseURL; + return createGoogleGenerativeAI(options); + } + + throw new Error(`Unsupported provider: ${provider}`); +}; + +/** + * Converts a file object to AI SDK image part format. + * @param {Object} file - The file object. + * @param {string} file.type - The file type (e.g., "image"). + * @param {string | Buffer | Uint8Array} file.data - Base64 string, URL, Buffer, or Uint8Array. + * @param {string} [file.mimeType] - The MIME type (e.g., "image/png"). + * @returns {Object} The AI SDK image part. + */ +const fileToImagePart = (file) => { + if (file.type !== "image") { + throw new Error( + `Unsupported file type: ${file.type}. Only "image" is supported.` + ); + } + + // Check if data is binary (Buffer or Uint8Array) - convert to base64 + // Note: The Ollama provider expects base64 strings, not raw binary + if (Buffer.isBuffer(file.data) || file.data instanceof Uint8Array) { + const base64Data = Buffer.isBuffer(file.data) + ? file.data.toString("base64") + : Buffer.from(file.data).toString("base64"); + return { + type: "image", + image: base64Data, + mimeType: file.mimeType, + }; + } + + // Check if data is a URL string + if ( + typeof file.data === "string" && + (file.data.startsWith("http://") || file.data.startsWith("https://")) + ) { + return { + type: "image", + image: new URL(file.data), + }; + } + + // Base64 string data + return { + type: "image", + image: file.data, + mimeType: file.mimeType, + }; +}; + +/** + * Builds message content from prompt and files. + * @param {Object} options + * @param {string} options.prompt - The text prompt. + * @param {Array} [options.files] - Optional array of file objects. + * @returns {string | Array} The message content. + */ +const buildMessageContent = ({ prompt, files }) => { + if (!files || files.length === 0) { + return prompt; + } + + const parts = []; + + // Add text part + parts.push({ type: "text", text: prompt }); + + // Add file parts + for (const file of files) { + parts.push(fileToImagePart(file)); + } + + return parts; +}; + +/** + * Checks if a schema is a Zod schema. + * @param {Object} schema - The schema to check. + * @returns {boolean} True if the schema is a Zod schema. + */ +const isZodSchema = (schema) => { + return schema && typeof schema.safeParse === "function"; +}; + +/** + * Validates an object against a Zod schema. + * @param {Object} object - The object to validate. + * @param {z.ZodSchema} schema - The Zod schema. + * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. + */ +const validateAgainstZodSchema = (object, schema) => { + const result = schema.safeParse(object); + + if (result.success) { + return { valid: true, errors: null, object: result.data }; + } + + const errors = result.error.issues + .map((issue) => `${issue.path.join(".")}: ${issue.message}`) + .join(", "); + + return { valid: false, errors, object }; +}; + +/** + * Validates an object against a JSON schema. + * @param {Object} object - The object to validate. + * @param {Object} schema - The JSON schema. + * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. + */ +const validateAgainstJsonSchema = (object, schema) => { + const ajv = new Ajv({ + allErrors: true, + useDefaults: true, + coerceTypes: true, + strict: false, + }); + addFormats(ajv); + + const validate = ajv.compile(schema); + const valid = validate(object); + + if (valid) { + return { valid: true, errors: null, object }; + } + + const errors = validate.errors + .map((error) => `${error.instancePath || "/"} ${error.message}`) + .join(", "); + + return { valid: false, errors, object }; +}; + +/** + * Validates an object against a schema (Zod or JSON schema). + * @param {Object} object - The object to validate. + * @param {z.ZodSchema | Object} schema - The Zod or JSON schema. + * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. + */ +const validateAgainstSchema = (object, schema) => { + if (isZodSchema(schema)) { + return validateAgainstZodSchema(object, schema); + } + return validateAgainstJsonSchema(object, schema); +}; + +/** + * Converts a schema to the format expected by the AI SDK. + * Zod schemas are passed directly; JSON schemas are wrapped with jsonSchema(). + * @param {z.ZodSchema | Object} schema - The Zod or JSON schema. + * @returns {Object} The schema in AI SDK format. + */ +const toAiSdkSchema = (schema) => { + if (isZodSchema(schema)) { + return schema; + } + return jsonSchema(schema); +}; + +/** + * Dereferences $ref pointers in a schema by inlining the referenced schemas. + * Supports both JSON Schema style (#/definitions/...) and OpenAPI style (#/components/schemas/...). + * @param {Object} schema - The schema to dereference. + * @param {Object} rootSchema - The root schema containing definitions/components. + * @returns {Object} The dereferenced schema. + */ +const dereferenceSchema = (schema, rootSchema) => { + if (!schema || typeof schema !== "object") { + return schema; + } + + // Handle arrays + if (Array.isArray(schema)) { + return schema.map((item) => dereferenceSchema(item, rootSchema)); + } + + // Handle $ref + if (schema.$ref) { + const refPath = schema.$ref; + let resolved = null; + + // Parse the reference path + if (refPath.startsWith("#/")) { + const pathParts = refPath.slice(2).split("/"); + resolved = rootSchema; + for (const part of pathParts) { + resolved = resolved?.[part]; + if (!resolved) break; + } + } + + if (resolved) { + // Recursively dereference the resolved schema + return dereferenceSchema(resolved, rootSchema); + } + // If we can't resolve, return an empty object + return {}; + } + + // Recursively process all properties + const result = {}; + for (const [key, value] of Object.entries(schema)) { + if (typeof value === "object" && value !== null) { + result[key] = dereferenceSchema(value, rootSchema); + } else { + result[key] = value; + } + } + + return result; +}; + +/** + * Simplifies a JSON schema for providers with limited schema support (e.g., Ollama). + * - Dereferences $ref pointers + * - Merges allOf schemas + * - Converts top-level anyOf (discriminated unions) into a single object with all options as optional properties + * - Simplifies nested anyOf by preferring object types + * - Removes unsupported keywords like pattern, components, etc. + * @param {Object} schema - The JSON schema to simplify. + * @returns {Object} A simplified schema compatible with basic JSON schema support. + */ +const simplifySchemaForOllama = (schema) => { + // First, dereference any $ref pointers + const dereferenced = dereferenceSchema(schema, schema); + + // Then simplify the dereferenced schema + return simplifySchemaRecursive(dereferenced, true); +}; + +/** + * Recursively simplifies a schema. + * @param {Object} schema - The schema to simplify. + * @param {boolean} isTopLevel - Whether this is the top-level schema (affects anyOf handling). + * @returns {Object} The simplified schema. + */ +const simplifySchemaRecursive = (schema, isTopLevel = false) => { + if (!schema || typeof schema !== "object") { + return schema; + } + + // Handle arrays + if (Array.isArray(schema)) { + return schema.map((item) => simplifySchemaRecursive(item, false)); + } + + const simplified = {}; + + // Check if this is a top-level discriminated union (anyOf with action types) + // These have anyOf where each option has allOf with a required action property + const isDiscriminatedUnion = + isTopLevel && + schema.anyOf && + Array.isArray(schema.anyOf) && + schema.anyOf.length > 1 && + schema.anyOf.every( + (opt) => + opt.allOf || + (opt.required && opt.required.length === 1 && opt.properties) + ); + + for (const [key, value] of Object.entries(schema)) { + // Skip unsupported keywords entirely + if ( + [ + "$schema", + "components", + "examples", + "dynamicDefaults", + "transform", + "not", + "$id", + "$ref", + "definitions", + "$defs", + "pattern", + ].includes(key) + ) { + continue; + } + + // Handle top-level anyOf as discriminated union - merge ALL options + if (key === "anyOf" && isDiscriminatedUnion) { + // Merge all anyOf options into a single schema with all properties optional + const mergedProperties = {}; + + for (const option of value) { + const simplifiedOption = simplifySchemaRecursive(option, false); + + if (simplifiedOption.properties) { + for (const [propKey, propValue] of Object.entries(simplifiedOption.properties)) { + // Don't overwrite if we already have this property (first wins for common props) + if (!mergedProperties[propKey]) { + mergedProperties[propKey] = propValue; + } + } + } + } + + simplified.properties = { + ...simplified.properties, + ...mergedProperties, + }; + // Don't set required - all action properties should be optional in the merged schema + simplified.type = "object"; + continue; + } + + // Handle nested anyOf/oneOf - prefer object types, simplify to single option + if (key === "anyOf" || key === "oneOf") { + const options = value; + + // For nested anyOf, prefer object type schemas + const objectOption = options.find( + (opt) => opt.type === "object" || opt.properties + ); + const selectedOption = objectOption || options[0]; + + if (selectedOption) { + // Merge the selected option into the parent + const simplifiedOption = simplifySchemaRecursive(selectedOption, false); + Object.assign(simplified, simplifiedOption); + } + continue; + } + + // Handle allOf - merge all schemas together + if (key === "allOf") { + for (const subSchema of value) { + const simplifiedSub = simplifySchemaRecursive(subSchema, false); + // Merge properties + if (simplifiedSub.properties) { + simplified.properties = { + ...simplified.properties, + ...simplifiedSub.properties, + }; + } + // Merge required arrays (but we'll clear required for discriminated unions later) + if (simplifiedSub.required) { + simplified.required = [ + ...new Set([ + ...(simplified.required || []), + ...simplifiedSub.required, + ]), + ]; + } + // Copy type if not set + if (simplifiedSub.type && !simplified.type) { + simplified.type = simplifiedSub.type; + } + // Copy other simple properties + for (const [subKey, subValue] of Object.entries(simplifiedSub)) { + if (!["properties", "required", "type"].includes(subKey)) { + simplified[subKey] = subValue; + } + } + } + continue; + } + + // Handle patternProperties - convert to additionalProperties + if (key === "patternProperties") { + // Use the first pattern's schema as additionalProperties + const patterns = Object.values(value); + if (patterns.length > 0) { + simplified.additionalProperties = simplifySchemaRecursive(patterns[0], false); + } + continue; + } + + // Recursively simplify nested objects + if (key === "properties" && typeof value === "object") { + simplified.properties = {}; + for (const [propKey, propValue] of Object.entries(value)) { + simplified.properties[propKey] = simplifySchemaRecursive(propValue, false); + } + continue; + } + + // Recursively simplify items in arrays + if (key === "items") { + simplified.items = simplifySchemaRecursive(value, false); + continue; + } + + // Recursively simplify additionalProperties + if (key === "additionalProperties" && typeof value === "object") { + simplified.additionalProperties = simplifySchemaRecursive(value, false); + continue; + } + + // Copy other properties as-is + simplified[key] = value; + } + + // Ensure type is set for objects with properties + if (simplified.properties && !simplified.type) { + simplified.type = "object"; + } + + return simplified; +}; + +/** + * Extracts the API key for a provider from a Doc Detective config object. + * @param {Object} config - The Doc Detective configuration object. + * @param {"openai" | "anthropic"} provider - The provider name. + * @returns {string | undefined} The API key if found. + */ +const getApiKey = (config, provider) => { + if (!config || !config.integrations) return undefined; + + if ( + provider === "anthropic" && + (process.env.ANTHROPIC_API_KEY || config.integrations.anthropic) + ) { + return ( + process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey + ); + } + + if ( + provider === "openai" && + (process.env.OPENAI_API_KEY || config.integrations.openAi) + ) { + return process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey; + } + + if ( + provider === "google" && + (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google) + ) { + return ( + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations.google.apiKey + ); + } + + return undefined; +}; + +/** + * Generates text or structured output using an AI model. + * + * @param {Object} options - Generation options. + * @param {string} [options.prompt] - The text prompt (required if messages not provided). + * @param {Array} [options.messages] - Array of messages for multi-turn conversation. + * @param {Array} [options.files] - Array of file objects to include (e.g., images). + * @param {string} [options.files[].type] - File type ("image"). + * @param {string} [options.files[].data] - Base64 data or URL. + * @param {string} [options.files[].mimeType] - MIME type (e.g., "image/png"). + * @param {string} [options.model] - Model identifier (default: "anthropic/claude-haiku-4.5"). + * @param {string} [options.system] - System message. + * @param {z.ZodSchema | Object} [options.schema] - Zod schema or JSON schema for structured output. + * @param {string} [options.schemaName] - Name for the schema (used in API calls). + * @param {string} [options.schemaDescription] - Description for the schema. + * @param {"openai" | "anthropic"} [options.provider] - Explicit provider override. + * @param {Object} [options.config] - Doc Detective config object with integrations.anthropic/openai API keys. + * @param {string} [options.apiKey] - API key override (takes precedence over config and env vars). + * @param {string} [options.baseURL] - Base URL override for the provider. + * @param {number} [options.temperature] - Temperature for generation. + * @param {number} [options.maxTokens] - Maximum tokens to generate. + * @returns {Promise} Generation result. + * @returns {string} [result.text] - Generated text (when no schema provided). + * @returns {Object} [result.object] - Generated object (when schema provided). + * @returns {Object} result.usage - Token usage information. + * @returns {string} result.finishReason - Why generation stopped. + * + * @throws {Error} If prompt/messages is missing or provider cannot be determined. + */ +const generate = async ({ + prompt, + messages, + files, + model, + system, + schema, + schemaName, + schemaDescription, + provider, + config = {}, + apiKey, + baseURL, + temperature, + maxTokens, +}) => { + // Validate required input + if (!prompt && (!messages || messages.length === 0)) { + throw new Error("Either 'prompt' or 'messages' is required."); + } + + // Determine provider, model, and API key + const detected = await detectProvider(config, model); + + if (!detected.provider) { + throw new Error( + `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai" or "anthropic").` + ); + } + + // Create provider instance + const providerFactory = createProvider({ + provider: detected.provider, + apiKey: detected.apiKey, + baseURL: baseURL || detected.baseURL, + }); + + // Get model instance + const modelInstance = providerFactory(detected.model); + + // Build generation options + const generationOptions = { + model: modelInstance, + }; + + // Add system message if provided + if (system) { + generationOptions.system = system; + } + + // Add temperature if provided + if (temperature !== undefined) { + generationOptions.temperature = temperature; + } + + // Add maxTokens if provided + if (maxTokens !== undefined) { + generationOptions.maxTokens = maxTokens; + } + + // Build messages or prompt + if (messages && messages.length > 0) { + // Find the index of the last user message + const lastUserIndex = messages.findLastIndex((msg) => msg.role === "user"); + + // Use messages array, attaching files only to the last user message + generationOptions.messages = messages.map((msg, index) => { + if (index === lastUserIndex && files && files.length > 0) { + return { + ...msg, + content: buildMessageContent({ prompt: msg.content, files }), + }; + } + return msg; + }); + } else if (files && files.length > 0) { + // When files are provided, we must use messages format for multimodal content + generationOptions.messages = [ + { + role: "user", + content: buildMessageContent({ prompt, files }), + }, + ]; + } else { + // Use simple prompt for text-only requests + generationOptions.prompt = prompt; + } + + // Handle structured output with schema + if (schema) { + return generateWithSchemaValidation({ + generationOptions, + schema, + schemaName, + schemaDescription, + prompt, + messages, + provider: detected.provider, + }); + } + + // Generate text + const result = await generateText(generationOptions); + + return { + text: result.text, + usage: result.usage, + finishReason: result.finishReason, + }; +}; + +/** + * Generates structured output with schema validation and retry logic. + * @param {Object} options + * @param {Object} options.generationOptions - AI SDK generation options. + * @param {z.ZodSchema | Object} options.schema - Zod schema or JSON schema for validation. + * @param {string} [options.schemaName] - Name for the schema. + * @param {string} [options.schemaDescription] - Description for the schema. + * @param {string} [options.prompt] - Original prompt for retry context. + * @param {Array} [options.messages] - Original messages for retry context. + * @param {string} [options.provider] - The provider being used (e.g., "ollama", "anthropic"). + * @returns {Promise} Generation result with validated object. + */ +const generateWithSchemaValidation = async ({ + generationOptions, + schema, + schemaName, + schemaDescription, + prompt, + messages, + provider, +}) => { + let lastError = null; + let lastObject = null; + let wrappedSchema = false; + + // Store the original schema for validation (before any simplification) + const originalSchema = schema; + + // Simplify schema for Ollama which has limited JSON Schema support + if (provider === "ollama" && !isZodSchema(schema)) { + schema = simplifySchemaForOllama(schema); + } + + // If JSON schema with allOf/anyOf/oneOf at the top level, wrap it in an object + if (!isZodSchema(schema) && (schema.allOf || schema.anyOf || schema.oneOf)) { + schema = { + type: "object", + properties: { + object: schema, + }, + required: ["object"], + additionalProperties: false, + }; + wrappedSchema = true; + } + + // Convert schema to AI SDK format (wraps JSON schemas with jsonSchema()) + const aiSdkSchema = toAiSdkSchema(schema); + + for (let attempt = 1; attempt <= MAX_SCHEMA_VALIDATION_RETRIES; attempt++) { + const objectOptions = { + ...generationOptions, + schema: aiSdkSchema, + }; + + if (schemaName) { + objectOptions.schemaName = schemaName; + } + + if (schemaDescription) { + objectOptions.schemaDescription = schemaDescription; + } + + // Add retry context if this is a retry attempt + if (attempt > 1 && lastError) { + const retryMessage = `Previous attempt failed schema validation with errors: ${lastError}. Please fix these issues and try again.`; + + if (objectOptions.messages) { + // Add retry context to messages + objectOptions.messages = [ + ...objectOptions.messages, + { role: "assistant", content: JSON.stringify(lastObject) }, + { role: "user", content: retryMessage }, + ]; + } else if (typeof objectOptions.prompt === "string") { + // Add retry context to prompt + objectOptions.prompt = `${objectOptions.prompt}\n\n${retryMessage}`; + } + } + + try { + const result = await generateObject(objectOptions); + + const validationObject = wrappedSchema + ? result.object.object + : result.object; + // Use original schema for validation (before Ollama simplification) + // This ensures the output conforms to the full schema requirements + const validationSchema = originalSchema; + + // Validate the generated object against the schema ourselves + const validation = validateAgainstSchema( + validationObject, + validationSchema + ); + + if (validation.valid) { + return { + object: validationObject, + usage: result.usage, + finishReason: result.finishReason, + }; + } + + // Schema validation failed, store error for retry + lastError = validation.errors; + lastObject = validationObject; + + if (attempt === MAX_SCHEMA_VALIDATION_RETRIES) { + throw new Error( + `Schema validation failed after ${MAX_SCHEMA_VALIDATION_RETRIES} attempts. Last errors: ${validation.errors}` + ); + } + } catch (error) { + // If it's our validation error and we have retries left, continue + if ( + error.message.includes("Schema validation failed after") || + attempt === MAX_SCHEMA_VALIDATION_RETRIES + ) { + throw error; + } + + // Store the error and retry + lastError = error.message; + lastObject = null; + } + } + + throw new Error( + `Schema validation failed after ${MAX_SCHEMA_VALIDATION_RETRIES} attempts. Last errors: ${lastError}` + ); +}; + +module.exports = { + generate, + detectProvider, + getApiKey, + modelMap, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, + simplifySchemaForOllama, +}; diff --git a/common/src/index.js b/common/src/index.js index c1f0f0c..7dcd860 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,6 +2,20 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); +const { generate, detectProvider, getApiKey, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { refineStep } = require("./refineStep"); +const { + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + stopOllamaContainer, + ensureOllamaRunning, + isOllamaAvailable, + ensureModelAvailable, +} = require("./ollama"); module.exports = { schemas, @@ -9,4 +23,20 @@ module.exports = { resolvePaths, readFile, transformToSchemaKey, + generate, + detectProvider, + getApiKey, + isOllamaAvailable, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, + refineStep, + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + ensureModelAvailable, + stopOllamaContainer, + ensureOllamaRunning, }; diff --git a/common/src/ollama.js b/common/src/ollama.js new file mode 100644 index 0000000..cfeb754 --- /dev/null +++ b/common/src/ollama.js @@ -0,0 +1,403 @@ +const { execSync, spawn } = require("child_process"); +const fs = require("fs"); + +/** Default Ollama model to use (text model that supports standard chat API) */ +const DEFAULT_OLLAMA_MODEL = "qwen3:4b"; + +/** Timeout for checking Ollama availability */ +const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; + +/** + * Checks if Ollama is available at the specified URL. + * @param {string} [baseUrl] - Optional base URL override. + * @returns {Promise} True if Ollama is available. + */ +const isOllamaAvailable = async (baseUrl) => { + const url = baseUrl || "http://localhost:11434"; + try { + const controller = new AbortController(); + const timeoutId = setTimeout( + () => controller.abort(), + OLLAMA_AVAILABILITY_TIMEOUT_MS + ); + + const response = await fetch(url, { + method: "GET", + signal: controller.signal, + }); + + clearTimeout(timeoutId); + return response.ok; + } catch { + return false; + } +}; + +/** Default Ollama base URL */ +const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/api"; + +/** Maximum time to wait for model pull (10 minutes) */ +const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; + +/** Maximum time to wait for Ollama startup (30 seconds) */ +const OLLAMA_STARTUP_TIMEOUT_MS = 30 * 1000; + +/** + * Detects available GPU type. + * @returns {"nvidia" | "amd" | "none"} The GPU type. + */ +const detectGpuType = () => { + // Check for Nvidia GPU + try { + execSync("nvidia-smi", { stdio: "ignore" }); + return "nvidia"; + } catch { + // nvidia-smi not available or failed + } + + // Check for AMD GPU + try { + if (fs.existsSync("/dev/kfd") && fs.existsSync("/dev/dri")) { + return "amd"; + } + } catch { + // fs check failed + } + + return "none"; +}; + +/** + * Starts the Ollama Docker container with appropriate GPU support. + * @returns {Promise} + */ +const startOllamaContainer = async () => { + // Check if Docker is installed + try { + execSync("docker --version", { stdio: "ignore" }); + } catch { + throw new Error("Docker is not installed or not in PATH"); + } + + const gpuType = detectGpuType(); + console.log(` Detected GPU type: ${gpuType}`); + + let dockerArgs; + switch (gpuType) { + case "nvidia": + dockerArgs = [ + "run", "-d", + "--gpus=all", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + break; + case "amd": + dockerArgs = [ + "run", "-d", + "--device", "/dev/kfd", + "--device", "/dev/dri", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama:rocm" + ]; + break; + default: + dockerArgs = [ + "run", "-d", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + } + + console.log(` Starting Ollama container...`); + execSync(`docker ${dockerArgs.join(" ")}`, { stdio: "inherit" }); +}; + +/** + * Waits for Ollama to become available. + * @param {number} [timeoutMs=OLLAMA_STARTUP_TIMEOUT_MS] - Maximum time to wait. + * @returns {Promise} True if Ollama became available. + */ +const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { + const startTime = Date.now(); + + while (Date.now() - startTime < timeoutMs) { + try { + const response = await fetch("http://localhost:11434"); + if (response.ok) { + return true; + } + } catch { + // Not ready yet + } + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + return false; +}; + +/** + * Stops and removes the Ollama container. + * @returns {Promise} + */ +const stopOllamaContainer = async () => { + try { + console.log(` Stopping Ollama container...`); + execSync("docker stop ollama", { stdio: "ignore" }); + } catch { + // Container may not be running + } + try { + execSync("docker rm ollama", { stdio: "ignore" }); + console.log(` Ollama container removed.`); + } catch { + // Container may not exist + } +}; + +/** + * Ensures Ollama is running, starting a Docker container if needed. + * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to ensure is available. + * @returns {Promise} True if Ollama is available. + */ +const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { + if (await isOllamaAvailable()) { + console.log("Ollama is already running."); + return true; + } + + console.log("Ollama not detected, starting Docker container..."); + + // Clean up any existing container first + await stopOllamaContainer(); + + try { + await startOllamaContainer(); + } catch (error) { + console.error(`Failed to start Ollama container: ${error.message}`); + return false; + } + + const available = await waitForOllama(); + if (!available) { + throw new Error("Ollama container started but did not become available"); + } + + await ensureModelAvailable({ model }); + return true; +}; + +/** + * Checks if a model is available locally. + * @param {Object} options - Options object. + * @param {string} options.model - The model name to check. + * @param {string} [options.baseUrl] - Optional base URL for Ollama API. + * @returns {Promise} True if the model is available locally. + */ +const isModelAvailable = async ({ model, baseUrl = DEFAULT_OLLAMA_BASE_URL }) => { + try { + const response = await fetch(`${baseUrl}/tags`); + if (!response.ok) { + return false; + } + const data = await response.json(); + const models = data.models || []; + + // Check if the model name matches any locally available model + // Model names can be in format "name:tag" or just "name" (defaults to "latest") + const normalizedModel = model.includes(":") ? model : `${model}:latest`; + + return models.some(m => { + const localModel = m.name || m.model; + const normalizedLocal = localModel.includes(":") ? localModel : `${localModel}:latest`; + return normalizedLocal === normalizedModel || localModel === model; + }); + } catch { + return false; + } +}; + +/** + * Formats bytes into a human-readable string. + * @param {number} bytes - The number of bytes. + * @returns {string} Human-readable size string. + */ +const formatBytes = (bytes) => { + if (bytes === 0) return "0 B"; + const k = 1024; + const sizes = ["B", "KB", "MB", "GB", "TB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`; +}; + +/** + * Renders a progress bar to the console. + * @param {Object} options - Options object. + * @param {number} options.completed - Bytes completed. + * @param {number} options.total - Total bytes. + * @param {string} options.status - Current status message. + * @param {number} [options.barWidth=40] - Width of the progress bar. + */ +const renderProgressBar = ({ completed, total, status, barWidth = 40 }) => { + const percentage = total > 0 ? Math.min(100, (completed / total) * 100) : 0; + const filledWidth = Math.round((percentage / 100) * barWidth); + const emptyWidth = barWidth - filledWidth; + + const bar = "█".repeat(filledWidth) + "░".repeat(emptyWidth); + const percentStr = percentage.toFixed(1).padStart(5); + const completedStr = formatBytes(completed); + const totalStr = formatBytes(total); + + // Use carriage return to overwrite the line + process.stdout.write(`\r [${bar}] ${percentStr}% | ${completedStr}/${totalStr} | ${status}`); +}; + +/** + * Ensures a model is available, pulling it if necessary. + * Uses the /api/pull endpoint with streaming to display progress. + * @param {Object} options - Options object. + * @param {string} options.model - The model name to ensure is available. + * @param {string} [options.baseUrl] - Optional base URL for Ollama API. + * @returns {Promise} True if the model is available, false if it cannot be made available. + */ +const ensureModelAvailable = async ({ model, baseUrl = DEFAULT_OLLAMA_BASE_URL }) => { + // First check if Ollama is available + if (!await isOllamaAvailable()) { + console.error(" Ollama is not available."); + return false; + } + + // Check if model is already available + if (await isModelAvailable({ model, baseUrl })) { + console.log(` Model ${model} is already available.`); + return true; + } + + console.log(` Pulling model ${model}...`); + + try { + const response = await fetch(`${baseUrl}/pull`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ model }), + }); + + if (!response.ok) { + console.error(`\n Failed to pull model: HTTP ${response.status}`); + return false; + } + + const reader = response.body.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + let lastStatus = ""; + let lastCompleted = 0; + let lastTotal = 0; + + while (true) { + const { done, value } = await reader.read(); + + if (done) { + break; + } + + buffer += decoder.decode(value, { stream: true }); + + // Process complete JSON objects from the buffer + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; // Keep incomplete line in buffer + + for (const line of lines) { + if (!line.trim()) continue; + + try { + const data = JSON.parse(line); + + if (data.error) { + console.error(`\n Error pulling model: ${data.error}`); + return false; + } + + lastStatus = data.status || lastStatus; + + // Update progress if we have total/completed info + if (data.total !== undefined) { + lastTotal = data.total; + lastCompleted = data.completed || 0; + renderProgressBar({ + completed: lastCompleted, + total: lastTotal, + status: lastStatus.substring(0, 30), + }); + } else if (lastTotal === 0) { + // Status-only update (no download progress) + process.stdout.write(`\r ${lastStatus.padEnd(80)}`); + } + + // Check for success + if (data.status === "success") { + process.stdout.write("\n"); + console.log(` Model ${model} is ready.`); + return true; + } + } catch { + // Ignore JSON parse errors for incomplete data + } + } + } + + // Process any remaining buffer + if (buffer.trim()) { + try { + const data = JSON.parse(buffer); + if (data.status === "success") { + process.stdout.write("\n"); + console.log(` Model ${model} is ready.`); + return true; + } + if (data.error) { + console.error(`\n Error pulling model: ${data.error}`); + return false; + } + } catch { + // Ignore parse errors + } + } + + // If we got here without success, check if model is now available + process.stdout.write("\n"); + const available = await isModelAvailable({ model, baseUrl }); + if (available) { + console.log(` Model ${model} is ready.`); + } else { + console.error(` Failed to make model ${model} available.`); + } + return available; + + } catch (error) { + console.error(`\n Error pulling model: ${error.message}`); + return false; + } +}; + +module.exports = { + DEFAULT_OLLAMA_MODEL, + DEFAULT_OLLAMA_BASE_URL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + OLLAMA_AVAILABILITY_TIMEOUT_MS, + isOllamaAvailable, + detectGpuType, + startOllamaContainer, + waitForOllama, + stopOllamaContainer, + ensureOllamaRunning, + isModelAvailable, + ensureModelAvailable, +}; diff --git a/common/src/refineStep.js b/common/src/refineStep.js new file mode 100644 index 0000000..93fbfd0 --- /dev/null +++ b/common/src/refineStep.js @@ -0,0 +1,310 @@ +const { generate } = require("./ai"); +const { schemas } = require("./schemas"); +const { validate } = require("./validate"); + +const DEFAULT_MAX_CONTEXT_LENGTH = 50000; + +/** + * System prompt for refining Doc Detective steps. + */ +const REFINE_STEP_SYSTEM_PROMPT = `You are a Doc Detective step refinement expert. Your task is to revise a test step to make it pass based on the provided context. + +When refining steps: +1. Analyze any failure messages to understand why the step failed +2. Use the provided context (DOM, CLI output, HTTP response, screenshots) to inform corrections +3. Maintain the original intent of the step while fixing issues +4. Prefer precise CSS selectors when fixing element-related steps +5. Ensure all required fields are present and valid +6. If the step type seems wrong for the context, suggest a more appropriate action type + +Available action types: +- goTo: Navigate to a URL +- find: Locate an element on the page (can include click, type, moveTo, scroll actions) +- click: Click an element +- type: Type text or send keys +- checkLink: Verify a URL returns acceptable status codes +- httpRequest: Make an HTTP request and validate the response +- runShell: Execute a shell command +- runCode: Execute code in a supported language +- screenshot: Capture a screenshot +- wait: Wait for a specified duration +- saveCookie/loadCookie: Cookie management +- record/stopRecord: Video recording +- loadVariables: Load environment variables +- dragAndDrop: Drag and drop elements + +Preserve the stepId and sourceLocation if provided. Return a complete, valid step object.`; + +/** + * Builds the refinement prompt from the provided step and context. + * @param {Object} options + * @param {Object} options.step - The step to refine + * @param {string} [options.sourceContent] - Source documentation content + * @param {Array} [options.previousSteps] - Previously executed steps + * @param {string} [options.failureMessage] - Error message if step failed + * @param {Object} [options.context] - Additional context (DOM, CLI output, HTTP response) + * @param {number} [options.maxContextLength] - Maximum context length before truncation + * @returns {string} The formatted prompt + */ +const buildRefinementPrompt = ({ + step, + sourceContent, + previousSteps, + failureMessage, + context, + maxContextLength = DEFAULT_MAX_CONTEXT_LENGTH, +}) => { + const sections = []; + + // Current step + sections.push( + "## Step to Refine\n```json\n" + JSON.stringify(step, null, 2) + "\n```" + ); + + // Failure message if present + if (failureMessage) { + sections.push("## Failure Message\n" + failureMessage); + } + + // Source content if present + if (sourceContent) { + const truncatedSource = truncateContent( + sourceContent, + Math.floor(maxContextLength / 3) + ); + sections.push("## Source Documentation\n" + truncatedSource); + } + + // Previous steps if present + if (previousSteps && previousSteps.length > 0) { + const stepsJson = JSON.stringify(previousSteps, null, 2); + const truncatedSteps = truncateContent( + stepsJson, + Math.floor(maxContextLength / 4) + ); + sections.push( + "## Previously Executed Steps\n```json\n" + truncatedSteps + "\n```" + ); + } + + // Additional context + if (context) { + const contextSections = []; + + if (context.dom) { + const truncatedDom = truncateContent( + context.dom, + Math.floor(maxContextLength / 3) + ); + contextSections.push( + "### Browser DOM\n```html\n" + truncatedDom + "\n```" + ); + } + + if (context.element) { + const truncatedElement = truncateContent( + typeof context.element === "string" + ? context.element + : JSON.stringify(context.element, null, 2), + Math.floor(maxContextLength / 4) + ); + contextSections.push( + "### Target Element\n```\n" + truncatedElement + "\n```" + ); + } + + if (context.cliOutput) { + const truncatedCli = truncateContent( + context.cliOutput, + Math.floor(maxContextLength / 4) + ); + contextSections.push("### CLI Output\n```\n" + truncatedCli + "\n```"); + } + + if (context.httpResponse) { + const responseStr = + typeof context.httpResponse === "string" + ? context.httpResponse + : JSON.stringify(context.httpResponse, null, 2); + const truncatedHttp = truncateContent( + responseStr, + Math.floor(maxContextLength / 4) + ); + contextSections.push( + "### HTTP Response\n```json\n" + truncatedHttp + "\n```" + ); + } + + if (context.accessibility) { + const accessStr = + typeof context.accessibility === "string" + ? context.accessibility + : JSON.stringify(context.accessibility, null, 2); + const truncatedAccess = truncateContent( + accessStr, + Math.floor(maxContextLength / 4) + ); + contextSections.push( + "### Accessibility Tree\n```\n" + truncatedAccess + "\n```" + ); + } + + if (contextSections.length > 0) { + sections.push("## Current Context\n" + contextSections.join("\n\n")); + } + } + + sections.push( + "## Task\nRefine the step above to make it pass based on the provided context. Return only the refined step object.", + "## Guidelines", + "- Maintain the original intent of the step while fixing issues.", + "- For element-related steps, locate elements using properties in the following order of precedence: elementText (element display text) > elementAria (element ARIA label) > elementId (id attribute) > elementTestId (data-testid attribute) > elementAttributes (arbitrary attributes) > elementClass > selector.", + "- Avoid finding elements by selector if other properties can be used.", + "- Ensure all required fields are present and valid." + ); + + return sections.join("\n\n"); +}; + +/** + * Truncates content to a maximum length, adding an indicator if truncated. + * @param {string} content - The content to truncate + * @param {number} maxLength - Maximum length + * @returns {string} The truncated content + */ +const truncateContent = (content, maxLength) => { + if (!content || content.length <= maxLength) { + return content; + } + return content.substring(0, maxLength) + "\n\n[Content truncated...]"; +}; + +/** + * Refines a Doc Detective step using AI to make it pass the current context. + * + * @param {Object} options - Refinement options + * @param {Object} options.step - The step to refine (required) + * @param {string} [options.sourceContent] - Source documentation content (recommended) + * @param {Array} [options.previousSteps] - Previously executed steps for context + * @param {string} [options.failureMessage] - Error message if the step failed previously + * @param {Object} [options.context] - Additional context object + * @param {string} [options.context.dom] - Browser DOM snapshot + * @param {string|Object} [options.context.element] - Specific element information + * @param {string} [options.context.cliOutput] - CLI command output + * @param {string|Object} [options.context.httpResponse] - HTTP response data + * @param {string|Object} [options.context.accessibility] - Accessibility tree snapshot + * @param {Object} [options.config] - Doc Detective configuration object + * @param {Object} [options.config.integrations] - Integration configurations + * @param {Object} [options.config.integrations.anthropic] - Anthropic configuration + * @param {string} [options.config.integrations.anthropic.apiKey] - Anthropic API key + * @param {Object} [options.config.integrations.openai] - OpenAI configuration + * @param {string} [options.config.integrations.openai.apiKey] - OpenAI API key + * @param {Object} [options.config.ai] - Legacy AI configuration (deprecated, use integrations) + * @param {string} [options.config.ai.model] - LLM model to use + * @param {string} [options.config.ai.apiKey] - API key for the LLM provider (deprecated) + * @param {string} [options.config.ai.baseURL] - Base URL for the LLM provider + * @param {string} [options.model] - LLM model override (takes precedence over config) + * @param {Array} [options.files] - Screenshots or images for multimodal analysis + * @param {number} [options.maxContextLength] - Maximum context length before truncation (default: 50000) + * @returns {Promise} A promise that resolves to a refined step_v3 compatible step + * @throws {Error} If step is not provided or refinement fails + * + * @example + * const refinedStep = await refineStep({ + * step: { find: { selector: ".old-class" } }, + * failureMessage: "Element not found: .old-class", + * context: { dom: "..." }, + * config: { integrations: { anthropic: { apiKey: "sk-..." } } } + * }); + */ +const refineStep = async ({ + step, + sourceContent, + previousSteps, + failureMessage, + context, + config = {}, + model, + files, + maxContextLength = DEFAULT_MAX_CONTEXT_LENGTH, +}) => { + // Validate required input + if (!step || typeof step !== "object") { + throw new Error("'step' is required and must be an object."); + } + + // Extract AI configuration (support both legacy config.ai and new config.integrations) + const aiConfig = config?.ai || {}; + const resolvedModel = model || aiConfig.model; + const baseURL = aiConfig.baseURL; + + // Build the prompt + const prompt = buildRefinementPrompt({ + step, + sourceContent, + previousSteps, + failureMessage, + context, + maxContextLength, + }); + + // Get the step schema for structured output + // Wrap the step schema in an object to move anyOf/oneOf down a level + // This is required because Anthropic's API doesn't support anyOf/oneOf/allOf at the top level + const stepSchema = schemas.step_v3; + + // Generate the refined step using AI + // Pass config for integrations API keys, generate() will extract the right one + const result = await generate({ + prompt, + system: REFINE_STEP_SYSTEM_PROMPT, + schema: stepSchema, + schemaName: "step", + schemaDescription: "An object containing a Doc Detective test step", + model: resolvedModel, + config, + baseURL, + files, + }); + + // Extract the step from the wrapper and post-process + const refinedStep = postProcessStep(result.object, step); + + // Validate the step against the schema + const validation = validate({ schemaKey: "step_v3", object: refinedStep }); + if (!validation.valid) { + throw new Error( + `Refined step failed validation: ${JSON.stringify(validation.errors)}` + ); + } + + return refinedStep; +}; + +/** + * Post-processes the refined step to preserve original metadata. + * @param {Object} refinedStep - The AI-generated refined step + * @param {Object} originalStep - The original step + * @returns {Object} The post-processed step + */ +const postProcessStep = (refinedStep, originalStep) => { + // Preserve stepId from original if present and not in refined + if (originalStep?.stepId && !refinedStep?.stepId) { + refinedStep.stepId = originalStep.stepId; + } + + // Preserve sourceLocation from original if present + if (originalStep?.sourceLocation && !refinedStep?.sourceLocation) { + refinedStep.sourceLocation = originalStep.sourceLocation; + } + + return refinedStep; +}; + +module.exports = { + refineStep, + buildRefinementPrompt, + truncateContent, + REFINE_STEP_SYSTEM_PROMPT, + DEFAULT_MAX_CONTEXT_LENGTH, +}; diff --git a/common/src/schemas/dereferenceSchemas.js b/common/src/schemas/dereferenceSchemas.js index cd1d7c5..dcfa6c4 100644 --- a/common/src/schemas/dereferenceSchemas.js +++ b/common/src/schemas/dereferenceSchemas.js @@ -44,6 +44,7 @@ async function dereferenceSchemas() { "runShell_v3.schema.json", "saveCookie_v3.schema.json", "screenshot_v3.schema.json", + "sourceLocation_v3.schema.json", "spec_v3.schema.json", "step_v3.schema.json", "stopRecord_v3.schema.json", diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index 37355c3..c187bfa 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -807,6 +807,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -859,6 +965,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -919,6 +1131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1135,6 +1453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1458,6 +1882,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2878,6 +3408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3368,6 +4004,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4433,14 +5175,120 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false }, "outputs": { "type": "object", @@ -4740,6 +5588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5033,6 +5987,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5348,6 +6408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6000,6 +7166,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6316,6 +7588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6488,6 +7866,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6573,6 +8057,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6649,10 +8239,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7220,6 +8916,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7519,6 +9321,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8486,6 +10394,55 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" @@ -8715,6 +10672,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8767,6 +10830,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8827,6 +10996,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9018,30 +11293,136 @@ ] } ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "checkLink" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -9366,6 +11747,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10786,6 +13273,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11276,6 +13869,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12341,6 +15040,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12648,6 +15453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12941,6 +15852,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13252,10 +16269,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13908,6 +17031,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14224,6 +17453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14396,6 +17731,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14481,6 +17922,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14561,6 +18108,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15128,6 +18781,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15427,6 +19186,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/report_v3.schema.json b/common/src/schemas/output_schemas/report_v3.schema.json index 6cc1350..6955451 100644 --- a/common/src/schemas/output_schemas/report_v3.schema.json +++ b/common/src/schemas/output_schemas/report_v3.schema.json @@ -627,6 +627,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1240,6 +1346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1292,6 +1504,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1352,6 +1670,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1568,6 +1992,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1891,6 +2421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3311,6 +3947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3801,20 +4543,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4866,6 +5714,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5173,6 +6127,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5466,6 +6526,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5781,6 +6947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6433,6 +7705,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6749,33 +8127,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6921,6 +8405,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7006,6 +8596,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7086,6 +8782,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7653,6 +9455,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7952,6 +9860,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8717,24 +10731,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8769,6 +10889,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8829,6 +11055,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9045,6 +11377,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9368,6 +11806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10788,6 +13332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11278,23 +13928,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12343,6 +15099,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12650,6 +15512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12943,6 +15911,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13258,6 +16332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13910,6 +17090,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14226,6 +17512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14398,6 +17790,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14483,6 +17981,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14563,6 +18167,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15130,6 +18840,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15429,6 +19245,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index a0f89f7..ba60461 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -820,6 +820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -872,6 +978,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -932,6 +1144,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1148,6 +1466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1471,6 +1895,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2891,6 +3421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3381,33 +4017,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -4446,6 +5188,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4753,6 +5601,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5046,6 +6000,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5361,6 +6421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6013,6 +7179,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6329,12 +7601,118 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, @@ -6501,6 +7879,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6586,6 +8070,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6666,6 +8256,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7233,6 +8929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7532,6 +9334,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8499,29 +10407,78 @@ } }, "title": "Doc Detective Orchestration API" - } - }, - "title": "Integrations options" - }, - "telemetry": { - "description": "Options around sending telemetry for Doc Detective usage.", - "type": "object", - "additionalProperties": false, - "properties": { - "send": { - "description": "If `true`, sends Doc Detective telemetry.", - "type": "boolean", - "default": true }, - "userId": { - "description": "Identifier for the organization, group, or individual running Doc Detective.", - "type": "string" - } - }, - "required": [ - "send" - ], - "default": { + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" + } + }, + "title": "Integrations options" + }, + "telemetry": { + "description": "Options around sending telemetry for Doc Detective usage.", + "type": "object", + "additionalProperties": false, + "properties": { + "send": { + "description": "If `true`, sends Doc Detective telemetry.", + "type": "boolean", + "default": true + }, + "userId": { + "description": "Identifier for the organization, group, or individual running Doc Detective.", + "type": "string" + } + }, + "required": [ + "send" + ], + "default": { "send": true }, "title": "Telemetry options" @@ -8728,6 +10685,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8780,6 +10843,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8840,6 +11009,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9056,6 +11331,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9379,6 +11760,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10799,23 +13286,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -11289,6 +13882,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12354,6 +15053,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12661,6 +15466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12954,6 +15865,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13269,6 +16286,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13921,27 +17044,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -14237,6 +17466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14409,6 +17744,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14494,6 +17935,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14574,6 +18121,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15141,6 +18794,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15440,23 +19199,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -16792,6 +20657,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -17405,6 +21376,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17457,6 +21534,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17517,6 +21700,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17733,6 +22022,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -18056,29 +22451,135 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", "description": "Environment variables to set from user-defined expressions.", "default": {}, "patternProperties": { @@ -19476,6 +23977,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -19966,6 +24573,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21031,6 +25744,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21338,6 +26157,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21631,6 +26556,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21946,27 +26977,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -22598,6 +27735,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -22914,6 +28157,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23086,6 +28435,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23171,6 +28626,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23251,6 +28812,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23818,6 +29485,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24083,39 +29856,145 @@ "path": "test-cookie.txt" }, { - "name": "session_token", - "path": "session-token.txt", - "directory": "./test-data" + "name": "session_token", + "path": "session-token.txt", + "directory": "./test-data" + }, + { + "name": "user_session", + "path": "saved-cookies.txt", + "domain": "app.example.com" + } + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" }, { - "name": "user_session", - "path": "saved-cookies.txt", - "domain": "app.example.com" + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." }, "description": { "type": "string", @@ -24882,6 +30761,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24934,6 +30919,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24994,6 +31085,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25210,6 +31407,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25533,6 +31836,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26949,10 +33358,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27443,6 +33958,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28508,6 +35129,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28815,6 +35542,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29108,6 +35941,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29423,6 +36362,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30050,30 +37095,136 @@ } } ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "screenshot" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -30391,6 +37542,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30563,6 +37820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30648,6 +38011,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30728,6 +38197,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31295,6 +38870,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31594,6 +39275,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/sourceLocation_v3.schema.json b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json new file mode 100644 index 0000000..b7b7ef6 --- /dev/null +++ b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json @@ -0,0 +1,120 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "required": ["file", "startLine", "endLine"], + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "allOf": [ + { + "if": { + "properties": { + "isInline": { "const": true } + }, + "required": ["isInline"] + }, + "then": { + "required": ["commentFormat"] + } + } + ], + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "linkReference" + } + ] +} \ No newline at end of file diff --git a/common/src/schemas/output_schemas/spec_v3.schema.json b/common/src/schemas/output_schemas/spec_v3.schema.json index 6c1d56a..d36c97c 100644 --- a/common/src/schemas/output_schemas/spec_v3.schema.json +++ b/common/src/schemas/output_schemas/spec_v3.schema.json @@ -609,6 +609,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1222,6 +1328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1274,6 +1486,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1334,6 +1652,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1550,6 +1974,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1873,6 +2403,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3293,6 +3929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3783,20 +4525,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4848,6 +5696,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5155,6 +6109,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5448,6 +6508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5763,6 +6929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6415,6 +7687,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6731,33 +8109,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6903,6 +8387,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6988,6 +8578,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7068,6 +8764,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7635,6 +9437,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7934,6 +9842,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8699,24 +10713,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8751,6 +10871,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8811,6 +11037,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9027,6 +11359,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9350,6 +11788,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10770,6 +13314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11260,23 +13910,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12325,6 +15081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12632,6 +15494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12925,6 +15893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13240,6 +16314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13892,6 +17072,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14208,6 +17494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14380,6 +17772,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14465,6 +17963,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14545,6 +18149,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15112,6 +18822,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15411,6 +19227,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/step_v3.schema.json b/common/src/schemas/output_schemas/step_v3.schema.json index 8960667..3de27b4 100644 --- a/common/src/schemas/output_schemas/step_v3.schema.json +++ b/common/src/schemas/output_schemas/step_v3.schema.json @@ -22,6 +22,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -74,6 +180,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -134,6 +346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -350,6 +668,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +1097,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2093,6 +2623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2583,6 +3219,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3648,6 +4390,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3955,13 +4803,119 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, "outputs": { @@ -4248,6 +5202,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4563,6 +5623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5215,6 +6381,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5531,6 +6803,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5703,6 +7081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5788,6 +7272,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5868,6 +7458,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6435,6 +8131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6734,6 +8536,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/test_v3.schema.json b/common/src/schemas/output_schemas/test_v3.schema.json index 9d86ed1..19f99ec 100644 --- a/common/src/schemas/output_schemas/test_v3.schema.json +++ b/common/src/schemas/output_schemas/test_v3.schema.json @@ -8,6 +8,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -621,6 +727,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +885,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -733,6 +1051,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -949,6 +1373,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1272,6 +1802,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2692,6 +3328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3182,25 +3924,131 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, "title": "Outputs (step)" }, "variables": { @@ -4247,6 +5095,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4554,6 +5508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4847,6 +5907,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5162,6 +6328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5814,6 +7086,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6130,31 +7508,137 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", @@ -6302,6 +7786,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6387,6 +7977,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6467,6 +8163,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7034,6 +8836,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7333,6 +9241,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8098,26 +10112,132 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" }, "variables": { "type": "object", @@ -8150,6 +10270,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8210,6 +10436,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8426,6 +10758,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8749,6 +11187,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10169,6 +12713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10659,22 +13309,128 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", "description": "Runtime expression for a user-defined output value." } }, @@ -11724,6 +14480,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12031,6 +14893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12324,6 +15292,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12639,6 +15713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13291,6 +16471,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13607,6 +16893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13779,6 +17171,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13864,6 +17362,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13944,6 +17548,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14511,6 +18221,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14810,6 +18626,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 6cfab64..c4d37af 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -1205,6 +1205,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1257,6 +1363,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1317,6 +1529,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1533,6 +1851,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1856,6 +2280,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3276,6 +3806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3766,6 +4402,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4831,6 +5573,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5138,6 +5986,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5431,6 +6385,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5746,6 +6806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6398,6 +7564,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6714,6 +7986,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6886,6 +8264,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6971,6 +8455,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7051,6 +8641,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7618,6 +9314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7917,6 +9719,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8884,6 +10792,55 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" @@ -9113,6 +11070,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9165,6 +11228,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9225,6 +11394,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9441,6 +11716,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9764,6 +12145,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11184,6 +13671,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11674,6 +14267,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12739,6 +15438,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13046,6 +15851,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13339,6 +16250,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13654,6 +16671,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14306,6 +17429,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14622,6 +17851,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14794,91 +18129,303 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ + "examples": [ { - "type": "boolean", - "nullable": true + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -14959,6 +18506,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15526,6 +19179,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15825,6 +19584,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21514,6 +25379,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21566,6 +25537,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21626,6 +25703,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21842,6 +26025,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -22165,6 +26454,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23585,6 +27980,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24075,6 +28576,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25140,6 +29747,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25447,6 +30160,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25740,6 +30559,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26055,6 +30980,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26707,6 +31738,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27023,6 +32160,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27195,6 +32438,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27280,6 +32629,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27360,6 +32815,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27927,6 +33488,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28226,6 +33893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29193,6 +34966,55 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" @@ -29422,6 +35244,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29474,6 +35402,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29534,6 +35568,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29750,6 +35890,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30073,6 +36319,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31493,6 +37845,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31983,6 +38441,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33048,6 +39612,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33355,6 +40025,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33648,6 +40424,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33963,6 +40845,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -34615,6 +41603,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -34931,6 +42025,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -35103,6 +42303,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -35188,86 +42494,298 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -35835,6 +43353,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -36134,6 +43758,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -37486,6 +45216,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -38099,6 +45935,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38151,6 +46093,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38211,6 +46259,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38427,6 +46581,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38750,6 +47010,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -40170,6 +48536,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -40660,6 +49132,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -41725,6 +50303,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -42032,6 +50716,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -42325,6 +51115,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -42640,6 +51536,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43292,6 +52294,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43608,6 +52716,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43780,6 +52994,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43865,6 +53185,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43945,6 +53371,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -44512,6 +54044,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -44811,6 +54449,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45576,6 +55320,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45628,6 +55478,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45688,6 +55644,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45904,6 +55966,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -46227,6 +56395,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -47647,6 +57921,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -48137,6 +58517,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -49202,6 +59688,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -49509,6 +60101,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -49802,6 +60500,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -50117,6 +60921,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -50769,6 +61679,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -51085,6 +62101,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -51257,171 +62379,489 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ - { + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { "type": "boolean", - "nullable": true - } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -51989,6 +63429,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -52288,6 +63834,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -54150,6 +65802,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -54763,6 +66521,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -54815,6 +66679,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -54875,6 +66845,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -55091,6 +67167,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -55414,6 +67596,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -56834,6 +69122,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -57324,6 +69718,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -58389,6 +70889,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -58696,6 +71302,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -58989,6 +71701,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -59304,6 +72122,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -59956,6 +72880,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60272,6 +73302,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60444,6 +73580,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60529,6 +73771,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60609,6 +73957,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -61176,6 +74630,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -61475,6 +75035,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62240,6 +75906,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62292,6 +76064,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62352,6 +76230,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62568,6 +76552,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62891,6 +76981,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -64311,6 +78507,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -64801,6 +79103,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -65866,6 +80274,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -66173,6 +80687,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -66466,6 +81086,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -66781,6 +81507,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -67433,6 +82265,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -67749,6 +82687,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -67921,6 +82965,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -68006,6 +83156,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -68086,6 +83342,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -68653,6 +84015,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -68952,6 +84420,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -71435,6 +87009,112 @@ } ] }, + "sourceLocation_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "spec_v3": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "specification", @@ -72046,6 +87726,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -72659,6 +88445,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -72711,6 +88603,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -72771,6 +88769,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -72987,6 +89091,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -73310,6 +89520,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -74730,6 +91046,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -75220,6 +91642,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -76285,6 +92813,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -76592,6 +93226,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -76885,6 +93625,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -77200,6 +94046,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -77852,6 +94804,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78168,6 +95226,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78340,6 +95504,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78425,6 +95695,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78505,6 +95881,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -79072,6 +96554,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -79371,6 +96959,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80136,6 +97830,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80188,6 +97988,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80248,6 +98154,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80464,6 +98476,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80787,6 +98905,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -82207,6 +100431,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -82697,6 +101027,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -83762,6 +102198,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -84069,6 +102611,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -84362,6 +103010,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -84677,6 +103431,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85329,6 +104189,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85645,6 +104611,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85817,171 +104889,489 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ - { + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { "type": "boolean", - "nullable": true - } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -86549,6 +105939,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -86848,6 +106344,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -87893,6 +107495,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -87945,6 +107653,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -88005,6 +107819,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -88221,6 +108141,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -88544,6 +108570,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -89964,6 +110096,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -90454,6 +110692,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -91519,6 +111863,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -91826,6 +112276,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -92119,6 +112675,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -92434,6 +113096,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93086,6 +113854,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93402,6 +114276,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93574,6 +114554,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93659,6 +114745,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93739,6 +114931,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -94306,6 +115604,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -94605,6 +116009,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -95112,6 +116622,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -95725,6 +117341,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -95777,6 +117499,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -95837,6 +117665,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -96053,6 +117987,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -96376,6 +118416,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -97796,6 +119942,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -98286,6 +120538,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -99351,6 +121709,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -99658,6 +122122,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -99951,6 +122521,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -100266,6 +122942,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -100918,6 +123700,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -101234,6 +124122,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -101406,91 +124400,303 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ + "examples": [ { - "type": "boolean", - "nullable": true + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -101571,6 +124777,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -102138,6 +125450,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -102437,6 +125855,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103202,6 +126726,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103254,6 +126884,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103314,6 +127050,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103530,6 +127372,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103853,6 +127801,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -105273,6 +129327,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -105763,6 +129923,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -106828,6 +131094,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -107135,6 +131507,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -107428,6 +131906,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -107743,6 +132327,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -108395,6 +133085,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -108711,6 +133507,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -108883,90 +133785,302 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ + "examples": [ { - "type": "boolean", - "nullable": true + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } - ], - "examples": [ - true ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." }, "description": { "type": "string", @@ -109048,6 +134162,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -109615,6 +134835,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -109914,6 +135240,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index 6eb2430..3858229 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -222,6 +222,55 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openAi": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/src/schemas/src_schemas/sourceLocation_v3.schema.json b/common/src/schemas/src_schemas/sourceLocation_v3.schema.json new file mode 100644 index 0000000..6d22dba --- /dev/null +++ b/common/src/schemas/src_schemas/sourceLocation_v3.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] +} diff --git a/common/src/schemas/src_schemas/step_v3.schema.json b/common/src/schemas/src_schemas/step_v3.schema.json index b5f66a2..f5b9d12 100644 --- a/common/src/schemas/src_schemas/step_v3.schema.json +++ b/common/src/schemas/src_schemas/step_v3.schema.json @@ -17,6 +17,9 @@ "stepId": { "$ref": "#/components/schemas/stepId" }, + "sourceLocation": { + "$ref": "#/components/schemas/sourceLocation" + }, "description": { "$ref": "#/components/schemas/description" }, @@ -46,6 +49,10 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "$ref": "sourceLocation_v3.schema.json#", + "description": "Source location information for inline steps. Read-only, populated during detection." + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/src_schemas/test_v3.schema.json b/common/src/schemas/src_schemas/test_v3.schema.json index 6a78b5c..34d26d6 100644 --- a/common/src/schemas/src_schemas/test_v3.schema.json +++ b/common/src/schemas/src_schemas/test_v3.schema.json @@ -8,6 +8,10 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "$ref": "sourceLocation_v3.schema.json#", + "description": "Source location information for inline tests. Read-only, populated during detection." + }, "description": { "type": "string", "description": "Description of the test." diff --git a/common/test/ai.test.js b/common/test/ai.test.js new file mode 100644 index 0000000..75d7ab3 --- /dev/null +++ b/common/test/ai.test.js @@ -0,0 +1,748 @@ +const { z } = require("zod"); + +const { + ensureOllamaRunning, + stopOllamaContainer, + isOllamaAvailable, + MODEL_PULL_TIMEOUT_MS, +} = require("../src/ollama"); + +// Track if we started the container +let weStartedOllama = false; + +// Import chai using dynamic import (needed for ESM) +let expect; + +// Import AI module functions +const { + generate, + detectProvider, + getApiKey, + modelMap, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, +} = require("../src/ai"); + +describe("AI Module", function () { + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + + before(async function () { + // Dynamic import for chai ESM + const chai = await import("chai"); + expect = chai.expect; + + console.log(" Setting up Ollama for tests..."); + // Track if we need to start the container + const wasAlreadyRunning = await isOllamaAvailable(); + const isOllamaRunning = await ensureOllamaRunning(); + if (!isOllamaRunning) { + console.warn("Warning: Ollama is not available. Some tests may be skipped."); + } + weStartedOllama = !wasAlreadyRunning; + }); + + after(async function () { + if (weStartedOllama) { + console.log("Cleaning up Ollama container..."); + await stopOllamaContainer(); + } + }); + + describe("modelMap", function () { + it("should contain Anthropic model mappings", function () { + expect(modelMap["anthropic/claude-haiku-4.5"]).to.equal("claude-haiku-4-5"); + expect(modelMap["anthropic/claude-sonnet-4.5"]).to.equal("claude-sonnet-4-5"); + expect(modelMap["anthropic/claude-opus-4.5"]).to.equal("claude-opus-4-5"); + }); + + it("should contain OpenAI model mappings", function () { + expect(modelMap["openai/gpt-5.2"]).to.equal("gpt-5.2"); + expect(modelMap["openai/gpt-5-mini"]).to.equal("gpt-5-mini"); + expect(modelMap["openai/gpt-5-nano"]).to.equal("gpt-5-nano"); + }); + + it("should contain Ollama model mappings", function () { + expect(modelMap["ollama/qwen3:4b"]).to.equal("qwen3:4b"); + expect(modelMap["ollama/qwen3:8b"]).to.equal("qwen3:8b"); + }); + + it("should contain Google Gemini model mappings", function () { + expect(modelMap["google/gemini-2.5-flash"]).to.equal("gemini-2.5-flash"); + expect(modelMap["google/gemini-2.5-pro"]).to.equal("gemini-2.5-pro"); + expect(modelMap["google/gemini-3-pro"]).to.equal("gemini-3-pro-preview"); + }); + }); + + describe("detectProvider", function () { + // Store original env vars to restore after tests + let originalAnthropicKey; + let originalOpenAIKey; + let originalGoogleKey; + + beforeEach(function () { + originalAnthropicKey = process.env.ANTHROPIC_API_KEY; + originalOpenAIKey = process.env.OPENAI_API_KEY; + originalGoogleKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY; + // Clear env vars for predictable testing + delete process.env.ANTHROPIC_API_KEY; + delete process.env.OPENAI_API_KEY; + delete process.env.GOOGLE_GENERATIVE_AI_API_KEY; + }); + + afterEach(function () { + // Restore original env vars + if (originalAnthropicKey !== undefined) { + process.env.ANTHROPIC_API_KEY = originalAnthropicKey; + } else { + delete process.env.ANTHROPIC_API_KEY; + } + if (originalOpenAIKey !== undefined) { + process.env.OPENAI_API_KEY = originalOpenAIKey; + } else { + delete process.env.OPENAI_API_KEY; + } + if (originalGoogleKey !== undefined) { + process.env.GOOGLE_GENERATIVE_AI_API_KEY = originalGoogleKey; + } else { + delete process.env.GOOGLE_GENERATIVE_AI_API_KEY; + } + }); + + it("should detect Ollama provider for known Ollama models", async function () { + const config = {}; + const result = await detectProvider(config, "ollama/qwen3:4b"); + expect(result.provider).to.equal("ollama"); + expect(result.model).to.equal("qwen3:4b"); + expect(result.apiKey).to.be.null; + expect(result.baseURL).to.equal("http://localhost:11434/api"); + }); + + it("should use custom baseUrl from config for Ollama", async function () { + const config = { integrations: { ollama: { baseUrl: "http://custom:11434/api" } } }; + const result = await detectProvider(config, "ollama/qwen3:4b"); + expect(result.provider).to.equal("ollama"); + expect(result.baseURL).to.equal("http://custom:11434/api"); + }); + + it("should detect Anthropic provider and mapped model for known Anthropic models with config API key", async function () { + const config = { integrations: { anthropic: { apiKey: "sk-ant-test" } } }; + expect(await detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-haiku-4-5", + apiKey: "sk-ant-test", + }); + expect(await detectProvider(config, "anthropic/claude-sonnet-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-sonnet-4-5", + apiKey: "sk-ant-test", + }); + expect(await detectProvider(config, "anthropic/claude-opus-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-opus-4-5", + apiKey: "sk-ant-test", + }); + }); + + it("should detect Anthropic provider with env API key", async function () { + process.env.ANTHROPIC_API_KEY = "sk-ant-env"; + const config = {}; + expect(await detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-haiku-4-5", + apiKey: "sk-ant-env", + }); + }); + + it("should detect OpenAI provider and mapped model for known OpenAI models with config API key", async function () { + const config = { integrations: { openAi: { apiKey: "sk-openai-test" } } }; + expect(await detectProvider(config, "openai/gpt-5.2")).to.deep.equal({ + provider: "openai", + model: "gpt-5.2", + apiKey: "sk-openai-test", + }); + expect(await detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ + provider: "openai", + model: "gpt-5-mini", + apiKey: "sk-openai-test", + }); + expect(await detectProvider(config, "openai/gpt-5-nano")).to.deep.equal({ + provider: "openai", + model: "gpt-5-nano", + apiKey: "sk-openai-test", + }); + }); + + it("should detect OpenAI provider with env API key", async function () { + process.env.OPENAI_API_KEY = "sk-openai-env"; + const config = {}; + expect(await detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ + provider: "openai", + model: "gpt-5-mini", + apiKey: "sk-openai-env", + }); + }); + + it("should detect Google provider and mapped model for known Google models with config API key", async function () { + const config = { integrations: { google: { apiKey: "google-test-key" } } }; + expect(await detectProvider(config, "google/gemini-2.5-flash")).to.deep.equal({ + provider: "google", + model: "gemini-2.5-flash", + apiKey: "google-test-key", + }); + expect(await detectProvider(config, "google/gemini-2.5-pro")).to.deep.equal({ + provider: "google", + model: "gemini-2.5-pro", + apiKey: "google-test-key", + }); + expect(await detectProvider(config, "google/gemini-3-pro")).to.deep.equal({ + provider: "google", + model: "gemini-3-pro-preview", + apiKey: "google-test-key", + }); + }); + + it("should detect Google provider with env API key", async function () { + process.env.GOOGLE_GENERATIVE_AI_API_KEY = "google-env-key"; + const config = {}; + expect(await detectProvider(config, "google/gemini-2.5-flash")).to.deep.equal({ + provider: "google", + model: "gemini-2.5-flash", + apiKey: "google-env-key", + }); + }); + + it("should prefer env API key over config API key for Google", async function () { + process.env.GOOGLE_GENERATIVE_AI_API_KEY = "google-env-key"; + const config = { integrations: { google: { apiKey: "google-config-key" } } }; + expect((await detectProvider(config, "google/gemini-2.5-flash")).apiKey).to.equal("google-env-key"); + }); + + it("should prefer env API key over config API key", async function () { + process.env.ANTHROPIC_API_KEY = "sk-ant-env"; + const config = { integrations: { anthropic: { apiKey: "sk-ant-config" } } }; + expect((await detectProvider(config, "anthropic/claude-haiku-4.5")).apiKey).to.equal("sk-ant-env"); + }); + + it("should fall back to Ollama as default provider when available", async function () { + const config = {}; + const result = await detectProvider(config, "unknown-model"); + // Ollama should be preferred when available + expect(result.provider).to.equal("ollama"); + expect(result.model).to.equal("qwen3:4b"); + }); + + it("should return null values when model is known but no API key for that provider", async function () { + const config = {}; + // For Anthropic model without API key + expect(await detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + provider: null, + model: null, + }); + }); + }); + + describe("DEFAULT_MODEL", function () { + it("should be ollama/qwen3:4b", function () { + expect(DEFAULT_MODEL).to.equal("ollama/qwen3:4b"); + }); + }); + + describe("MAX_SCHEMA_VALIDATION_RETRIES", function () { + it("should be 3", function () { + expect(MAX_SCHEMA_VALIDATION_RETRIES).to.equal(3); + }); + }); + + describe("generate", function () { + describe("input validation", function () { + it("should throw error when neither prompt nor messages provided", async function () { + try { + await generate({}); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("Either 'prompt' or 'messages' is required."); + } + }); + + it("should throw error when messages array is empty", async function () { + try { + await generate({ messages: [] }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("Either 'prompt' or 'messages' is required."); + } + }); + + it("should throw error when provider cannot be determined and Ollama not available", async function () { + // This test verifies error handling when no provider is available + // Since Ollama is running, we need to test with an explicit model that + // requires an API key that isn't configured + const originalAnthropicKey = process.env.ANTHROPIC_API_KEY; + const originalOpenAIKey = process.env.OPENAI_API_KEY; + delete process.env.ANTHROPIC_API_KEY; + delete process.env.OPENAI_API_KEY; + + try { + // Use an Anthropic model explicitly without API key configured + await generate({ prompt: "Hello", model: "anthropic/claude-haiku-4.5", config: {} }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.include("Cannot determine provider"); + expect(error.message).to.include("anthropic/claude-haiku-4.5"); + } finally { + // Restore env vars + if (originalAnthropicKey !== undefined) { + process.env.ANTHROPIC_API_KEY = originalAnthropicKey; + } + if (originalOpenAIKey !== undefined) { + process.env.OPENAI_API_KEY = originalOpenAIKey; + } + } + }); + }); + + describe("text generation", function () { + it("should generate text with default model (Ollama)", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello World", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate text with explicit Ollama model", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + try { + const result = await generate({ + prompt: "Reply with exactly one word: Yes", + model: "ollama/qwen3:4b", + maxTokens: 20, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Skip if we get an Internal Server Error (model may not be available) + if (error.message && error.message.includes("Internal Server Error")) { + this.skip(); + } + throw error; + } + }); + + it("should generate text with OpenAI model", async function () { + // Skip if no API key is set + if (!process.env.OPENAI_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello World", + model: "openai/gpt-4o-mini", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate text with Anthropic model (smoke test)", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello from Anthropic", + model: "anthropic/claude-haiku-4.5", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate text with Google Gemini model (smoke test)", async function () { + // Skip if no API key is set + if (!process.env.GOOGLE_GENERATIVE_AI_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello from Google", + model: "google/gemini-2.5-flash", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should include system message in generation", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const result = await generate({ + prompt: "What is your name?", + system: "You are a helpful assistant named TestBot. Always respond with your name.", + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.toLowerCase()).to.include("testbot"); + }); + }); + + describe("structured output with schema validation", function () { + const personSchema = z.object({ + name: z.string().describe("The person's full name"), + age: z.number().min(0).max(150).describe("The person's age in years"), + }); + + // JSON Schema equivalent for testing + const personJsonSchema = { + type: "object", + properties: { + name: { type: "string", description: "The person's full name" }, + age: { type: "number", minimum: 0, maximum: 150, description: "The person's age in years" }, + }, + required: ["name", "age"], + additionalProperties: false, + }; + + it("should generate valid structured output with Zod schema", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const result = await generate({ + prompt: "Generate a fictional person named Alice who is 28 years old", + schema: personSchema, + schemaName: "Person", + }); + + expect(result.object).to.be.an("object"); + expect(result.object.name).to.be.a("string"); + expect(result.object.age).to.be.a("number"); + expect(result.object.age).to.be.at.least(0); + expect(result.object.age).to.be.at.most(150); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate valid structured output with JSON schema", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const result = await generate({ + prompt: "Generate a fictional person named Bob who is 42 years old", + schema: personJsonSchema, + schemaName: "Person", + }); + + expect(result.object).to.be.an("object"); + expect(result.object.name).to.be.a("string"); + expect(result.object.age).to.be.a("number"); + expect(result.object.age).to.be.at.least(0); + expect(result.object.age).to.be.at.most(150); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should validate generated object against Zod schema", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const strictSchema = z.object({ + color: z.enum(["red", "green", "blue"]).describe("One of: red, green, blue"), + count: z.number().int().min(1).max(10).describe("An integer from 1 to 10"), + }); + + const result = await generate({ + prompt: "Generate an object with color 'blue' and count 5", + schema: strictSchema, + schemaName: "ColorCount", + }); + + expect(result.object.color).to.be.oneOf(["red", "green", "blue"]); + expect(result.object.count).to.be.a("number"); + expect(result.object.count).to.be.at.least(1); + expect(result.object.count).to.be.at.most(10); + expect(Number.isInteger(result.object.count)).to.be.true; + }); + + it("should validate generated object against JSON schema", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const strictJsonSchema = { + type: "object", + properties: { + color: { type: "string", enum: ["red", "green", "blue"], description: "One of: red, green, blue" }, + count: { type: "integer", minimum: 1, maximum: 10, description: "An integer from 1 to 10" }, + }, + required: ["color", "count"], + additionalProperties: false, + }; + + const result = await generate({ + prompt: "Generate an object with color 'green' and count 7", + schema: strictJsonSchema, + schemaName: "ColorCount", + }); + + expect(result.object.color).to.be.oneOf(["red", "green", "blue"]); + expect(result.object.count).to.be.a("number"); + expect(result.object.count).to.be.at.least(1); + expect(result.object.count).to.be.at.most(10); + expect(Number.isInteger(result.object.count)).to.be.true; + }); + }); + + describe("multimodal input with files", function () { + // 100x100 grid PNG with red, blue, and green squares + const GRID_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABvUlEQVR4nO3YUW7DQAwD0b3/pZ0jhEjW2rE5LfT3ANGlE0Bda63LQc26kh/dmMMHbHP4gG0OH7DN4QO2OXzANocP2ObwAdscPmCbyy7Ia/McuICfMllzdxSy+c16i7MQmLMQmLMQmLMQmLMQmLMQmLMQmLMQmPNSh42fEJizEJizEJizEJizEJizEJizEJizEJizEJg7fpk6v1zqujGHD9jm8AHbHD5gm8MHbHP4gG0OH7DN4QO2OXzANnf8Mv0yu/9rc/p5Hn+p7y/kzHO85ivLQqYWh85CphaHzkKmFofOQqYWh85CphaHzkKmFofOQqYWh66wEPbsLwQ+9Dem8BNyaHHoLGRqcegsZGpx6CxkanHoLGRqcegsZGpx6CxkanHoLGRqcegKC3FQg39j2hw+YJvDB2xz+IBtDh+wzeEDtjl8wDaHD9jm8AHb3PHLlDm7f73U/3Q3FBLmg/9hLOTPB3mLsxCYsxCYsxCYsxCYsxCYsxCYO1mI46XOd35lwZyFwJyFwJyFwJyFwJyFwJyFwJyFwNzJQhzUwN/UPocP2ObwAdscPmCbwwdsc/iAbQ4fsM3hA7Y5fMAq9wGhbdAbu3rjOQAAAABJRU5ErkJggg=="; + + it("should handle image URL input", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + // Note: Some Ollama models may have issues with remote URLs. + // This test validates the multimodal input construction. + try { + const result = await generate({ + prompt: "What colors do you see in this image? Be brief.", + files: [ + { + type: "image", + data: "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + } catch (error) { + // Some Ollama models may not support remote URLs well + // Skip if we get a Bad Request error related to image handling + if (error.message && error.message.includes("Bad Request")) { + this.skip(); + } + throw error; + } + }); + + it("should handle base64 image data", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + try { + const result = await generate({ + prompt: "Describe what you see in this image. Be brief.", + files: [ + { + type: "image", + data: GRID_PNG_BASE64, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + + it("should handle Buffer image data", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + // Convert base64 to Buffer + const imageBuffer = Buffer.from(GRID_PNG_BASE64, "base64"); + + try { + const result = await generate({ + prompt: "Describe what you see in this image. Be brief.", + files: [ + { + type: "image", + data: imageBuffer, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + + it("should handle Uint8Array image data", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + // Convert base64 to Uint8Array + const buffer = Buffer.from(GRID_PNG_BASE64, "base64"); + const uint8Array = new Uint8Array(buffer); + + try { + const result = await generate({ + prompt: "Describe what you see in this image. Be brief.", + files: [ + { + type: "image", + data: uint8Array, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + + it("should handle multiple images with mixed data types", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const imageBuffer = Buffer.from(GRID_PNG_BASE64, "base64"); + + try { + const result = await generate({ + prompt: "Describe what you see in these images. Be brief.", + files: [ + { + type: "image", + data: GRID_PNG_BASE64, + mimeType: "image/png", + }, + { + type: "image", + data: imageBuffer, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + }); + + describe("messages array support", function () { + it("should handle multi-turn conversation", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const result = await generate({ + messages: [ + { role: "user", content: "There were red, blue, and green balls." }, + { role: "assistant", content: "Okay, three balls of different colors." }, + { role: "user", content: "Which colors were the balls?" }, + ], + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.toLowerCase()).to.include("red"); + expect(result.text.toLowerCase()).to.include("blue"); + expect(result.text.toLowerCase()).to.include("green"); + }); + }); + + describe("error handling", function () { + it("should throw error with invalid API key", async function () { + try { + await generate({ + prompt: "Hello", + apiKey: "invalid-api-key", + }); + expect.fail("Should have thrown an error"); + } catch (error) { + // Should get an authentication error + expect(error).to.be.an("error"); + } + }); + }); + }); +}); diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js new file mode 100644 index 0000000..5a6eed0 --- /dev/null +++ b/common/test/refineStep.test.js @@ -0,0 +1,394 @@ +// Import the refineStep module +const { + refineStep, + buildRefinementPrompt, + truncateContent, + REFINE_STEP_SYSTEM_PROMPT, + DEFAULT_MAX_CONTEXT_LENGTH, +} = require("../src/refineStep"); +const { ensureOllamaRunning, isOllamaAvailable, MODEL_PULL_TIMEOUT_MS } = require("../src/ollama"); + +// Import chai using dynamic import (needed for ESM) +let expect; + +describe("RefineStep Module", function () { + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + + before(async function () { + // Dynamic import for chai ESM + const chai = await import("chai"); + expect = chai.expect; + + console.log(" Setting up Ollama for tests..."); + const isOllamaRunning = await ensureOllamaRunning(); + if (!isOllamaRunning) { + console.warn("Warning: Ollama is not available. Some tests may be skipped."); + } + }); + + describe("truncateContent", function () { + it("should return content unchanged if within limit", function () { + const content = "Short content"; + const result = truncateContent(content, 100); + expect(result).to.equal(content); + }); + + it("should truncate content exceeding limit", function () { + const content = "x".repeat(200); + const result = truncateContent(content, 100); + expect(result).to.include("[Content truncated...]"); + expect(result.length).to.be.lessThan(200); + }); + + it("should handle null or undefined content", function () { + expect(truncateContent(null, 100)).to.be.null; + expect(truncateContent(undefined, 100)).to.be.undefined; + }); + + it("should handle empty string", function () { + expect(truncateContent("", 100)).to.equal(""); + }); + }); + + describe("buildRefinementPrompt", function () { + it("should include step in prompt", function () { + const step = { find: { selector: ".test-button" } }; + const prompt = buildRefinementPrompt({ step }); + + expect(prompt).to.include("Step to Refine"); + expect(prompt).to.include(".test-button"); + }); + + it("should include failure message when provided", function () { + const step = { find: { selector: ".missing" } }; + const prompt = buildRefinementPrompt({ + step, + failureMessage: "Element not found: .missing", + }); + + expect(prompt).to.include("Failure Message"); + expect(prompt).to.include("Element not found: .missing"); + }); + + it("should include source content when provided", function () { + const step = { goTo: { url: "https://example.com" } }; + const prompt = buildRefinementPrompt({ + step, + sourceContent: "# Documentation\n\nVisit the homepage.", + }); + + expect(prompt).to.include("Source Documentation"); + expect(prompt).to.include("Visit the homepage"); + }); + + it("should include previous steps when provided", function () { + const step = { click: { selector: ".next" } }; + const previousSteps = [ + { goTo: { url: "https://example.com" } }, + { find: { selector: ".login-form" } }, + ]; + const prompt = buildRefinementPrompt({ + step, + previousSteps, + }); + + expect(prompt).to.include("Previously Executed Steps"); + expect(prompt).to.include("https://example.com"); + expect(prompt).to.include(".login-form"); + }); + + it("should include DOM context when provided", function () { + const step = { find: { selector: ".button" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + dom: "", + }, + }); + + expect(prompt).to.include("Browser DOM"); + expect(prompt).to.include("submit-btn"); + }); + + it("should include element context when provided", function () { + const step = { click: { selector: ".btn" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + element: { tagName: "button", className: "primary-btn", text: "Click me" }, + }, + }); + + expect(prompt).to.include("Target Element"); + expect(prompt).to.include("primary-btn"); + }); + + it("should include CLI output context when provided", function () { + const step = { runShell: { command: "npm test" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + cliOutput: "Error: Test failed with exit code 1", + }, + }); + + expect(prompt).to.include("CLI Output"); + expect(prompt).to.include("exit code 1"); + }); + + it("should include HTTP response context when provided", function () { + const step = { httpRequest: { url: "https://api.example.com/users" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + httpResponse: { status: 404, body: { error: "Not found" } }, + }, + }); + + expect(prompt).to.include("HTTP Response"); + expect(prompt).to.include("404"); + expect(prompt).to.include("Not found"); + }); + + it("should include accessibility tree context when provided", function () { + const step = { find: { selector: "[role='button']" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + accessibility: "button 'Submit Form' focused", + }, + }); + + expect(prompt).to.include("Accessibility Tree"); + expect(prompt).to.include("Submit Form"); + }); + + it("should truncate large context sections", function () { + const step = { find: { selector: ".test" } }; + const largeDom = "
" + "x".repeat(100000) + "
"; + const prompt = buildRefinementPrompt({ + step, + context: { dom: largeDom }, + maxContextLength: 1000, + }); + + expect(prompt).to.include("[Content truncated...]"); + expect(prompt.length).to.be.lessThan(largeDom.length); + }); + }); + + describe("REFINE_STEP_SYSTEM_PROMPT", function () { + it("should contain step refinement context", function () { + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("step refinement expert"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("failure messages"); + }); + + it("should list available action types", function () { + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("goTo"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("find"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("click"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("httpRequest"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("runShell"); + }); + }); + + describe("DEFAULT_MAX_CONTEXT_LENGTH", function () { + it("should be 50000", function () { + expect(DEFAULT_MAX_CONTEXT_LENGTH).to.equal(50000); + }); + }); + + describe("refineStep", function () { + describe("input validation", function () { + it("should throw error when step is not provided", async function () { + try { + await refineStep({}); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'step' is required and must be an object."); + } + }); + + it("should throw error when step is not an object", async function () { + try { + await refineStep({ step: "not an object" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'step' is required and must be an object."); + } + }); + + it("should throw error when step is null", async function () { + try { + await refineStep({ step: null }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'step' is required and must be an object."); + } + }); + }); + + describe("step refinement", function () { + it("should refine a step with failure context", async function () { + // Skip if no API key is set + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const originalStep = { + stepId: "step-123", + find: { selector: ".old-button-class" }, + }; + + const refinedStep = await refineStep({ + step: originalStep, + failureMessage: "Element not found: .old-button-class", + context: { + dom: ` + + `, + }, + }); + + expect(refinedStep).to.be.an("object"); + expect(refinedStep.stepId).to.equal("step-123"); // Preserved + // Should have a find action with updated selector + expect(refinedStep.find || refinedStep.click).to.exist; + }); + + it("should preserve stepId from original step", async function () { + // Skip if no API key is set + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const originalStep = { + stepId: "preserved-step-id", + goTo: { url: "https://example.com" }, + }; + + const refinedStep = await refineStep({ + step: originalStep, + sourceContent: "Navigate to the example website.", + }); + + expect(refinedStep.stepId).to.equal("preserved-step-id"); + }); + + it("should preserve sourceLocation from original step", async function () { + // Skip if no API key is set + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const originalStep = { + stepId: "step-456", + sourceLocation: { + file: "/docs/test.md", + startLine: 10, + endLine: 12, + startColumn: 1, + endColumn: 50, + startOffset: 100, + endOffset: 150, + originalText: "", + isInline: true, + isAutoDetected: false, + }, + goTo: { url: "https://example.com" }, + }; + + const refinedStep = await refineStep({ + step: originalStep, + }); + + expect(refinedStep.sourceLocation).to.deep.equal(originalStep.sourceLocation); + }); + + it("should use model from config when provided", async function () { + // Skip if no API key is set + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const refinedStep = await refineStep({ + step: { checkLink: { url: "https://example.com" } }, + config: { + ai: { + model: "anthropic/claude-haiku-4.5", + }, + }, + }); + + expect(refinedStep).to.be.an("object"); + }); + + it("should override config model with explicit model parameter", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const refinedStep = await refineStep({ + step: { wait: { duration: 1000 } }, + config: { + ai: { + model: "anthropic/claude-opus-4.5", + }, + }, + model: "anthropic/claude-haiku-4.5", + }); + + expect(refinedStep).to.be.an("object"); + }); + + it("should handle previous steps context", async function () { + // Skip if no API key is set + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const previousSteps = [ + { goTo: { url: "https://example.com" } }, + { find: { selector: ".login-form" } }, + ]; + + const refinedStep = await refineStep({ + step: { click: { selector: ".submit" } }, + previousSteps, + failureMessage: "Cannot click element: page not fully loaded", + context: { + dom: "", + }, + }); + + expect(refinedStep).to.be.an("object"); + // Should suggest a more specific selector or add a wait + expect(refinedStep.click || refinedStep.find || refinedStep.wait).to.exist; + }); + }); + + describe("step validation", function () { + it("should produce steps that pass schema validation", async function () { + // Skip if no API key is set + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const { validate } = require("../src/validate"); + + const refinedStep = await refineStep({ + step: { find: { selector: ".test" } }, + failureMessage: "Element .test not found", + context: { + dom: "
Content
", + }, + }); + + const validation = validate({schemaKey: "step_v3", object: refinedStep}); + expect(validation.valid).to.be.true; + }); + }); + }); + }); diff --git a/core/package-lock.json b/core/package-lock.json index c71e9d8..f2188ec 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,33 +1,33 @@ { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.13", + "@puppeteer/browsers": "^2.11.0", "ajv": "^8.17.1", - "appium": "^3.1.1", - "appium-chromium-driver": "^2.0.3", + "appium": "^3.1.2", + "appium-chromium-driver": "^2.0.4", "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.1", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", - "posthog-node": "^5.15.0", + "posthog-node": "^5.17.2", "tree-kill": "^1.2.2", "webdriverio": "^9.21.0" }, @@ -72,6 +72,84 @@ "@img/sharp-win32-x64": "^0.34.5" } }, + "node_modules/@ai-sdk/anthropic": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.54.tgz", + "integrity": "sha512-6OSFMkt5NkAchH7o0W+dI2h6yR8EPXx7Yl6txyh0gadLlkf1UU/ScyoYlkxAW8UtGju/+apvwVTdLYEQuIsVVQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.80", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", + "integrity": "sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -88,30 +166,30 @@ } }, "node_modules/@appium/base-driver": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", - "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.2.tgz", + "integrity": "sha512-AxCYznylRw4xpOx30dAIQ8m5GsVM9ob/MPwc/KyiKhtofLNxQQlFLvLs7SeX7s8iwvwr0puMasOqlWrWy3gVbA==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", + "@appium/support": "^7.0.4", + "@appium/types": "^1.1.2", "@colors/colors": "1.6.0", "async-lock": "1.4.1", "asyncbox": "3.0.0", "axios": "1.13.2", "bluebird": "3.7.2", - "body-parser": "2.2.0", - "express": "5.1.0", + "body-parser": "2.2.1", + "express": "5.2.1", "fastest-levenshtein": "1.0.16", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "11.2.2", + "lru-cache": "11.2.4", "method-override": "3.0.0", "morgan": "1.10.1", "path-to-regexp": "8.3.0", "serve-favicon": "2.5.1", "source-map-support": "0.5.21", - "type-fest": "5.2.0" + "type-fest": "5.3.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -121,56 +199,14 @@ "spdy": "4.0.2" } }, - "node_modules/@appium/base-driver/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/@appium/base-plugin": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", - "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.5.tgz", + "integrity": "sha512-w27EqXQ3zY7xKp61IizbzhZGlxQvFr8uKxeELP5TU/+YxnjU8MyVYmWCG7RXp0dh9n7mZen/WPjZtvqdiBOsMQ==", "license": "Apache-2.0", "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/support": "^7.0.3" + "@appium/base-driver": "^10.1.2", + "@appium/support": "^7.0.4" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -178,12 +214,12 @@ } }, "node_modules/@appium/docutils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", - "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.2.0.tgz", + "integrity": "sha512-bwZIShYLRnWCRdGEgjBX+POXyI0X8fbZ3FNHWDlNzYjCBodYckiMw8X48WDwMRd0AeP5mzjBbHSpH7DKfebuFg==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^7.0.3", + "@appium/support": "^7.0.4", "chalk": "4.1.2", "consola": "3.4.2", "diff": "8.0.2", @@ -192,9 +228,9 @@ "pkg-dir": "5.0.0", "read-pkg": "5.2.0", "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "yaml": "2.8.1", + "teen_process": "3.0.4", + "type-fest": "5.3.0", + "yaml": "2.8.2", "yargs": "18.0.0", "yargs-parser": "22.0.0" }, @@ -290,14 +326,14 @@ } }, "node_modules/@appium/logger": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", - "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.3.tgz", + "integrity": "sha512-x1ROyUZP73RwdfgeYUgYkAAVbjf4QQENAACTjPxzIj7qA4/EyhXvv/Py8b6SPxphW7m9ialQjpS0FwgQ3nZUfw==", "license": "ISC", "dependencies": { "console-control-strings": "1.1.0", "lodash": "4.17.21", - "lru-cache": "11.2.2", + "lru-cache": "11.2.4", "set-blocking": "2.0.0" }, "engines": { @@ -320,14 +356,14 @@ } }, "node_modules/@appium/support": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", - "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.4.tgz", + "integrity": "sha512-xIK7cFzouZJLIG6RMmg50M+EsILSeO9e9sSkR4xNSaJajaop7LtpkbMfO5JpTgdNiIUYyIsr/3TusQhxnpPNvw==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/tsconfig": "^1.1.0", - "@appium/types": "^1.1.1", + "@appium/logger": "^2.0.3", + "@appium/tsconfig": "^1.1.1", + "@appium/types": "^1.1.2", "@colors/colors": "1.6.0", "archiver": "7.0.1", "axios": "1.13.2", @@ -335,9 +371,9 @@ "bluebird": "3.7.2", "bplist-creator": "0.1.1", "bplist-parser": "0.3.2", - "form-data": "4.0.4", + "form-data": "4.0.5", "get-stream": "6.0.1", - "glob": "11.0.3", + "glob": "13.0.0", "jsftp": "2.1.3", "klaw": "4.1.0", "lockfile": "1.0.4", @@ -355,10 +391,10 @@ "shell-quote": "1.8.3", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "3.0.2", - "type-fest": "5.2.0", + "teen_process": "3.0.4", + "type-fest": "5.3.0", "uuid": "13.0.0", - "which": "5.0.0", + "which": "6.0.0", "yauzl": "3.2.0" }, "engines": { @@ -370,12 +406,12 @@ } }, "node_modules/@appium/tsconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", - "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.1.tgz", + "integrity": "sha512-ikjo037sWgY2Oy0HRPGnrKHnOdUh9JyzstD7E6HlFqcZu8hvOP1hDQmKdoBTz8gkmSbZWcMRZmWaL3Yqaz2pLw==", "license": "Apache-2.0", "dependencies": { - "@tsconfig/node20": "20.1.6" + "@tsconfig/node20": "20.1.8" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -383,15 +419,15 @@ } }, "node_modules/@appium/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", - "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.2.tgz", + "integrity": "sha512-BDyX99GCXWqsfeDxsqsvb6EIfQD7SLTXcCbmcI1PKDTK2wg9znKOtE0YLzXgI6TFQV3+40Xs6za6La/Mv8/rVQ==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^2.0.2", + "@appium/logger": "^2.0.3", "@appium/schema": "^1.0.0", - "@appium/tsconfig": "^1.1.0", - "type-fest": "5.2.0" + "@appium/tsconfig": "^1.1.1", + "type-fest": "5.3.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -1274,6 +1310,15 @@ "jsep": "^0.4.0||^1.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1285,9 +1330,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", - "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", + "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -1313,9 +1358,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", - "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", + "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -1334,9 +1379,9 @@ } }, "node_modules/@sidvind/better-ajv-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", - "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.1.tgz", + "integrity": "sha512-6arF1ssKxItxgitPYXafUoLmsVBA6K7m9+ZGj6hLDoBl7nWpJ33EInwQUdHTle2METeWGxgQiqSex20KZRykew==", "license": "Apache-2.0", "dependencies": { "kleur": "^4.1.0" @@ -1358,6 +1403,12 @@ "text-hex": "1.0.x" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -1365,9 +1416,9 @@ "license": "MIT" }, "node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", + "version": "20.1.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.8.tgz", + "integrity": "sha512-Em+IdPfByIzWRRpqWL4Z7ArLHZGxmc36BxE3jCz9nBFSm+5aLaPMZyjwu4yetvyKXeogWcxik4L1jB5JTWfw7A==", "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1443,6 +1494,15 @@ "@types/node": "*" } }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/@vue/compiler-core": { "version": "3.5.25", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", @@ -1760,6 +1820,24 @@ "node": ">= 14" } }, + "node_modules/ai": { + "version": "5.0.109", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", + "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -1842,20 +1920,20 @@ } }, "node_modules/appium": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", - "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.2.tgz", + "integrity": "sha512-MIifVZdSLdFBRY084PaaQyU8ilG+fgGoVdzGkRLj9Q8hZ2x/ENwjiOveyWLxcjsWMYYwUtm3TTKRvWGrJvX3Iw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/base-plugin": "^3.0.4", - "@appium/docutils": "^2.1.2", - "@appium/logger": "^2.0.2", + "@appium/base-driver": "^10.1.2", + "@appium/base-plugin": "^3.0.5", + "@appium/docutils": "^2.2.0", + "@appium/logger": "^2.0.3", "@appium/schema": "^1.0.0", - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@sidvind/better-ajv-errors": "4.0.0", + "@appium/support": "^7.0.4", + "@appium/types": "^1.1.2", + "@sidvind/better-ajv-errors": "4.0.1", "ajv": "8.17.1", "ajv-formats": "3.0.1", "argparse": "2.0.1", @@ -1865,18 +1943,18 @@ "bluebird": "3.7.2", "lilconfig": "3.1.3", "lodash": "4.17.21", - "lru-cache": "11.2.2", + "lru-cache": "11.2.4", "ora": "5.4.1", "package-changed": "3.0.0", "resolve-from": "5.0.0", "semver": "7.7.3", "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", + "teen_process": "3.0.4", + "type-fest": "5.3.0", "winston": "3.18.3", "wrap-ansi": "7.0.0", "ws": "8.18.3", - "yaml": "2.8.1" + "yaml": "2.8.2" }, "bin": { "appium": "index.js" @@ -1887,9 +1965,9 @@ } }, "node_modules/appium-chromium-driver": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-2.0.3.tgz", - "integrity": "sha512-qT3ldg0EFW9yuU0E/11ME4e7BIx5A17Ti+zvv1JR9soflJd5ruCY+j+6IP18RCKwYgBk152ey85cD6JvotL0Jw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-2.0.4.tgz", + "integrity": "sha512-L3UO1bzD/rOOkaN5pyxpbJjwvhjlkW2xn5atIKECtw49tNEBXvI9xGdBx4mzrFaQi0bqQmk55ivEQnqYvwMSiw==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { @@ -2778,9 +2856,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/appium-adb": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.3.tgz", - "integrity": "sha512-fJIEikjVoKsj9PfM2iPBn4kEMHy78ZY6PBC4pTiSv0rlAgxnScQW9OLm2l4wEaE8ODwnY2zJZDHehEGZ2b79fg==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.5.tgz", + "integrity": "sha512-plS0gR2YSdwZMVt86P76MtUUFc4k5MHFCm67BknzApWXpQ+9Dn4I70G2XmRnpoaGevfM/uj8phze1TAKYbyATQ==", "license": "Apache-2.0", "dependencies": { "@appium/support": "^7.0.0-rc.1", @@ -2800,9 +2878,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/appium-chromedriver": { - "version": "8.0.21", - "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.21.tgz", - "integrity": "sha512-l5SUc+VAykdFvwWwA7C6Kg4SdH45d1N/lyGvj/60b8W3Fv/HhfLDM0b1yhjH+leO7bBjS80iQI+z+P+1Fk5ydw==", + "version": "8.0.24", + "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.24.tgz", + "integrity": "sha512-OL2OoICSwBzv7k08MnVEemRGTCL+cHxyOkPWxg4gWQ4nv76+U/rKGtU9b7MP0j1rC7rdpZGjGuyDcsD3U7BZqg==", "license": "Apache-2.0", "dependencies": { "@appium/base-driver": "^10.0.0-rc.2", @@ -2870,9 +2948,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -3063,12 +3141,6 @@ "node": ">= 0.8" } }, - "node_modules/appium-chromium-driver/node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -3504,15 +3576,16 @@ "license": "ISC" }, "node_modules/appium-chromium-driver/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/content-type": { @@ -3932,9 +4005,9 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -3945,7 +4018,11 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/find-up": { @@ -4343,13 +4420,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4368,28 +4438,23 @@ "optional": true }, "node_modules/appium-chromium-driver/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/http-status-codes": { @@ -4658,12 +4723,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4844,15 +4903,19 @@ } }, "node_modules/appium-chromium-driver/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/mimic-fn": { @@ -5349,15 +5412,15 @@ } }, "node_modules/appium-chromium-driver/node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.10" @@ -5543,23 +5606,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/safe-stable-stringify": { @@ -5653,6 +5702,26 @@ "node": ">= 0.6" } }, + "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", @@ -5992,6 +6061,26 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/appium-chromium-driver/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -16985,23 +17074,43 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.0", + "debug": "^4.4.3", "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/boolbase": { @@ -17949,48 +18058,37 @@ } }, "node_modules/doc-detective-common": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", - "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", + "version": "3.7.0-preview.0", + "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.7.0-preview.0.tgz", + "integrity": "sha512-13HnawzR0J5fIoUp5irvmooiU5LCLpOCiF8wf3UkpyqQIWlQ1gZhNH08YD6zGfgc3ddUmN+r965flucDbIGkaQ==", "license": "AGPL-3.0-only", "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "yaml": "^2.8.2" - } - }, - "node_modules/doc-detective-common/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "yaml": "^2.8.2", + "zod": "^4.1.13" } }, "node_modules/doc-detective-resolver": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.1.tgz", - "integrity": "sha512-8loBGZctT4JWo5PgjYk9b4ZRyJy/Od33KKd5Q+Sa/XEiaQ0e6602e9oI/JDfmnaB1KGUi9qTigezRLIMQlH+Dw==", + "version": "3.7.0-preview.0", + "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.7.0-preview.0.tgz", + "integrity": "sha512-sL9KCJc2JX2RJjBl0inicCF4l9bNMCxWW8fa/xQXWdKQKI3zCADf8DKYjxMn2lr8LOSLSmSbJ1FFl/+krGEXbw==", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "doc-detective-common": "^3.7.0-preview.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "posthog-node": "^5.17.2" } }, "node_modules/dom-serializer": { @@ -18146,21 +18244,6 @@ "node": ">=20.0.0" } }, - "node_modules/edgedriver/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -18399,6 +18482,15 @@ "bare-events": "^2.7.0" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -18416,7 +18508,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -18456,48 +18547,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -18737,9 +18786,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -18953,21 +19002,15 @@ } }, "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { "node": "20 || >=22" }, @@ -19569,21 +19612,6 @@ "node": ">=16" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jq-web": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/jq-web/-/jq-web-0.6.2.tgz", @@ -20033,10 +20061,10 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -21035,12 +21063,12 @@ } }, "node_modules/posthog-node": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", - "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", + "version": "5.17.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", + "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", "license": "MIT", "dependencies": { - "@posthog/core": "1.7.0" + "@posthog/core": "1.7.1" }, "engines": { "node": ">=20" @@ -22226,9 +22254,9 @@ } }, "node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.4.tgz", + "integrity": "sha512-NQA/5PdJWEAxuYoBRW7RajnAyWmfh5iGMY1kEXiAzobtv0ztERcfDnfszpUTuvhFXrvh3E4GvHt9yWbS/EndzQ==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -22318,9 +22346,9 @@ "license": "0BSD" }, "node_modules/type-fest": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", - "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.0.tgz", + "integrity": "sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -22610,9 +22638,9 @@ } }, "node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -22621,7 +22649,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/winston": { @@ -22858,15 +22886,18 @@ } }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -23032,6 +23063,15 @@ "engines": { "node": ">= 14" } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/core/package.json b/core/package.json index d1d0c53..0dab27f 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "description": "The doc testing framework.", "main": "src/index.js", "scripts": { @@ -29,22 +29,22 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.13", + "@puppeteer/browsers": "^2.11.0", "ajv": "^8.17.1", - "appium": "^3.1.1", - "appium-chromium-driver": "^2.0.3", + "appium": "^3.1.2", + "appium-chromium-driver": "^2.0.4", "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.1", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", - "posthog-node": "^5.15.0", + "posthog-node": "^5.17.2", "tree-kill": "^1.2.2", "webdriverio": "^9.21.0" }, diff --git a/core/src/tests.js b/core/src/tests.js index 5787966..795109a 100644 --- a/core/src/tests.js +++ b/core/src/tests.js @@ -367,9 +367,15 @@ async function runSpecs({ resolvedTests }) { const config = resolvedTests.config; const specs = resolvedTests.specs; + // Ensure config.environment is set for getAvailableApps + // This is needed when resolvedTests comes from an external source (e.g., API) + if (!config.environment) { + config.environment = getEnvironment(); + } + // Get runner details const runnerDetails = { - environment: getEnvironment(), + environment: config.environment, availableApps: await getAvailableApps({ config }), allowUnsafeSteps: await allowUnsafeSteps({ config }), }; diff --git a/core/test/temp-dom-timeout-test.json b/core/test/temp-dom-timeout-test.json new file mode 100644 index 0000000..6e2f7e2 --- /dev/null +++ b/core/test/temp-dom-timeout-test.json @@ -0,0 +1,17 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": { + "url": "http://localhost:8092/waitUntil-test-dom-mutations-forever.html", + "timeout": 5000, + "waitUntil": { + "domIdleTime": 500 + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-screenshot-regression-test.json b/core/test/temp-screenshot-regression-test.json new file mode 100644 index 0000000..ea61e5d --- /dev/null +++ b/core/test/temp-screenshot-regression-test.json @@ -0,0 +1,18 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": "http://localhost:8092/drag-drop-test.html" + }, + { + "screenshot": { + "path": "C:\\Users\\hawkeyexl\\Documents\\Workspaces\\.github\\core\\test\\temp-regression-screenshot.png", + "maxVariation": 0.05, + "overwrite": "aboveVariation" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/resolver/dev/index.js b/resolver/dev/index.js index 904d685..f777756 100644 --- a/resolver/dev/index.js +++ b/resolver/dev/index.js @@ -1,6 +1,7 @@ const { detectTests, resolveTests, detectAndResolveTests } = require("../src"); const { validate, schemas } = require("doc-detective-common"); const { execCommand, spawnCommand } = require("../src/utils"); +const { analyze } = require("../src/analyze"); const path = require("path"); main(); @@ -19,9 +20,21 @@ async function main() { platforms: ["linux", "mac", "windows"], browsers: ["chrome", "firefox"], }, - ] + ], + integrations: { + anthropic: { + apiKey: process.env.ANTHROPIC_API_KEY, + } + } }; - result = await detectTests({ config: json }); + const content = `To search for American Shorthair kittens, + +1. Go to [DuckDuckGo](https://www.duckduckgo.com). +2. In the search bar, enter "American Shorthair kittens", then press Enter. + +!["Search results for kittens"](search-results.png){ .screenshot }`; + + const result = await analyze({ content, config: json }); console.log(JSON.stringify(result, null, 2)); // Output the result to a file const outputPath = path.join(__dirname, "output.json"); diff --git a/resolver/local-llm/llama.cpp b/resolver/local-llm/llama.cpp deleted file mode 160000 index 392e09a..0000000 --- a/resolver/local-llm/llama.cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 392e09a60852d0e879d4bbedd5ace3e6852f719e diff --git a/resolver/package-lock.json b/resolver/package-lock.json index 5cf2118..c3d3e4c 100644 --- a/resolver/package-lock.json +++ b/resolver/package-lock.json @@ -1,21 +1,30 @@ { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", + "asciidoctor": "^3.0.4", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "cheerio": "^1.0.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", + "fast-xml-parser": "^4.5.1", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "posthog-node": "^5.17.2", + "remark-mdx": "^3.1.0", + "remark-parse": "^11.0.0", + "tree-sitter-rst": "^0.2.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "web-tree-sitter": "^0.24.7" }, "devDependencies": { "body-parser": "^2.2.1", @@ -28,6 +37,31 @@ "yaml": "^2.8.2" } }, + "../common": { + "name": "doc-detective-common", + "version": "3.7.0-preview.0", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/google": "^3.0.0-beta.72", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "ollama-ai-provider-v2": "^1.2.0", + "yaml": "^2.8.2", + "zod": "^4.1.13" + }, + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -43,6 +77,202 @@ "@types/json-schema": "^7.0.15" } }, + "node_modules/@asciidoctor/cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@asciidoctor/cli/-/cli-4.0.0.tgz", + "integrity": "sha512-x2T9gW42921Zd90juEagtbViPZHNP2MWf0+6rJEkOzW7E9m3TGJtz+Guye9J0gwrpZsTMGCpfYMQy1We3X7osg==", + "license": "MIT", + "dependencies": { + "yargs": "17.3.1" + }, + "bin": { + "asciidoctor": "bin/asciidoctor", + "asciidoctorjs": "bin/asciidoctor" + }, + "engines": { + "node": ">=16", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@asciidoctor/core": ">=2 <4" + } + }, + "node_modules/@asciidoctor/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@asciidoctor/cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@asciidoctor/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@asciidoctor/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@asciidoctor/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@asciidoctor/cli/node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@asciidoctor/core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-3.0.4.tgz", + "integrity": "sha512-41SDMi7iRRBViPe0L6VWFTe55bv6HEOJeRqMj5+E5wB1YPdUPuTucL4UAESPZM6OWmn4t/5qM5LusXomFUVwVQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@asciidoctor/opal-runtime": "3.0.1", + "unxhr": "1.2.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, + "node_modules/@asciidoctor/opal-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@asciidoctor/opal-runtime/-/opal-runtime-3.0.1.tgz", + "integrity": "sha512-iW7ACahOG0zZft4A/4CqDcc7JX+fWRNjV5tFAVkNCzwZD+EnFolPaUOPYt8jzadc0+Bgd80cQTtRMQnaaV1kkg==", + "license": "MIT", + "dependencies": { + "glob": "8.1.0", + "unxhr": "1.2.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@asciidoctor/opal-runtime/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@asciidoctor/opal-runtime/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -124,9 +354,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", - "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", + "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -174,12 +404,72 @@ "node": ">=4" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "peer": true }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -217,6 +507,28 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -233,44 +545,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -287,7 +561,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -298,11 +571,90 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/asciidoctor": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/asciidoctor/-/asciidoctor-3.0.4.tgz", + "integrity": "sha512-hIc0Bx73wePxtic+vWBHOIgMfKSNiCmRz7BBfkyykXATrw20YGd5a3CozCHvqEPH+Wxp5qKD4aBsgtokez8nEA==", + "license": "MIT", + "dependencies": { + "@asciidoctor/cli": "4.0.0", + "@asciidoctor/core": "3.0.4", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "nunjucks": "^3.2.1", + "pug": "^3.0.0" + }, + "bin": { + "asciidoctor": "bin/asciidoctor", + "asciidoctorjs": "bin/asciidoctor" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, + "node_modules/asciidoctor/node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -320,17 +672,51 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "dev": true, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -351,16 +737,34 @@ "url": "https://opencollective.com/express" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -394,7 +798,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -425,6 +828,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", @@ -463,6 +876,97 @@ "node": ">=8" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "license": "MIT", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -552,7 +1056,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -563,8 +1066,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -578,6 +1080,25 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -654,11 +1175,38 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -672,6 +1220,19 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -691,6 +1252,28 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -702,18 +1285,68 @@ } }, "node_modules/doc-detective-common": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", - "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", - "license": "AGPL-3.0-only", + "resolved": "../common", + "link": true + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dotenv": { @@ -755,6 +1388,21 @@ "dev": true, "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -771,6 +1419,43 @@ "node": ">= 0.8" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -820,7 +1505,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -845,6 +1529,30 @@ "node": ">=4" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -932,6 +1640,12 @@ "node": ">= 0.6" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -942,6 +1656,45 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -966,6 +1719,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", @@ -1076,6 +1842,26 @@ "node": ">= 0.6" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1088,7 +1874,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -1151,11 +1936,24 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1163,6 +1961,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1219,6 +2038,37 @@ "he": "bin/he" } }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -1257,11 +2107,21 @@ "url": "https://opencollective.com/express" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -1273,11 +2133,47 @@ "node": ">= 0.10" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -1289,15 +2185,77 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", @@ -1318,6 +2276,18 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -1325,6 +2295,24 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -1355,6 +2343,29 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -1372,6 +2383,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } @@ -1446,6 +2458,22 @@ "node": ">=18.0.0" } }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "license": "MIT", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/jstransformer/node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1469,60 +2497,827 @@ "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1560,6 +3355,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -1628,8 +3432,7 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/negotiator": { "version": "1.0.0", @@ -1641,6 +3444,63 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -1671,7 +3531,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -1721,6 +3580,80 @@ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1752,7 +3685,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -1781,56 +3713,201 @@ "node": ">=16" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/posthog-node": { + "version": "5.17.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", + "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", + "license": "MIT", + "dependencies": { + "@posthog/core": "1.7.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/proxyquire": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" + } + }, + "node_modules/pug": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "license": "MIT", + "dependencies": { + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "license": "MIT" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "license": "MIT", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } }, - "node_modules/posthog-node": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", - "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "license": "MIT", "dependencies": { - "@posthog/core": "1.7.0" - }, - "engines": { - "node": ">=20" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "license": "MIT" }, - "node_modules/proxyquire": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", - "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", - "dev": true, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "license": "MIT", "dependencies": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" + "pug-error": "^2.0.0" } }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "license": "MIT" + }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -1882,11 +3959,53 @@ "node": ">= 0.10" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1903,7 +4022,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -1961,7 +4079,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -2203,6 +4320,15 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2278,6 +4404,20 @@ "node": ">=8" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -2327,6 +4467,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2346,7 +4498,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2355,6 +4506,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2365,6 +4529,44 @@ "node": ">=0.6" } }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "license": "MIT" + }, + "node_modules/tree-sitter-rst": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/tree-sitter-rst/-/tree-sitter-rst-0.2.0.tgz", + "integrity": "sha512-PKhicpBQcQsdt93mIDZiEaZjde1kONsgNwSW9ovTTowSUBVCtC2QfnGUJeK66v4++Trt+BQF1ahwUcJRev9e3g==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "funding": { + "url": "https://github.com/sponsors/stsewd" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -2413,6 +4615,115 @@ "node": ">= 0.6" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2423,6 +4734,15 @@ "node": ">= 0.8" } }, + "node_modules/unxhr": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.2.0.tgz", + "integrity": "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw==", + "license": "MIT", + "engines": { + "node": ">=8.11" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2433,6 +4753,104 @@ "node": ">= 0.8" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/web-tree-sitter": { + "version": "0.24.7", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.7.tgz", + "integrity": "sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, "node_modules/workerpool": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", @@ -2444,7 +4862,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2520,7 +4937,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2528,14 +4944,12 @@ "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2549,7 +4963,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2560,14 +4973,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -2576,6 +4987,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -2609,7 +5021,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -2702,6 +5113,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/resolver/package.json b/resolver/package.json index da39660..cf8dc12 100644 --- a/resolver/package.json +++ b/resolver/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "description": "Detect and resolve docs into Doc Detective tests.", "main": "src/index.js", "scripts": { @@ -26,11 +26,20 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", + "asciidoctor": "^3.0.4", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "cheerio": "^1.0.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", + "fast-xml-parser": "^4.5.1", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "posthog-node": "^5.17.2", + "remark-mdx": "^3.1.0", + "remark-parse": "^11.0.0", + "tree-sitter-rst": "^0.2.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "web-tree-sitter": "^0.24.7" }, "devDependencies": { "body-parser": "^2.2.1", diff --git a/resolver/src/analyze.js b/resolver/src/analyze.js new file mode 100644 index 0000000..abc0f10 --- /dev/null +++ b/resolver/src/analyze.js @@ -0,0 +1,492 @@ +const { generate, schemas, validate } = require("doc-detective-common"); +const crypto = require("crypto"); +const { parseDocument, detectFormat } = require("./parsers"); + +const DEFAULT_MAX_CONTENT_LENGTH = 100000; + +/** + * Schema for actionability classification. + * Used to determine if a chunk contains instructions for users to perform testable actions. + */ +const ACTIONABILITY_SCHEMA = { + type: "object", + properties: { + isActionable: { + type: "boolean", + description: + "Whether this content instructs the user to perform testable actions", + }, + reason: { + type: "string", + description: + "Brief explanation of why the content is or is not actionable", + }, + }, + required: ["isActionable", "reason"], +}; + +/** + * System prompt for classifying content actionability. + */ +const ACTIONABILITY_SYSTEM_PROMPT = `You are a documentation analysis expert. Your task is to determine if a piece of documentation content instructs users to perform testable actions. + +Content is ACTIONABLE if it contains instructions for users to: +- Navigate to URLs or web pages +- Click buttons, links, or UI elements +- Type or enter text into forms or fields +- Run shell/terminal commands +- Make HTTP/API requests +- Execute code examples +- Perform specific interactions with a user interface +- Follow step-by-step procedures that can be automated + +Content is NOT ACTIONABLE if it: +- Only provides conceptual explanations or background information +- Contains only reference material without procedures +- Discusses features without showing how to use them +- Contains only code snippets shown for illustration without execution instructions +- Is purely descriptive text about architecture or design + +Be conservative - only mark content as actionable if there are clear, specific actions a user would perform that can be tested automatically.`; + +/** + * System prompt for analyzing documentation and generating test specifications. + */ +const ANALYSIS_SYSTEM_PROMPT = `You are a documentation testing expert. Your task is to analyze documentation content and generate tests that verify the documented behavior is accurate. + +When analyzing documentation: +1. Identify testable assertions - URLs, UI interactions, API calls, shell commands, code examples +2. Generate appropriate test steps for each assertion +3. Maintain the logical order of operations as described in the documentation +4. Use appropriate action types: goTo, find, click, type, checkLink, httpRequest, runShell, runCode, screenshot, wait +5. For UI interactions, prefer element* properties when specific elements are mentioned, using the following priority: elementText, elementAria, elementClass, elementAttributes, selector +6. For links, use checkLink to verify they return acceptable status codes +7. Generate descriptive test and step IDs based on the content + +When a partial test is provided: +1. Use it as a starting point for your generated test +2. Fill in any missing required fields (especially steps if empty or incomplete) +3. Expand incomplete steps with appropriate action details based on the documentation +4. Preserve any existing field values from the partial test unless they conflict with the documentation +5. Let the documentation guide what steps should be generated, but respect the partial test's structure + +Output a valid Doc Detective test containing steps that verify the documentation.`; + +/** + * Builds the analysis prompt from the provided content and context. + * @param {Object} options + * @param {string} options.content - The documentation content to analyze + * @param {string} [options.filePath] - Path to the source file for context + * @param {number} [options.maxContentLength] - Maximum content length before truncation + * @param {Object} [options.test] - Optional partial test to use as starting point + * @returns {string} The formatted prompt + */ +const buildAnalysisPrompt = ({ + content, + filePath, + maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, + test, +}) => { + // Truncate content if it exceeds the maximum length + const truncatedContent = + content.length > maxContentLength + ? content.substring(0, maxContentLength) + + "\n\n[Content truncated due to length...]" + : content; + + let prompt = + "Analyze the following documentation and generate a test specification:\n\n"; + + if (filePath) { + prompt += `Source file: ${filePath}\n\n`; + } + + prompt += `--- Documentation Content ---\n${truncatedContent}\n--- End Content ---\n\n`; + + if (test) { + prompt += `--- Partial Test (use as starting point) ---\n${JSON.stringify(test, null, 2)}\n--- End Partial Test ---\n\n`; + prompt += + "Complete and expand the partial test above based on the documentation. Fill in missing fields, expand incomplete steps, and add any additional steps needed to verify the documented behavior."; + } else { + prompt += + "Generate a Doc Detective specification with tests that verify the documented behavior. Include appropriate steps for each testable assertion found in the documentation."; + } + + return prompt; +}; + +/** + * Generates a unique ID for specs and tests. + * @param {string} [prefix] - Optional prefix for the ID + * @returns {string} A unique ID + */ +const generateId = (prefix = "") => { + const uuid = crypto.randomUUID(); + return prefix ? `${prefix}-${uuid}` : uuid; +}; + +/** + * Post-processes the AI-generated test to preserve fields from the original partial test. + * @param {Object} generatedTest - The test generated by the AI + * @param {Object} [partialTest] - The original partial test provided by the user + * @returns {Object} The merged test with preserved fields from the partial test + */ +const postProcessTest = (generatedTest, partialTest) => { + if (!partialTest) { + return generatedTest; + } + + const result = { ...generatedTest }; + + // Preserve explicitly provided fields from the partial test + if (partialTest.testId && !result.testId) { + result.testId = partialTest.testId; + } + if (partialTest.sourceLocation) { + result.sourceLocation = partialTest.sourceLocation; + } + if (partialTest.description) { + result.description = partialTest.description; + } + if (partialTest.contentPath) { + result.contentPath = partialTest.contentPath; + } + if (partialTest.detectSteps !== undefined) { + result.detectSteps = partialTest.detectSteps; + } + if (partialTest.runOn) { + result.runOn = partialTest.runOn; + } + if (partialTest.openApi) { + result.openApi = partialTest.openApi; + } + if (partialTest.setup) { + result.setup = partialTest.setup; + } + if (partialTest.cleanup) { + result.cleanup = partialTest.cleanup; + } + + return result; +}; + +/** + * Analyzes document content using AI to generate test specifications. + * + * @param {Object} options - Analysis options + * @param {string} options.content - Raw document content to analyze (required) + * @param {string} [options.filePath] - Path to the source file for context + * @param {Object} [options.config] - Doc Detective configuration object + * @param {string} [options.model] - LLM model override (takes precedence over defaults) + * @param {number} [options.maxContentLength] - Maximum content length before truncation (default: 100000) + * @param {Array} [options.files] - Optional images/screenshots to include for multimodal analysis + * @param {Object} [options.test] - Optional partial test to use as starting point for generation + * @returns {Promise} A promise that resolves to a spec_v3 compatible specification + * @throws {Error} If content is not provided or generation fails + * + * @example + * const spec = await analyze({ + * content: "# Getting Started\n\nNavigate to https://example.com...", + * filePath: "docs/getting-started.md", + * config: { integrations: { anthropic: { apiKey: "sk-..." } } } + * }); + * + * @example + * // With a partial test + * const spec = await analyze({ + * content: "# Getting Started\n\nNavigate to https://example.com...", + * test: { testId: "my-test", description: "Verify getting started guide" } + * }); + */ +const analyze = async ({ + content, + filePath, + config = {}, + model, + maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, + files, + test, +}) => { + // Validate required input + if (!content || typeof content !== "string") { + throw new Error("'content' is required and must be a string."); + } + + // Build the prompt + const prompt = buildAnalysisPrompt({ + content, + filePath, + maxContentLength, + test, + }); + + // Get the test schema for structured output + const testSchema = schemas.test_v3; + + // Generate the specification using AI + // Pass config for integrations API keys, generate() will extract the right one + let result; + try { + result = await generate({ + prompt, + system: ANALYSIS_SYSTEM_PROMPT, + schema: testSchema, + schemaName: "test", + schemaDescription: "A Doc Detective test", + config, + files, + }); + } catch (error) { + throw new Error(`Failed to generate test specification: ${error.message}`); + } + + // Validate the spec against the schema + const validation = validate({ schemaKey: "test_v3", object: result.object }); + if (!validation.valid) { + throw new Error( + `Generated test failed validation: ${JSON.stringify(validation.errors)}` + ); + } + + // Post-process to preserve fields from the partial test + const finalTest = postProcessTest(result.object, test); + + return finalTest; +}; + +/** + * Check if a content chunk is actionable (contains testable instructions). + * + * @param {Object} options - Options + * @param {string} options.content - The chunk content to check + * @param {string} [options.heading] - The heading of this chunk for context + * @param {Object} [options.config] - Doc Detective configuration object + * @returns {Promise<{isActionable: boolean, reason: string}>} Actionability result + */ +const checkActionability = async ({ content, heading, config = {} }) => { + const prompt = heading + ? `Analyze the following documentation section titled "${heading}":\n\n${content}` + : `Analyze the following documentation content:\n\n${content}`; + + try { + const result = await generate({ + prompt, + system: ACTIONABILITY_SYSTEM_PROMPT, + schema: ACTIONABILITY_SCHEMA, + schemaName: "actionability", + schemaDescription: "Classification of whether content is actionable", + config, + }); + + return result.object; + } catch (error) { + // On error, assume not actionable to be conservative + return { + isActionable: false, + reason: `Failed to check actionability: ${error.message}`, + }; + } +}; + +/** + * Analyzes a document by breaking it into semantic chunks, identifying actionable content, + * and generating test specifications for each actionable chunk. + * + * @param {Object} options - Analysis options + * @param {string} options.content - Raw document content to analyze (required) + * @param {string} options.filePath - Path to the source file (required for format detection) + * @param {Object} [options.config] - Doc Detective configuration object + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6, default H2) + * @param {number} [options.maxContentLength] - Maximum content length per chunk before truncation + * @param {Array} [options.files] - Optional images/screenshots to include for multimodal analysis + * @returns {Promise} A promise that resolves to a spec_v3 compatible specification + * @throws {Error} If content or filePath is not provided + * + * @example + * const spec = await analyzeDocument({ + * content: fs.readFileSync('docs/guide.md', 'utf8'), + * filePath: 'docs/guide.md', + * config: { integrations: { anthropic: { apiKey: "sk-..." } } } + * }); + */ +const analyzeDocument = async ({ + content, + filePath, + config = {}, + chunkLevel = 2, + maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, + files, +}) => { + // Validate required inputs + if (!content || typeof content !== "string") { + throw new Error("'content' is required and must be a string."); + } + if (!filePath || typeof filePath !== "string") { + throw new Error("'filePath' is required and must be a string."); + } + + // Simple logging helper + const log = (level, message) => { + const logLevel = config.logLevel || "info"; + const levels = ["error", "warning", "info", "debug"]; + const currentLevelIndex = levels.indexOf(logLevel); + const messageLevelIndex = levels.indexOf(level); + if (messageLevelIndex <= currentLevelIndex) { + console.log(`(${level.toUpperCase()}) ${message}`); + } + }; + + // Parse document into semantic chunks + log("info", `Parsing document: ${filePath}`); + const format = detectFormat(filePath); + log("debug", `Detected format: ${format}`); + + const chunks = await parseDocument(content, filePath, { chunkLevel }); + log("info", `Found ${chunks.length} chunk(s) in document`); + + if (chunks.length === 0) { + log("info", "No chunks found in document, returning empty spec"); + const emptySpec = { + specId: generateId("spec"), + description: `Generated from ${filePath}`, + contentPath: filePath, + tests: [], + }; + + const validation = validate({ + schemaKey: "spec_v3", + object: emptySpec, + addDefaults: false, + }); + + // If empty tests array is not valid, we need at least one test + // But per spec_v3 schema, tests requires minItems: 1 + // Return the spec anyway with a warning + log("info", "Document produced no actionable chunks"); + return emptySpec; + } + + // Check actionability for all chunks in parallel + log("info", "Checking chunk actionability in parallel..."); + const actionabilityResults = await Promise.all( + chunks.map(async (chunk, index) => { + try { + const result = await checkActionability({ + content: chunk.content, + heading: chunk.heading, + config, + }); + return { index, chunk, ...result }; + } catch (error) { + log( + "info", + `Skipping chunk ${index + 1} (actionability check failed): ${error.message}` + ); + return { index, chunk, isActionable: false, reason: error.message }; + } + }) + ); + + // Filter to actionable chunks + const actionableChunks = actionabilityResults.filter((r) => r.isActionable); + log( + "info", + `${actionableChunks.length} of ${chunks.length} chunk(s) are actionable` + ); + + if (actionableChunks.length === 0) { + log("info", "No actionable chunks found, returning spec with empty tests"); + const emptySpec = { + specId: generateId("spec"), + description: `Generated from ${filePath}`, + contentPath: filePath, + tests: [], + }; + return emptySpec; + } + + // Analyze actionable chunks in parallel to generate tests + log("info", "Generating tests for actionable chunks..."); + const testResults = await Promise.all( + actionableChunks.map(async ({ index, chunk }) => { + try { + // Build description from heading if available + const description = chunk.heading + ? `${chunk.heading} - Generated from ${filePath}` + : `Chunk ${index + 1} - Generated from ${filePath}`; + + const test = await analyze({ + content: chunk.content, + filePath, + config, + maxContentLength, + files, + test: { + description, + sourceLocation: { + file: filePath, + ...chunk.sourceLocation, + isInline: false, + isAutoDetected: true, + }, + }, + }); + + return { success: true, test, index }; + } catch (error) { + log( + "info", + `Skipping chunk ${index + 1} (test generation failed): ${error.message}` + ); + return { success: false, error: error.message, index }; + } + }) + ); + + // Collect successful tests + const tests = testResults + .filter((r) => r.success) + .map((r) => r.test); + + log("info", `Successfully generated ${tests.length} test(s)`); + + // Build the spec + const spec = { + specId: generateId("spec"), + description: `Generated from ${filePath}`, + contentPath: filePath, + tests, + }; + + // Validate if we have tests + if (tests.length > 0) { + const validation = validate({ + schemaKey: "spec_v3", + object: spec, + addDefaults: false, + }); + + if (!validation.valid) { + log( + "warning", + `Generated spec failed validation: ${JSON.stringify(validation.errors)}` + ); + // Return anyway - caller can decide what to do + } + } + + return spec; +}; + + +module.exports = { + analyze, + analyzeDocument, + checkActionability, + buildAnalysisPrompt, + postProcessTest, + ANALYSIS_SYSTEM_PROMPT, + ACTIONABILITY_SCHEMA, + ACTIONABILITY_SYSTEM_PROMPT, + DEFAULT_MAX_CONTENT_LENGTH, +}; diff --git a/resolver/src/analyze.test.js b/resolver/src/analyze.test.js new file mode 100644 index 0000000..ec14018 --- /dev/null +++ b/resolver/src/analyze.test.js @@ -0,0 +1,1157 @@ +const crypto = require("crypto"); + +const { + ensureOllamaRunning, + stopOllamaContainer, + isOllamaAvailable, + ensureModelAvailable, + MODEL_PULL_TIMEOUT_MS, +} = require("doc-detective-common"); + +// Import the analyze module +const { + analyze, + analyzeDocument, + checkActionability, + buildAnalysisPrompt, + postProcessTest, + ANALYSIS_SYSTEM_PROMPT, + ACTIONABILITY_SCHEMA, + ACTIONABILITY_SYSTEM_PROMPT, + DEFAULT_MAX_CONTENT_LENGTH, +} = require("./analyze"); + +// Track if we started the container +let weStartedOllama = false; +// Track if Ollama is available for AI-dependent tests +let ollamaAvailable = false; + +before(async function () { + const { expect } = await import("chai"); + global.expect = expect; +}); + +describe("Analyze Module", function () { + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + + before(async function () { + console.log(" Setting up Ollama for tests..."); + // Track if we need to start the container + const wasAlreadyRunning = await isOllamaAvailable(); + ollamaAvailable = await ensureOllamaRunning(); + if (!ollamaAvailable) { + console.warn("Warning: Ollama is not available. Some tests may be skipped."); + } else { + // Ensure the model is available (might already be running but model not pulled) + const modelReady = await ensureModelAvailable({ model: "qwen3:4b" }); + if (!modelReady) { + console.warn("Warning: Could not ensure model availability. Some tests may be skipped."); + ollamaAvailable = false; + } + } + weStartedOllama = !wasAlreadyRunning && ollamaAvailable; + }); + + after(async function () { + if (weStartedOllama) { + console.log("Cleaning up Ollama container..."); + await stopOllamaContainer(); + } + }); + + describe("buildAnalysisPrompt", function () { + it("should build prompt with content only", function () { + const prompt = buildAnalysisPrompt({ + content: "# Getting Started\n\nNavigate to https://example.com", + }); + + expect(prompt).to.include("Analyze the following documentation"); + expect(prompt).to.include("# Getting Started"); + expect(prompt).to.include("https://example.com"); + expect(prompt).to.not.include("Source file:"); + }); + + it("should include file path when provided", function () { + const prompt = buildAnalysisPrompt({ + content: "Test content", + filePath: "/docs/getting-started.md", + }); + + expect(prompt).to.include("Source file: /docs/getting-started.md"); + }); + + it("should truncate content exceeding max length", function () { + const longContent = "x".repeat(200); + const prompt = buildAnalysisPrompt({ + content: longContent, + maxContentLength: 100, + }); + + expect(prompt).to.include("[Content truncated due to length...]"); + expect(prompt).to.not.include("x".repeat(200)); + }); + + it("should not truncate content within max length", function () { + const shortContent = "Short test content"; + const prompt = buildAnalysisPrompt({ + content: shortContent, + maxContentLength: 1000, + }); + + expect(prompt).to.include(shortContent); + expect(prompt).to.not.include("[Content truncated"); + }); + + it("should include partial test when provided", function () { + const partialTest = { + testId: "my-custom-test", + description: "Test the getting started guide", + }; + const prompt = buildAnalysisPrompt({ + content: "Test content", + test: partialTest, + }); + + expect(prompt).to.include("--- Partial Test (use as starting point) ---"); + expect(prompt).to.include("my-custom-test"); + expect(prompt).to.include("Test the getting started guide"); + expect(prompt).to.include("--- End Partial Test ---"); + expect(prompt).to.include("Complete and expand the partial test"); + }); + + it("should include partial test with steps", function () { + const partialTest = { + testId: "test-with-steps", + steps: [ + { goTo: { url: "https://example.com" } }, + ], + }; + const prompt = buildAnalysisPrompt({ + content: "Test content", + test: partialTest, + }); + + expect(prompt).to.include("test-with-steps"); + expect(prompt).to.include("https://example.com"); + }); + + it("should use default prompt when no partial test provided", function () { + const prompt = buildAnalysisPrompt({ + content: "Test content", + }); + + expect(prompt).to.not.include("--- Partial Test"); + expect(prompt).to.include("Generate a Doc Detective specification"); + }); + }); + + describe("ANALYSIS_SYSTEM_PROMPT", function () { + it("should contain documentation testing context", function () { + expect(ANALYSIS_SYSTEM_PROMPT).to.include("documentation testing expert"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("testable assertions"); + }); + + it("should mention available action types", function () { + expect(ANALYSIS_SYSTEM_PROMPT).to.include("goTo"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("find"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("checkLink"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("httpRequest"); + }); + + it("should include instructions for handling partial tests", function () { + expect(ANALYSIS_SYSTEM_PROMPT).to.include("When a partial test is provided"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("starting point"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("Fill in any missing required fields"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("Expand incomplete steps"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("Preserve any existing field values"); + }); + }); + + describe("DEFAULT_MAX_CONTENT_LENGTH", function () { + it("should be 100000", function () { + expect(DEFAULT_MAX_CONTENT_LENGTH).to.equal(100000); + }); + }); + + describe("postProcessTest", function () { + it("should return generated test unchanged when no partial test provided", function () { + const generatedTest = { + testId: "generated-id", + description: "Generated description", + steps: [{ goTo: { url: "https://example.com" } }], + }; + + const result = postProcessTest(generatedTest, undefined); + + expect(result).to.deep.equal(generatedTest); + }); + + it("should return generated test unchanged when partial test is null", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + + const result = postProcessTest(generatedTest, null); + + expect(result).to.deep.equal(generatedTest); + }); + + it("should preserve testId from partial test when generated test lacks it", function () { + const generatedTest = { + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + testId: "my-custom-id", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.testId).to.equal("my-custom-id"); + }); + + it("should not override testId when generated test already has one", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + testId: "partial-id", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.testId).to.equal("generated-id"); + }); + + it("should preserve sourceLocation from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + sourceLocation: { + file: "/docs/test.md", + startLine: 10, + endLine: 20, + }, + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.sourceLocation).to.deep.equal(partialTest.sourceLocation); + }); + + it("should preserve description from partial test", function () { + const generatedTest = { + testId: "generated-id", + description: "AI generated description", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + description: "User provided description", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.description).to.equal("User provided description"); + }); + + it("should preserve contentPath from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + contentPath: "/docs/getting-started.md", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.contentPath).to.equal("/docs/getting-started.md"); + }); + + it("should preserve detectSteps from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + detectSteps: false, + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.detectSteps).to.equal(false); + }); + + it("should preserve runOn from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + runOn: ["firefox", "chrome"], + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.runOn).to.deep.equal(["firefox", "chrome"]); + }); + + it("should preserve openApi from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + openApi: [{ path: "./openapi.yaml" }], + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.openApi).to.deep.equal([{ path: "./openapi.yaml" }]); + }); + + it("should preserve setup from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + setup: "./setup.spec.json", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.setup).to.equal("./setup.spec.json"); + }); + + it("should preserve cleanup from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + cleanup: "./cleanup.spec.json", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.cleanup).to.equal("./cleanup.spec.json"); + }); + + it("should preserve multiple fields from partial test", function () { + const generatedTest = { + testId: "generated-id", + description: "Generated", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + testId: "custom-id", + description: "Custom description", + contentPath: "/docs/test.md", + setup: "./setup.json", + cleanup: "./cleanup.json", + }; + + const result = postProcessTest(generatedTest, partialTest); + + // testId not overridden because generated test already has one + expect(result.testId).to.equal("generated-id"); + // Other fields are preserved + expect(result.description).to.equal("Custom description"); + expect(result.contentPath).to.equal("/docs/test.md"); + expect(result.setup).to.equal("./setup.json"); + expect(result.cleanup).to.equal("./cleanup.json"); + }); + + it("should keep generated steps when partial test has no steps", function () { + const generatedTest = { + testId: "generated-id", + steps: [ + { goTo: { url: "https://example.com" } }, + { find: { elementText: "Welcome" } }, + ], + }; + const partialTest = { + testId: "custom-id", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.steps).to.deep.equal(generatedTest.steps); + }); + }); + + describe("analyze", function () { + describe("input validation", function () { + it("should throw error when content is not provided", async function () { + try { + await analyze({}); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when content is not a string", async function () { + try { + await analyze({ content: 123 }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when content is empty string", async function () { + try { + await analyze({ content: "" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + }); + + describe("test generation", function () { + it("should generate a valid test from simple documentation", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const content = `# Getting Started + +Welcome to our documentation. + +## Step 1: Visit the homepage + +Navigate to https://example.com to get started. + +## Step 2: Check the API + +Make sure the API endpoint https://api.example.com/health returns a 200 status.`; + + const test = await analyze({ content }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + expect(test.steps.length).to.be.at.least(1); + }); + + it("should include file info when filePath is provided", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const test = await analyze({ + content: "Test documentation with a link: https://example.com", + filePath: "/docs/test.md", + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + + it("should use model from config when provided", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const test = await analyze({ + content: "Navigate to https://example.com and click the button.", + config: { + ai: { + model: "ollama/qwen3:4b", + }, + }, + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + + it("should override config model with explicit model parameter", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const test = await analyze({ + content: "Check that https://example.com returns 200.", + config: { + ai: { + model: "ollama/qwen3:8b", // This should be overridden + }, + }, + model: "ollama/qwen3:4b", // Use different model + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + + it("should generate steps with appropriate action types", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const content = `# API Testing Guide + +Make a GET request to https://api.example.com/users to get the list of users. +The response should have a 200 status code.`; + + const test = await analyze({ content }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + expect(test.steps.length).to.be.at.least(1); + + // Find a step with httpRequest or checkLink action + const hasApiStep = test.steps.some(step => + step.httpRequest || step.checkLink + ); + expect(hasApiStep).to.be.true; + }); + + it("should handle maxContentLength parameter", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const longContent = "Visit https://example.com. " + "x".repeat(50000); + + const test = await analyze({ + content: longContent, + maxContentLength: 1000, + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + }); + + describe("test validation", function () { + it("should produce tests that pass schema validation", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const { validate } = require("doc-detective-common"); + + const test = await analyze({ + content: "Go to https://example.com and verify the page loads.", + }); + + const validation = validate({schemaKey: "test_v3", object: test}); + expect(validation.valid).to.be.true; + }); + }); + + describe("partial test input", function () { + it("should preserve testId from partial test", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const result = await analyze({ + content: "Navigate to https://example.com and click the login button.", + test: { + testId: "my-custom-test-id", + }, + }); + + expect(result).to.be.an("object"); + expect(result.steps).to.be.an("array"); + // testId may or may not be preserved depending on AI generation + // but if AI doesn't generate one, ours should be used + }); + + it("should preserve description from partial test", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const result = await analyze({ + content: "Navigate to https://example.com.", + test: { + description: "My custom test description", + }, + }); + + expect(result).to.be.an("object"); + expect(result.description).to.equal("My custom test description"); + }); + + it("should preserve contentPath from partial test", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const result = await analyze({ + content: "Check https://example.com/api returns 200.", + test: { + contentPath: "/docs/api-guide.md", + }, + }); + + expect(result).to.be.an("object"); + expect(result.contentPath).to.equal("/docs/api-guide.md"); + }); + + it("should preserve setup and cleanup from partial test", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const result = await analyze({ + content: "Visit https://example.com.", + test: { + setup: "./setup.spec.json", + cleanup: "./cleanup.spec.json", + }, + }); + + expect(result).to.be.an("object"); + expect(result.setup).to.equal("./setup.spec.json"); + expect(result.cleanup).to.equal("./cleanup.spec.json"); + }); + + it("should expand partial test with incomplete steps", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const result = await analyze({ + content: `# Getting Started + +First, navigate to https://example.com. +Then click the "Sign Up" button. +Finally, fill in the registration form.`, + test: { + testId: "registration-test", + description: "Test the registration flow", + }, + }); + + expect(result).to.be.an("object"); + expect(result.steps).to.be.an("array"); + expect(result.steps.length).to.be.at.least(1); + expect(result.description).to.equal("Test the registration flow"); + }); + + it("should generate valid test when partial test provided", async function () { + // Skip if Ollama is not available + if (!ollamaAvailable) { + this.skip(); + } + + const { validate } = require("doc-detective-common"); + + const result = await analyze({ + content: "Go to https://example.com and verify the page loads.", + test: { + testId: "partial-test", + description: "Verify example.com loads", + detectSteps: false, + }, + }); + + const validation = validate({ schemaKey: "test_v3", object: result }); + expect(validation.valid).to.be.true; + expect(result.description).to.equal("Verify example.com loads"); + expect(result.detectSteps).to.equal(false); + }); + }); + }); + + describe("ACTIONABILITY_SCHEMA", function () { + it("should define isActionable as required boolean", function () { + expect(ACTIONABILITY_SCHEMA.type).to.equal("object"); + expect(ACTIONABILITY_SCHEMA.properties.isActionable.type).to.equal("boolean"); + expect(ACTIONABILITY_SCHEMA.required).to.include("isActionable"); + }); + + it("should define reason as required string", function () { + expect(ACTIONABILITY_SCHEMA.properties.reason.type).to.equal("string"); + expect(ACTIONABILITY_SCHEMA.required).to.include("reason"); + }); + }); + + describe("ACTIONABILITY_SYSTEM_PROMPT", function () { + it("should contain actionability classification context", function () { + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("documentation analysis expert"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("testable actions"); + }); + + it("should describe actionable content types", function () { + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("Navigate to URLs"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("Click buttons"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("Run shell/terminal commands"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("HTTP/API requests"); + }); + + it("should describe non-actionable content types", function () { + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("conceptual explanations"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("reference material"); + }); + }); + + describe("checkActionability", function () { + describe("input handling", function () { + it("should accept content parameter", async function () { + // This test verifies the function signature works + // Actual AI call is tested in integration tests + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Navigate to https://example.com and click the button.", + }); + + expect(result).to.be.an("object"); + expect(result).to.have.property("isActionable"); + expect(result).to.have.property("reason"); + expect(result.isActionable).to.be.a("boolean"); + expect(result.reason).to.be.a("string"); + }); + + it("should accept heading parameter for context", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Follow these steps to get started.", + heading: "Getting Started", + }); + + expect(result).to.be.an("object"); + expect(result).to.have.property("isActionable"); + }); + }); + + describe("actionability classification", function () { + it("should identify actionable content with URLs", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Navigate to https://example.com and click the Login button.", + }); + + expect(result.isActionable).to.be.true; + }); + + it("should identify actionable content with commands", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Run the following command in your terminal:\n\n```bash\nnpm install doc-detective\n```", + }); + + expect(result.isActionable).to.be.true; + }); + + it("should identify non-actionable conceptual content", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Doc Detective is a documentation testing framework. It was designed to help teams maintain accurate documentation.", + }); + + expect(result.isActionable).to.be.false; + }); + + it("should return reason for classification", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Go to https://example.com", + }); + + expect(result.reason).to.be.a("string"); + expect(result.reason.length).to.be.greaterThan(0); + }); + }); + + describe("error handling", function () { + it("should return not actionable on error", async function () { + // Force an error by providing invalid config + const result = await checkActionability({ + content: "Test content", + config: { + ai: { + apiKey: "invalid-key-that-will-fail", + }, + }, + }); + + expect(result).to.be.an("object"); + expect(result.isActionable).to.be.false; + }); + }); + }); + + describe("analyzeDocument", function () { + describe("input validation", function () { + it("should throw error when content is not provided", async function () { + try { + await analyzeDocument({ filePath: "/docs/test.md" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when content is not a string", async function () { + try { + await analyzeDocument({ content: 123, filePath: "/docs/test.md" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when filePath is not provided", async function () { + try { + await analyzeDocument({ content: "Test content" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'filePath' is required and must be a string."); + } + }); + + it("should throw error when filePath is not a string", async function () { + try { + await analyzeDocument({ content: "Test content", filePath: 123 }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'filePath' is required and must be a string."); + } + }); + }); + + describe("document parsing", function () { + it("should parse markdown documents", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `# Getting Started + +## Step 1: Navigate + +Go to https://example.com to begin. + +## Step 2: Login + +Click the **Login** button.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/getting-started.md", + }); + + expect(spec).to.be.an("object"); + expect(spec).to.have.property("specId"); + expect(spec).to.have.property("contentPath"); + expect(spec.contentPath).to.equal("/docs/getting-started.md"); + }); + + it("should throw for empty documents", async function () { + try { + await analyzeDocument({ + content: "", + filePath: "/docs/empty.md", + }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.include("content"); + } + }); + }); + + describe("chunk processing", function () { + it("should process document chunks", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Action Section + +Navigate to https://example.com and click the button. + +## Reference Section + +This section describes the architecture of the system.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/mixed.md", + }); + + expect(spec).to.be.an("object"); + expect(spec).to.have.property("tests"); + expect(spec.tests).to.be.an("array"); + }); + + it("should respect chunkLevel option", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `# Main Title + +## Section + +### Subsection + +Navigate to https://example.com. + +### Another Subsection + +Click the button.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/nested.md", + chunkLevel: 3, + }); + + expect(spec).to.be.an("object"); + }); + }); + + describe("spec generation", function () { + it("should generate valid spec with specId", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Quick Start + +Run the following command: + +\`\`\`bash +npm install doc-detective +\`\`\``; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/quickstart.md", + }); + + expect(spec.specId).to.be.a("string"); + expect(spec.specId.length).to.be.greaterThan(0); + }); + + it("should include contentPath in spec", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Test Section + +Navigate to https://example.com`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/test.md", + }); + + expect(spec.contentPath).to.equal("/docs/test.md"); + }); + + it("should generate tests array", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Actionable Section + +1. Go to https://example.com +2. Click the **Submit** button +3. Verify the success message appears`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/steps.md", + }); + + expect(spec.tests).to.be.an("array"); + // May or may not have tests depending on AI classification + }); + + it("should return empty tests array when no actionable content", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Architecture Overview + +This document describes the high-level architecture of the system. + +The system consists of three main components: +- Frontend +- Backend +- Database + +These components communicate via REST APIs.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/architecture.md", + }); + + expect(spec).to.be.an("object"); + expect(spec.tests).to.be.an("array"); + // Tests array may be empty if no actionable content found + }); + }); + + describe("test content", function () { + it("should include sourceLocation in generated tests", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Login Flow + +Navigate to https://example.com/login and enter your credentials.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/login.md", + }); + + if (spec.tests.length > 0) { + const test = spec.tests[0]; + expect(test).to.have.property("sourceLocation"); + expect(test.sourceLocation).to.have.property("file"); + expect(test.sourceLocation.file).to.equal("/docs/login.md"); + } + }); + + it("should generate tests with steps", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## API Testing + +Make a GET request to https://api.example.com/users. +Verify the response status is 200.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/api.md", + }); + + if (spec.tests.length > 0) { + expect(spec.tests[0]).to.have.property("steps"); + expect(spec.tests[0].steps).to.be.an("array"); + } + }); + }); + + describe("error handling", function () { + it("should skip chunks that fail actionability check gracefully", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + // Even with valid content, the function should handle any internal errors + const content = `## Valid Section + +Navigate to https://example.com. + +## Another Section + +Click the button.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/multi.md", + config: { logLevel: "silent" }, + }); + + expect(spec).to.be.an("object"); + }); + + it("should skip chunks that fail test generation gracefully", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Test Section + +Follow these steps to test the feature.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/test.md", + config: { logLevel: "silent" }, + }); + + // Should not throw, should return spec (possibly with empty tests) + expect(spec).to.be.an("object"); + }); + }); + + describe("format detection", function () { + it("should detect markdown format from file extension", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Markdown Section + +Content here.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/guide.md", + }); + + expect(spec).to.be.an("object"); + }); + + it("should detect HTML format from file extension", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `

HTML Section

+

Navigate to Example.

`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/page.html", + }); + + expect(spec).to.be.an("object"); + }); + }); + }); + }); diff --git a/resolver/src/index.js b/resolver/src/index.js index 4586e31..1fd5713 100644 --- a/resolver/src/index.js +++ b/resolver/src/index.js @@ -1,11 +1,39 @@ const { setConfig } = require("./config"); const { qualifyFiles, parseTests, log } = require("./utils"); const { resolveDetectedTests } = require("./resolve"); +const { analyze, analyzeDocument, checkActionability } = require("./analyze"); +const { + parseDocument, + parseMarkdown, + parseMdx, + parseRst, + parseAsciidoc, + parseDitaXml, + parseHtml, + parseNaive, + detectFormat, + getParser, +} = require("./parsers"); // const { telemetryNotice, sendTelemetry } = require("./telem"); exports.detectTests = detectTests; exports.resolveTests = resolveTests; exports.detectAndResolveTests = detectAndResolveTests; +exports.analyze = analyze; +exports.analyzeDocument = analyzeDocument; +exports.checkActionability = checkActionability; + +// Parser exports +exports.parseDocument = parseDocument; +exports.parseMarkdown = parseMarkdown; +exports.parseMdx = parseMdx; +exports.parseRst = parseRst; +exports.parseAsciidoc = parseAsciidoc; +exports.parseDitaXml = parseDitaXml; +exports.parseHtml = parseHtml; +exports.parseNaive = parseNaive; +exports.detectFormat = detectFormat; +exports.getParser = getParser; // const supportMessage = ` // ########################################################################## diff --git a/resolver/src/parsers.js b/resolver/src/parsers.js new file mode 100644 index 0000000..56414c9 --- /dev/null +++ b/resolver/src/parsers.js @@ -0,0 +1,979 @@ +const { unified } = require("unified"); +const remarkParse = require("remark-parse"); +const remarkMdx = require("remark-mdx"); +const { visit } = require("unist-util-visit"); +const { load: cheerioLoad } = require("cheerio"); +const { XMLParser } = require("fast-xml-parser"); +const path = require("path"); + +/** + * @typedef {Object} Chunk + * @property {string} content - The text content of the chunk + * @property {string} [heading] - The heading/title of this section (if any) + * @property {Object} sourceLocation - Source location information + * @property {number} sourceLocation.startLine - 1-based start line + * @property {number} sourceLocation.endLine - 1-based end line + * @property {number} sourceLocation.startColumn - 1-based start column + * @property {number} sourceLocation.endColumn - 1-based end column + * @property {number} sourceLocation.startOffset - 0-based character offset + * @property {number} sourceLocation.endOffset - 0-based character offset + */ + +/** + * Default chunk level for section splitting (H2 equivalent) + */ +const DEFAULT_CHUNK_LEVEL = 2; + +/** + * Tree-sitter parser instance (lazily initialized) + */ +let treeSitterParser = null; +let rstLanguage = null; + +/** + * Initialize the tree-sitter parser for rST (lazy initialization) + * @returns {Promise} The initialized parser + */ +const initTreeSitterRst = async () => { + if (treeSitterParser && rstLanguage) { + return { parser: treeSitterParser, language: rstLanguage }; + } + + const Parser = require("web-tree-sitter"); + await Parser.init(); + treeSitterParser = new Parser(); + + // Load the RST language - tree-sitter-rst should provide a .wasm file + // or we need to locate it in node_modules + const rstPath = require.resolve("tree-sitter-rst"); + const rstDir = path.dirname(rstPath); + const wasmPath = path.join(rstDir, "tree-sitter-rst.wasm"); + + try { + rstLanguage = await Parser.Language.load(wasmPath); + treeSitterParser.setLanguage(rstLanguage); + } catch (error) { + // Fallback: try to find .wasm in different locations + const altWasmPath = path.join(rstDir, "tree_sitter_rst.wasm"); + try { + rstLanguage = await Parser.Language.load(altWasmPath); + treeSitterParser.setLanguage(rstLanguage); + } catch (innerError) { + throw new Error( + `Failed to load tree-sitter-rst WASM: ${error.message}. ` + + `Tried paths: ${wasmPath}, ${altWasmPath}` + ); + } + } + + return { parser: treeSitterParser, language: rstLanguage }; +}; + +/** + * Convert AST position to sourceLocation object + * @param {Object} position - AST position with line/column info + * @param {string} content - Full document content + * @returns {Object} Source location object + */ +const positionToSourceLocation = (position, content) => { + const startLine = position.start?.line ?? 1; + const endLine = position.end?.line ?? startLine; + const startColumn = position.start?.column ?? 1; + const endColumn = position.end?.column ?? 1; + const startOffset = position.start?.offset ?? 0; + const endOffset = position.end?.offset ?? content.length; + + return { + startLine, + endLine, + startColumn, + endColumn, + startOffset, + endOffset, + }; +}; + +/** + * Calculate source location from line numbers + * @param {number} startLine - 1-based start line + * @param {number} endLine - 1-based end line + * @param {string} content - Full document content + * @returns {Object} Source location object + */ +const lineNumbersToSourceLocation = (startLine, endLine, content) => { + const lines = content.split("\n"); + let startOffset = 0; + let endOffset = content.length; + + // Calculate start offset + for (let i = 0; i < startLine - 1 && i < lines.length; i++) { + startOffset += lines[i].length + 1; // +1 for newline + } + + // Calculate end offset + endOffset = 0; + for (let i = 0; i < endLine && i < lines.length; i++) { + endOffset += lines[i].length + 1; + } + endOffset = Math.min(endOffset, content.length); + + return { + startLine, + endLine, + startColumn: 1, + endColumn: lines[endLine - 1]?.length + 1 || 1, + startOffset, + endOffset, + }; +}; + +/** + * Extract text content from mdast nodes + * @param {Object} node - mdast node + * @returns {string} Text content + */ +const extractMdastText = (node) => { + if (node.type === "text") { + return node.value; + } + if (node.children) { + return node.children.map(extractMdastText).join(""); + } + return ""; +}; + +/** + * Serialize mdast node back to markdown-ish text + * @param {Object} node - mdast node + * @param {string} content - Original content for fallback + * @returns {string} Serialized content + */ +const serializeMdastNode = (node, content) => { + if (node.position) { + return content.slice(node.position.start.offset, node.position.end.offset); + } + return extractMdastText(node); +}; + +/** + * Parse Markdown content into semantic chunks at H2 level + * @param {string} content - Markdown content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6) + * @returns {Promise} Array of chunks + */ +const parseMarkdown = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const processor = unified().use(remarkParse); + const tree = processor.parse(content); + + const chunks = []; + let currentChunk = null; + let currentHeading = null; + let currentNodes = []; + + const flushChunk = (endPosition) => { + if (currentNodes.length > 0) { + const startPos = currentNodes[0].position?.start || { line: 1, column: 1, offset: 0 }; + const endPos = endPosition || currentNodes[currentNodes.length - 1].position?.end || { line: 1, column: 1, offset: content.length }; + + const chunkContent = content.slice(startPos.offset, endPos.offset); + + if (chunkContent.trim()) { + chunks.push({ + content: chunkContent, + heading: currentHeading, + sourceLocation: { + startLine: startPos.line, + endLine: endPos.line, + startColumn: startPos.column, + endColumn: endPos.column, + startOffset: startPos.offset, + endOffset: endPos.offset, + }, + }); + } + } + currentNodes = []; + currentHeading = null; + }; + + for (const node of tree.children) { + if (node.type === "heading" && node.depth <= chunkLevel) { + // Flush previous chunk before starting new section + if (currentNodes.length > 0) { + flushChunk(node.position?.start); + } + currentHeading = extractMdastText(node); + currentNodes = [node]; + } else { + currentNodes.push(node); + } + } + + // Flush final chunk + flushChunk(); + + // If no chunks were created, return the whole document as one chunk + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse MDX content into semantic chunks at H2 level + * @param {string} content - MDX content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6) + * @returns {Promise} Array of chunks + */ +const parseMdx = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const processor = unified().use(remarkParse).use(remarkMdx); + const tree = processor.parse(content); + + const chunks = []; + let currentHeading = null; + let currentNodes = []; + + const flushChunk = (endPosition) => { + if (currentNodes.length > 0) { + const startPos = currentNodes[0].position?.start || { line: 1, column: 1, offset: 0 }; + const endPos = endPosition || currentNodes[currentNodes.length - 1].position?.end || { line: 1, column: 1, offset: content.length }; + + const chunkContent = content.slice(startPos.offset, endPos.offset); + + if (chunkContent.trim()) { + chunks.push({ + content: chunkContent, + heading: currentHeading, + sourceLocation: { + startLine: startPos.line, + endLine: endPos.line, + startColumn: startPos.column, + endColumn: endPos.column, + startOffset: startPos.offset, + endOffset: endPos.offset, + }, + }); + } + } + currentNodes = []; + currentHeading = null; + }; + + for (const node of tree.children) { + if (node.type === "heading" && node.depth <= chunkLevel) { + if (currentNodes.length > 0) { + flushChunk(node.position?.start); + } + currentHeading = extractMdastText(node); + currentNodes = [node]; + } else { + currentNodes.push(node); + } + } + + flushChunk(); + + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse reStructuredText content into semantic chunks using tree-sitter + * @param {string} content - rST content + * @param {Object} [options] - Parser options + * @returns {Promise} Array of chunks + */ +const parseRst = async (content, options = {}) => { + try { + const { parser } = await initTreeSitterRst(); + const tree = parser.parse(content); + + const chunks = []; + const sections = []; + + // Collect all section nodes + const collectSections = (node) => { + if (node.type === "section") { + const titleNode = node.children.find((c) => c.type === "title"); + sections.push({ + node, + title: titleNode ? content.slice(titleNode.startIndex, titleNode.endIndex).trim() : null, + startIndex: node.startIndex, + endIndex: node.endIndex, + startPosition: node.startPosition, + endPosition: node.endPosition, + }); + } + for (const child of node.children) { + collectSections(child); + } + }; + + collectSections(tree.rootNode); + + if (sections.length === 0) { + // No sections found, return whole document + if (content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + return chunks; + } + + // Calculate section boundaries + for (let i = 0; i < sections.length; i++) { + const section = sections[i]; + const nextSection = sections[i + 1]; + + const endOffset = nextSection ? nextSection.startIndex : content.length; + const chunkContent = content.slice(section.startIndex, endOffset); + + if (chunkContent.trim()) { + chunks.push({ + content: chunkContent, + heading: section.title, + sourceLocation: { + startLine: section.startPosition.row + 1, + endLine: nextSection + ? nextSection.startPosition.row + : content.split("\n").length, + startColumn: section.startPosition.column + 1, + endColumn: 1, + startOffset: section.startIndex, + endOffset: endOffset, + }, + }); + } + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse AsciiDoc content into semantic chunks + * @param {string} content - AsciiDoc content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Section level to chunk at (1-5) + * @returns {Promise} Array of chunks + */ +const parseAsciidoc = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const asciidoctor = require("asciidoctor")(); + const doc = asciidoctor.load(content, { sourcemap: true }); + + const chunks = []; + + /** + * Recursively process blocks to find sections + * @param {Object} block - AsciiDoc block + * @param {number} depth - Current depth + */ + const processBlock = (block, depth = 0) => { + const context = block.getContext ? block.getContext() : null; + + if (context === "section") { + const level = block.getLevel ? block.getLevel() : 0; + + // Only chunk at the specified level or higher (lower number = higher in hierarchy) + if (level > 0 && level <= chunkLevel) { + const title = block.getTitle ? block.getTitle() : null; + const sourceLocation = block.getSourceLocation + ? block.getSourceLocation() + : null; + + // Get the content of this section + let sectionContent = ""; + if (sourceLocation) { + const startLine = sourceLocation.getLineNumber + ? sourceLocation.getLineNumber() + : 1; + const lines = content.split("\n"); + // Find where this section ends (next section at same or higher level, or end of doc) + let endLine = lines.length; + + // Simple heuristic: look for next heading at same or higher level + const headingPattern = new RegExp(`^={1,${level}}\\s+`); + for (let i = startLine; i < lines.length; i++) { + if (headingPattern.test(lines[i]) && i > startLine) { + endLine = i; + break; + } + } + + sectionContent = lines.slice(startLine - 1, endLine).join("\n"); + const loc = lineNumbersToSourceLocation(startLine, endLine, content); + + if (sectionContent.trim()) { + chunks.push({ + content: sectionContent, + heading: title, + sourceLocation: loc, + }); + } + } + } + } + + // Process child blocks + if (block.getBlocks) { + const blocks = block.getBlocks(); + for (const child of blocks) { + processBlock(child, depth + 1); + } + } + }; + + // Process sections from the document + if (doc.getSections) { + const sections = doc.getSections(); + for (const section of sections) { + processBlock(section, 0); + } + } + + // If no chunks were created, return the whole document + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: doc.getTitle ? doc.getTitle() : null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse DITA/XML content into semantic chunks + * @param {string} content - DITA/XML content + * @param {Object} [options] - Parser options + * @returns {Promise} Array of chunks + */ +const parseDitaXml = async (content, options = {}) => { + try { + const parser = new XMLParser({ + ignoreAttributes: false, + attributeNamePrefix: "@_", + preserveOrder: true, + commentPropName: "#comment", + trimValues: false, + }); + + const result = parser.parse(content); + const chunks = []; + + /** + * Find section-like elements in DITA/XML + * DITA section elements: topic, concept, task, reference, section + * Generic XML: section, div with id/class + */ + const sectionElements = [ + "topic", + "concept", + "task", + "reference", + "troubleshooting", + "section", + "taskbody", + "conbody", + "refbody", + ]; + + /** + * Extract text content from parsed XML node + * @param {Object|Array} node - Parsed XML node + * @returns {string} Text content + */ + const extractText = (node) => { + if (typeof node === "string") return node; + if (Array.isArray(node)) return node.map(extractText).join(""); + if (typeof node === "object") { + let text = ""; + for (const [key, value] of Object.entries(node)) { + if (key === "#text") { + text += value; + } else if (!key.startsWith("@_") && !key.startsWith("#")) { + text += extractText(value); + } + } + return text; + } + return ""; + }; + + /** + * Find title element in a DITA node + * @param {Object|Array} node - Parsed XML node + * @returns {string|null} Title text or null + */ + const findTitle = (node) => { + if (Array.isArray(node)) { + for (const item of node) { + if (item.title) { + return extractText(item.title); + } + } + } else if (typeof node === "object" && node.title) { + return extractText(node.title); + } + return null; + }; + + /** + * Walk the XML tree to find sections + * @param {Object|Array} node - Current node + * @param {number} depth - Current depth + */ + const walkXml = (node, depth = 0) => { + if (Array.isArray(node)) { + for (const item of node) { + walkXml(item, depth); + } + } else if (typeof node === "object") { + for (const [key, value] of Object.entries(node)) { + if (sectionElements.includes(key)) { + const title = findTitle(value); + const textContent = extractText(value); + + if (textContent.trim()) { + // For XML, we estimate line numbers since fast-xml-parser doesn't provide them + // This is a limitation - we'll use offset-based estimation + chunks.push({ + content: textContent, + heading: title, + sourceLocation: { + startLine: 1, + endLine: 1, + startColumn: 1, + endColumn: 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } else if (!key.startsWith("@_") && !key.startsWith("#")) { + walkXml(value, depth + 1); + } + } + } + }; + + walkXml(result, 0); + + // If no chunks were created, return the whole document + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse HTML content into semantic chunks + * @param {string} content - HTML content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6) + * @returns {Promise} Array of chunks + */ +const parseHtml = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const $ = cheerioLoad(content); + const chunks = []; + + // Build selector for section boundaries + const headingSelectors = []; + for (let i = 1; i <= chunkLevel; i++) { + headingSelectors.push(`h${i}`); + } + const sectionSelectors = ["section", "article", "main"]; + + // Find all headings at or above chunk level + const headings = $(headingSelectors.join(", ")).toArray(); + + if (headings.length === 0) { + // No headings found - try sections + const sections = $(sectionSelectors.join(", ")).toArray(); + + if (sections.length > 0) { + for (const section of sections) { + const $section = $(section); + const title = + $section.find("h1, h2, h3, h4, h5, h6").first().text() || null; + const text = $section.text(); + + if (text.trim()) { + chunks.push({ + content: $.html(section), + heading: title, + sourceLocation: { + startLine: 1, + endLine: 1, + startColumn: 1, + endColumn: 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } + } else { + // No sections either - return whole body + const bodyContent = $("body").length ? $("body").html() : content; + if (bodyContent && bodyContent.trim()) { + chunks.push({ + content: bodyContent, + heading: $("title").text() || null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } + } else { + // Process headings as section boundaries + for (let i = 0; i < headings.length; i++) { + const heading = headings[i]; + const $heading = $(heading); + const title = $heading.text(); + + // Collect content until next heading + let sectionContent = $.html(heading); + let current = $heading.next(); + + while (current.length > 0) { + const tagName = current.prop("tagName")?.toLowerCase(); + // Stop at next heading of same or higher level + if (tagName && /^h[1-6]$/.test(tagName)) { + const level = parseInt(tagName.charAt(1), 10); + if (level <= chunkLevel) { + break; + } + } + sectionContent += $.html(current); + current = current.next(); + } + + if (sectionContent.trim()) { + chunks.push({ + content: sectionContent, + heading: title, + sourceLocation: { + startLine: 1, + endLine: 1, + startColumn: 1, + endColumn: 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } + } + + // If still no chunks, return whole document + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Naive parsing fallback - splits on heading patterns or blank lines + * @param {string} content - Document content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at + * @returns {Promise} Array of chunks + */ +const parseNaive = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + const chunks = []; + + // Try to detect heading patterns + // Markdown: # Heading, ## Heading, etc. + // rST: underlines with =, -, ~, etc. + // AsciiDoc: = Heading, == Heading, etc. + const lines = content.split("\n"); + + // Markdown/AsciiDoc heading pattern (# or =) + const mdHeadingPattern = new RegExp(`^#{1,${chunkLevel}}\\s+(.+)$`); + const adocHeadingPattern = new RegExp(`^={1,${chunkLevel}}\\s+(.+)$`); + + // rST section detection (title followed by underline) + const rstUnderlineChars = ["=", "-", "~", "^", '"', "'", "`", ":"]; + + let currentChunkLines = []; + let currentHeading = null; + let chunkStartLine = 1; + + const flushChunk = (endLine) => { + if (currentChunkLines.length > 0) { + const chunkContent = currentChunkLines.join("\n"); + if (chunkContent.trim()) { + const loc = lineNumbersToSourceLocation( + chunkStartLine, + endLine, + content + ); + chunks.push({ + content: chunkContent, + heading: currentHeading, + sourceLocation: loc, + }); + } + } + currentChunkLines = []; + currentHeading = null; + }; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const lineNum = i + 1; + + // Check for Markdown heading + const mdMatch = line.match(mdHeadingPattern); + if (mdMatch) { + flushChunk(lineNum - 1); + chunkStartLine = lineNum; + currentHeading = mdMatch[1]; + currentChunkLines.push(line); + continue; + } + + // Check for AsciiDoc heading + const adocMatch = line.match(adocHeadingPattern); + if (adocMatch) { + flushChunk(lineNum - 1); + chunkStartLine = lineNum; + currentHeading = adocMatch[1]; + currentChunkLines.push(line); + continue; + } + + // Check for rST-style heading (previous line is title, current is underline) + if (i > 0 && line.length > 0) { + const underlineChar = line.charAt(0); + if ( + rstUnderlineChars.includes(underlineChar) && + line === underlineChar.repeat(line.length) && + lines[i - 1].trim().length > 0 && + line.length >= lines[i - 1].trim().length + ) { + // This is an rST heading underline + // Remove the title line from current chunk and start new chunk + const titleLine = currentChunkLines.pop(); + flushChunk(lineNum - 2); + chunkStartLine = lineNum - 1; + currentHeading = titleLine?.trim() || null; + currentChunkLines.push(titleLine || ""); + currentChunkLines.push(line); + continue; + } + } + + currentChunkLines.push(line); + } + + // Flush final chunk + flushChunk(lines.length); + + // If no chunks were created, return whole document as one chunk + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: lines.length, + startColumn: 1, + endColumn: lines[lines.length - 1]?.length + 1 || 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; +}; + +/** + * Detect document format from file extension + * @param {string} filePath - Path to the file + * @returns {string} Format identifier: 'markdown', 'mdx', 'rst', 'asciidoc', 'dita', 'xml', 'html', or 'unknown' + */ +const detectFormat = (filePath) => { + const ext = path.extname(filePath).toLowerCase(); + + const formatMap = { + ".md": "markdown", + ".markdown": "markdown", + ".mdx": "mdx", + ".rst": "rst", + ".rest": "rst", + ".adoc": "asciidoc", + ".asciidoc": "asciidoc", + ".asc": "asciidoc", + ".dita": "dita", + ".ditamap": "dita", + ".xml": "xml", + ".html": "html", + ".htm": "html", + ".xhtml": "html", + }; + + return formatMap[ext] || "unknown"; +}; + +/** + * Get the appropriate parser function for a format + * @param {string} format - Format identifier from detectFormat() + * @returns {Function} Parser function + */ +const getParser = (format) => { + const parserMap = { + markdown: parseMarkdown, + mdx: parseMdx, + rst: parseRst, + asciidoc: parseAsciidoc, + dita: parseDitaXml, + xml: parseDitaXml, + html: parseHtml, + unknown: parseNaive, + }; + + return parserMap[format] || parseNaive; +}; + +/** + * Parse a document into semantic chunks using the appropriate parser + * @param {string} content - Document content + * @param {string} filePath - Path to the file (used for format detection) + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at + * @returns {Promise} Array of chunks + */ +const parseDocument = async (content, filePath, options = {}) => { + const format = detectFormat(filePath); + const parser = getParser(format); + return parser(content, options); +}; + +module.exports = { + parseMarkdown, + parseMdx, + parseRst, + parseAsciidoc, + parseDitaXml, + parseHtml, + parseNaive, + detectFormat, + getParser, + parseDocument, + DEFAULT_CHUNK_LEVEL, +}; diff --git a/resolver/src/parsers.test.js b/resolver/src/parsers.test.js new file mode 100644 index 0000000..d8db034 --- /dev/null +++ b/resolver/src/parsers.test.js @@ -0,0 +1,887 @@ +const path = require("path"); + +const { + parseMarkdown, + parseMdx, + parseRst, + parseAsciidoc, + parseDitaXml, + parseHtml, + parseNaive, + detectFormat, + getParser, + parseDocument, + DEFAULT_CHUNK_LEVEL, +} = require("./parsers"); + +before(async function () { + const { expect } = await import("chai"); + global.expect = expect; +}); + +describe("Parsers Module", function () { + describe("DEFAULT_CHUNK_LEVEL", function () { + it("should be 2 (H2 level)", function () { + expect(DEFAULT_CHUNK_LEVEL).to.equal(2); + }); + }); + + describe("detectFormat", function () { + it("should detect markdown files", function () { + expect(detectFormat("/docs/guide.md")).to.equal("markdown"); + expect(detectFormat("/docs/guide.markdown")).to.equal("markdown"); + }); + + it("should detect MDX files", function () { + expect(detectFormat("/docs/page.mdx")).to.equal("mdx"); + }); + + it("should detect reStructuredText files", function () { + expect(detectFormat("/docs/index.rst")).to.equal("rst"); + expect(detectFormat("/docs/index.rest")).to.equal("rst"); + }); + + it("should detect AsciiDoc files", function () { + expect(detectFormat("/docs/guide.adoc")).to.equal("asciidoc"); + expect(detectFormat("/docs/guide.asciidoc")).to.equal("asciidoc"); + expect(detectFormat("/docs/guide.asc")).to.equal("asciidoc"); + }); + + it("should detect DITA files", function () { + expect(detectFormat("/docs/topic.dita")).to.equal("dita"); + expect(detectFormat("/docs/map.ditamap")).to.equal("dita"); + }); + + it("should detect XML files", function () { + expect(detectFormat("/docs/config.xml")).to.equal("xml"); + }); + + it("should detect HTML files", function () { + expect(detectFormat("/docs/page.html")).to.equal("html"); + expect(detectFormat("/docs/page.htm")).to.equal("html"); + expect(detectFormat("/docs/page.xhtml")).to.equal("html"); + }); + + it("should return unknown for unrecognized extensions", function () { + expect(detectFormat("/docs/file.txt")).to.equal("unknown"); + expect(detectFormat("/docs/file.json")).to.equal("unknown"); + expect(detectFormat("/docs/file")).to.equal("unknown"); + }); + + it("should handle case-insensitive extensions", function () { + expect(detectFormat("/docs/file.MD")).to.equal("markdown"); + expect(detectFormat("/docs/file.HTML")).to.equal("html"); + }); + }); + + describe("getParser", function () { + it("should return parseMarkdown for markdown format", function () { + expect(getParser("markdown")).to.equal(parseMarkdown); + }); + + it("should return parseMdx for mdx format", function () { + expect(getParser("mdx")).to.equal(parseMdx); + }); + + it("should return parseRst for rst format", function () { + expect(getParser("rst")).to.equal(parseRst); + }); + + it("should return parseAsciidoc for asciidoc format", function () { + expect(getParser("asciidoc")).to.equal(parseAsciidoc); + }); + + it("should return parseDitaXml for dita format", function () { + expect(getParser("dita")).to.equal(parseDitaXml); + }); + + it("should return parseDitaXml for xml format", function () { + expect(getParser("xml")).to.equal(parseDitaXml); + }); + + it("should return parseHtml for html format", function () { + expect(getParser("html")).to.equal(parseHtml); + }); + + it("should return parseNaive for unknown format", function () { + expect(getParser("unknown")).to.equal(parseNaive); + }); + + it("should return parseNaive for undefined format", function () { + expect(getParser(undefined)).to.equal(parseNaive); + }); + }); + + describe("parseMarkdown", function () { + it("should parse simple markdown with H2 sections", async function () { + const content = `# Main Title + +Introduction paragraph. + +## Section One + +Content for section one. + +## Section Two + +Content for section two.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should include heading in chunk", async function () { + const content = `## Getting Started + +Follow these steps to get started.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].heading).to.equal("Getting Started"); + expect(chunks[0].content).to.include("Follow these steps"); + }); + + it("should include source location information", async function () { + const content = `## First Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + expect(chunks[0].sourceLocation.startLine).to.be.a("number"); + expect(chunks[0].sourceLocation.endLine).to.be.a("number"); + expect(chunks[0].sourceLocation.startOffset).to.be.a("number"); + expect(chunks[0].sourceLocation.endOffset).to.be.a("number"); + }); + + it("should handle content before first heading", async function () { + const content = `Some intro text before any heading. + +## First Section + +Section content.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + // Should have at least 2 chunks - intro and section + expect(chunks.length).to.be.at.least(1); + }); + + it("should respect custom chunkLevel option", async function () { + const content = `# H1 Title + +## H2 Section + +### H3 Subsection + +Content in H3. + +### Another H3 + +More content.`; + + // Chunk at H3 level + const chunks = await parseMarkdown(content, { chunkLevel: 3 }); + + // Should create chunks at H3 boundaries too + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should return whole document when no headings present", async function () { + const content = `This is a document without any headings. + +Just paragraphs of text. + +And more text.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].content).to.equal(content); + expect(chunks[0].heading).to.be.null; + }); + + it("should handle empty content", async function () { + const chunks = await parseMarkdown(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle whitespace-only content", async function () { + const chunks = await parseMarkdown(" \n\n "); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle code blocks correctly", async function () { + const content = `## Code Example + +Here is some code: + +\`\`\`javascript +function hello() { + console.log("Hello"); +} +\`\`\` + +More content after code.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + // Content should be in chunks (may include code block in section) + expect(chunks.length).to.be.at.least(1); + // Find the chunk with the code example + const codeChunk = chunks.find(c => c.content.includes("```javascript")); + expect(codeChunk).to.exist; + }); + + it("should handle links and inline formatting", async function () { + const content = `## Links Section + +Check out [Example](https://example.com) for more info. + +**Bold text** and *italic text* are supported.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].content).to.include("[Example](https://example.com)"); + expect(chunks[0].content).to.include("**Bold text**"); + }); + }); + + describe("parseMdx", function () { + it("should parse MDX content with JSX components", async function () { + const content = `## Component Example + + + +Regular markdown text.`; + + const chunks = await parseMdx(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].content).to.include("Click`; + + const chunks = await parseMdx(content); + + expect(chunks).to.be.an("array"); + // Should handle the import statement + }); + + it("should include source location", async function () { + const content = `## MDX Section + +Some content.`; + + const chunks = await parseMdx(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + expect(chunks[0].sourceLocation.startLine).to.be.a("number"); + }); + + it("should handle empty MDX content", async function () { + const chunks = await parseMdx(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + }); + + describe("parseAsciidoc", function () { + it("should parse AsciiDoc with section headings", async function () { + const content = `= Main Title + +Introduction. + +== First Section + +Content for first section. + +== Second Section + +Content for second section.`; + + const chunks = await parseAsciidoc(content); + + expect(chunks).to.be.an("array"); + // Should find sections + }); + + it("should return whole document when no sections", async function () { + const content = `= Document Title + +Just a document with a title but no sections. + +Some paragraphs here.`; + + const chunks = await parseAsciidoc(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(1); + }); + + it("should include source location", async function () { + const content = `= Title + +== Section + +Content here.`; + + const chunks = await parseAsciidoc(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty content", async function () { + const chunks = await parseAsciidoc(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + }); + + describe("parseDitaXml", function () { + it("should parse DITA topic content", async function () { + const content = ` + + + Sample Topic + +
+ First Section +

Section content here.

+
+ +
`; + + const chunks = await parseDitaXml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(1); + }); + + it("should extract text from sections", async function () { + const content = ` + Topic Title + +
+ Section Title +

Paragraph text.

+
+ +
`; + + const chunks = await parseDitaXml(content); + + expect(chunks).to.be.an("array"); + // Should extract section content + }); + + it("should handle task elements", async function () { + const content = ` + Task Title + + + Do something. + + +`; + + const chunks = await parseDitaXml(content); + + expect(chunks).to.be.an("array"); + }); + + it("should include source location", async function () { + const content = `Test`; + + const chunks = await parseDitaXml(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty content", async function () { + const chunks = await parseDitaXml(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle malformed XML gracefully", async function () { + const content = ` + +Test Page + +

Main Title

+

Introduction.

+

First Section

+

First section content.

+

Second Section

+

Second section content.

+ +`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should extract headings as chunk titles", async function () { + const content = `

Getting Started

+

Follow these steps.

`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].heading).to.equal("Getting Started"); + }); + + it("should handle semantic section elements", async function () { + const content = `
+

Section One

+

Content one.

+
+
+

Section Two

+

Content two.

+
`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + }); + + it("should include source location", async function () { + const content = `

Test

Content

`; + + const chunks = await parseHtml(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty HTML", async function () { + const chunks = await parseHtml(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle HTML without headings", async function () { + const content = `

Just some paragraphs.

More text.

`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + }); + + it("should respect chunkLevel option", async function () { + const content = `

H1 Title

+

Content under H1.

+

H2 Section

+

Content under H2.

+

H3 Subsection

+

Content under H3.

`; + + const chunks = await parseHtml(content, { chunkLevel: 3 }); + + expect(chunks).to.be.an("array"); + // Should include H3 as section boundary + }); + }); + + describe("parseNaive", function () { + it("should parse markdown-style headings", async function () { + const content = `# Main Title + +Introduction. + +## Section One + +Content one. + +## Section Two + +Content two.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should parse AsciiDoc-style headings", async function () { + const content = `= Main Title + +Introduction. + +== Section One + +Content one.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + }); + + it("should parse rST-style headings with underlines", async function () { + const content = `Main Title +========== + +Introduction text. + +Section One +----------- + +Content for section one.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should include source location", async function () { + const content = `## Test Section + +Content here.`; + + const chunks = await parseNaive(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + expect(chunks[0].sourceLocation.startLine).to.be.a("number"); + expect(chunks[0].sourceLocation.endLine).to.be.a("number"); + }); + + it("should return whole document when no headings found", async function () { + const content = `Just plain text. + +More paragraphs. + +No headings here.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].content).to.equal(content); + }); + + it("should handle empty content", async function () { + const chunks = await parseNaive(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should respect chunkLevel option", async function () { + const content = `# H1 + +## H2 + +### H3 + +Content.`; + + const chunks = await parseNaive(content, { chunkLevel: 3 }); + + expect(chunks).to.be.an("array"); + // Should recognize H3 as section boundary + }); + }); + + describe("parseRst", function () { + // Note: parseRst requires tree-sitter-rst WASM which may not be available in all environments + // These tests will gracefully fall back to naive parsing if WASM isn't loaded + + it("should parse rST content", async function () { + const content = `Title +===== + +Introduction. + +Section One +----------- + +Content one. + +Section Two +----------- + +Content two.`; + + const chunks = await parseRst(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(1); + }); + + it("should include source location", async function () { + const content = `Test +==== + +Content here.`; + + const chunks = await parseRst(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty content", async function () { + const chunks = await parseRst(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle content without sections", async function () { + const content = `Just some plain text without any sections. + +Another paragraph.`; + + const chunks = await parseRst(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + }); + }); + + describe("parseDocument", function () { + it("should use parseMarkdown for .md files", async function () { + const content = `## Section + +Content.`; + + const chunks = await parseDocument(content, "/docs/guide.md"); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].heading).to.equal("Section"); + }); + + it("should use parseMdx for .mdx files", async function () { + const content = `## Section + +`; + + const chunks = await parseDocument(content, "/docs/page.mdx"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseHtml for .html files", async function () { + const content = `

Section

Content

`; + + const chunks = await parseDocument(content, "/docs/page.html"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseAsciidoc for .adoc files", async function () { + const content = `= Title + +== Section + +Content.`; + + const chunks = await parseDocument(content, "/docs/guide.adoc"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseDitaXml for .dita files", async function () { + const content = `Test`; + + const chunks = await parseDocument(content, "/docs/topic.dita"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseNaive for unknown extensions", async function () { + const content = `## Section + +Content.`; + + const chunks = await parseDocument(content, "/docs/file.txt"); + + expect(chunks).to.be.an("array"); + }); + + it("should pass options to the parser", async function () { + const content = `# H1 + +## H2 + +### H3 + +Content.`; + + const chunks = await parseDocument(content, "/docs/guide.md", { + chunkLevel: 3, + }); + + expect(chunks).to.be.an("array"); + }); + }); + + describe("Chunk structure validation", function () { + it("should always include content property", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0]).to.have.property("content"); + expect(chunks[0].content).to.be.a("string"); + expect(chunks[0].content.length).to.be.greaterThan(0); + }); + + it("should always include sourceLocation property", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0]).to.have.property("sourceLocation"); + expect(chunks[0].sourceLocation).to.have.property("startLine"); + expect(chunks[0].sourceLocation).to.have.property("endLine"); + expect(chunks[0].sourceLocation).to.have.property("startColumn"); + expect(chunks[0].sourceLocation).to.have.property("endColumn"); + expect(chunks[0].sourceLocation).to.have.property("startOffset"); + expect(chunks[0].sourceLocation).to.have.property("endOffset"); + }); + + it("should include heading property (can be null)", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0]).to.have.property("heading"); + }); + + it("should have valid line numbers (1-based)", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].sourceLocation.startLine).to.be.at.least(1); + expect(chunks[0].sourceLocation.endLine).to.be.at.least( + chunks[0].sourceLocation.startLine + ); + }); + + it("should have valid offsets (0-based)", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].sourceLocation.startOffset).to.be.at.least(0); + expect(chunks[0].sourceLocation.endOffset).to.be.greaterThan( + chunks[0].sourceLocation.startOffset + ); + }); + }); + + describe("Edge cases", function () { + it("should handle very long documents", async function () { + const sections = []; + for (let i = 0; i < 100; i++) { + sections.push(`## Section ${i}\n\nContent for section ${i}.`); + } + const content = sections.join("\n\n"); + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(100); + }); + + it("should handle special characters in headings", async function () { + const content = `## Section with "quotes" & chars + +Content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks[0].heading).to.include("quotes"); + }); + + it("should handle Unicode content", async function () { + const content = `## 日本語の見出し + +日本語のコンテンツ。 + +## Émojis 🎉 + +Content with émojis 👍`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(2); + expect(chunks[0].heading).to.equal("日本語の見出し"); + }); + + it("should handle mixed line endings", async function () { + const content = "## Section One\r\n\r\nContent.\r\n\n## Section Two\n\nMore content."; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should handle deeply nested headings", async function () { + const content = `# H1 + +## H2 + +### H3 + +#### H4 + +##### H5 + +###### H6 + +Content at deepest level.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + }); + }); +}); diff --git a/resolver/src/utils.js b/resolver/src/utils.js index 481d609..339f4a0 100644 --- a/resolver/src/utils.js +++ b/resolver/src/utils.js @@ -25,6 +25,8 @@ exports.cleanTemp = cleanTemp; exports.calculatePercentageDifference = calculatePercentageDifference; exports.fetchFile = fetchFile; exports.isRelativeUrl = isRelativeUrl; +exports.calculateSourceLocation = calculateSourceLocation; +exports.detectCommentFormat = detectCommentFormat; function isRelativeUrl(url) { try { @@ -37,6 +39,148 @@ function isRelativeUrl(url) { } } +/** + * Calculate line and column numbers from a character offset in content. + * Lines are 1-based, columns are 1-based. + * + * @param {string} content - The full content string + * @param {number} startOffset - 0-based character offset for start position + * @param {number} endOffset - 0-based character offset for end position + * @returns {Object} Object with startLine, endLine, startColumn, endColumn + */ +function calculateLineColumn(content, startOffset, endOffset) { + // Validate and normalize offsets + let start = Math.max(0, startOffset); + let end = Math.max(0, endOffset); + + // Swap if start > end + if (start > end) { + [start, end] = [end, start]; + } + + // Clamp to content length + start = Math.min(start, content.length); + end = Math.min(end, content.length); + + let startLine = 1; + let startColumn = 1; + let endLine = 1; + let endColumn = 1; + let currentOffset = 0; + let startFound = false; + let endFound = false; + + const lines = content.split('\n'); + + for (let i = 0; i < lines.length; i++) { + const isLastLine = i === lines.length - 1; + // Only add 1 for newline if this line actually has a trailing newline (not the last line) + const hasNewline = !isLastLine; + const lineLength = lines[i].length + (hasNewline ? 1 : 0); + const lineEnd = currentOffset + lineLength; + // For the last line, lineEnd should equal content.length + const effectiveLineEnd = isLastLine ? content.length : lineEnd; + + // Check if start falls within this line: [currentOffset, effectiveLineEnd) + // For last line, use <= to include EOF position + if (!startFound) { + const startInLine = isLastLine + ? (start >= currentOffset && start <= effectiveLineEnd) + : (start >= currentOffset && start < effectiveLineEnd); + if (startInLine) { + startLine = i + 1; + startColumn = start - currentOffset + 1; + startFound = true; + } + } + + // Check if end falls within this line: [currentOffset, effectiveLineEnd) + // For last line, use <= to include EOF position + if (!endFound) { + const endInLine = isLastLine + ? (end >= currentOffset && end <= effectiveLineEnd) + : (end >= currentOffset && end < effectiveLineEnd); + if (endInLine) { + endLine = i + 1; + endColumn = end - currentOffset + 1; + endFound = true; + } + } + + // Break when both offsets have been located + if (startFound && endFound) { + break; + } + + currentOffset = lineEnd; + } + + return { startLine, endLine, startColumn, endColumn }; +} + +/** + * Detect the comment format used for an inline test or step. + * + * @param {string} originalText - The original text of the match + * @returns {string} One of: 'htmlComment', 'jsxComment', 'linkReference' + */ +function detectCommentFormat(originalText) { + if (!originalText || typeof originalText !== 'string') { + return 'htmlComment'; + } + + const trimmed = originalText.trim(); + + // HTML-style comments: + if (trimmed.startsWith('