diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4dc891f0..db286bd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,6 @@ jobs: - windows-latest - macos-latest node-version: - - "20" - "22" - "24" @@ -38,8 +37,14 @@ jobs: - name: TypeCheck + Lint + Format Check run: npm run check - - name: Bundle + - name: Build Core + run: npm run build --workspace=@vegamo/deepcode-core + + - name: Bundle CLI run: npm run bundle + - name: Build VSCode Extension + run: npm run build:vscode + - name: Test run: npm test diff --git a/.gitignore b/.gitignore index 8f054d4b..37f64ba0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,27 @@ +# OS metadata +.DS_Store +Thumbs.db + +# Dependency directory node_modules/ +# Ignore built ts files dist/ -.DS_Store +out/ + + +# Editors .idea/ .vscode/ *.tgz *.log +*.vsix .deepcode/settings.json + +# TypeScript build info files +*.tsbuildinfo + +# Generated files +packages/cli/src/generated/ +packages/core/src/generated/ +packages/vscode-ide-companion/*.vsix +packages/vscode-ide-companion/templates/ \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..38f11c64 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..2bd5a0a9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000..deca0fd7 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,235 @@ +# 版本发布 + +Deep Code 使用两个脚本管理 monorepo 的版本发布流程: + +| 脚本 | 命令 | 用途 | +|------|------|------| +| `scripts/version.js` | `npm run release:version` | 升级所有 workspace 包的版本号 + 重新生成 lockfile | +| `scripts/prepare-package.js` | `npm run prepare:package` | 构建 + 质量检查 + 发布到 npm + git commit & tag | + +两者配合使用,先升版本号,再发布。 + +--- + +## release:version — 版本号升级 + +用法与 `npm version` 一致,支持所有标准 bump 类型。 + +### 基本用法 + +```bash +npm run release:version -- [options] +``` + +> 注意:npm scripts 传参需要 `--` 分隔符。 + +### 支持的 bump 类型 + +| 类型 | 当前版本 | 结果 | 说明 | +|------|---------|------|------| +| `patch` | `0.1.31` | `0.1.32` | 补丁版本 +1 | +| `minor` | `0.1.31` | `0.2.0` | 次版本 +1,patch 归零 | +| `major` | `0.1.31` | `1.0.0` | 主版本 +1,minor/patch 归零 | +| `prepatch` | `0.1.31` | `0.1.32-0` | 预发布补丁 | +| `preminor` | `0.1.31` | `0.2.0-0` | 预发布次版本 | +| `premajor` | `0.1.31` | `1.0.0-0` | 预发布主版本 | +| `prerelease` | `0.1.31` | `0.1.32-0` | 递增预发布号 | +| `from-git` | — | 从最新 git tag 读取 | 适用于已有 tag 但未更新 package.json 的情况 | + +也可以直接指定版本号: + +```bash +npm run release:version -- 0.2.0 +``` + +### 预发布链 + +`prerelease` 支持链式递增: + +``` +0.1.31 + → prerelease → 0.1.32-beta.0 + → prerelease → 0.1.32-beta.1 + → prerelease → 0.1.32-beta.2 + → patch → 0.1.32 (去掉 prerelease 后缀) +``` + +### --preid 选项 + +预发布标识符,默认为 `"0"`,可自定义: + +```bash +npm run release:version -- prerelease --preid beta +# 0.1.31 → 0.1.32-beta.0 + +npm run release:version -- premajor --preid alpha +# 0.1.31 → 1.0.0-alpha.0 +``` + +### 实际执行的操作 + +1. 读取 `packages/core/package.json` 中的当前版本 +2. 根据 bump 类型计算目标版本 +3. 更新 **所有** `packages/*/package.json` 的 `version` 字段(core、cli、vscode-ide-companion) +4. 删除旧的 `package-lock.json`,执行 `npm install --package-lock-only` 重新生成 + +### 完整示例 + +```bash +# 升级 patch 版本 +npm run release:version -- patch + +# 升级 minor 版本 +npm run release:version -- minor + +# 发布 beta 预发布版 +npm run release:version -- prerelease --preid beta + +# 直接指定版本 +npm run release:version -- 0.2.0 + +# 从 git tag 获取版本 +npm run release:version -- from-git +``` + +升级后检查变更,确认无误后提交: + +```bash +git diff +git add -A +git commit -m "chore(release): v0.1.32" +git tag v0.1.32 +``` + +--- + +## prepare:package — 构建并发布到 npm + +完成质量检查、构建、发布两个 npm 包,并自动创建 git commit 和 tag。 + +### 基本用法 + +```bash +npm run prepare:package -- [options] +``` + +### 参数 + +| 参数 | 说明 | +|------|------| +| `` | **必填**,要发布的 semver 版本号 | +| `--tag ` | npm dist-tag,默认 `"latest`",常用于 `beta`、`next` | +| `--dry-run` | 预演模式,不实际执行任何写操作 | +| `--force` | 跳过 main 分支检查,允许从其他分支发布 | + +### 执行流程(9 步) + +| 步骤 | 操作 | 说明 | +|------|------|------| +| 1 | Git 检查 | 工作区必须 clean,必须在 main 分支(`--force` 可跳过分支检查) | +| 2 | npm 认证 | 检查 `npm whoami`,未登录则中止 | +| 3 | 更新版本号 | 同时更新 `packages/core` 和 `packages/cli` 的 version | +| 4 | 质量检查 | `npm run check`(typecheck + eslint + prettier) | +| 5 | 测试 | `npm run test --workspaces` | +| 6 | 构建 | `npm run build`(core tsc + cli esbuild bundle) | +| 7 | 发布 core | `npm publish --workspace=@vegamo/deepcode-core --access public` | +| 8 | 发布 cli | 将 cli 的 `@vegamo/deepcode-core` 依赖从 `file:../core` 临时改为 `^`,发布后恢复 | +| 9 | Git commit & tag | `chore(release): v` + `git tag v` | + +### 完整示例 + +```bash +# 发布正式版 +npm run prepare:package -- 0.1.32 + +# 发布 beta 版 +npm run prepare:package -- 0.1.32-beta.1 --tag beta + +# 预演(不实际发布,用于检查流程) +npm run prepare:package -- 0.1.32 --dry-run + +# 从非 main 分支发布 +npm run prepare:package -- 0.1.32 --force +``` + +### 关于 file:../core 依赖 + +CLI 包的 `@vegamo/deepcode-core` 依赖在开发时使用 `"file:../core"`(monorepo 本地链接)。发布到 npm 时,脚本会自动将其替换为 `"^"`,发布完成后恢复为 `file:../core`。这个过程对用户透明,无需手动处理。 + +### 发布后 + +脚本完成后会提示手动推送到 remote: + +```bash +git push && git push --tags +``` + +验证发布结果: + +```bash +npm view @vegamo/deepcode-cli version +npx @vegamo/deepcode-cli --version +``` + +--- + +## 典型发布流程 + +一个完整的版本发布通常按以下步骤进行: + +```bash +# 1. 确保工作区干净 +git status + +# 2. 升级版本号 +npm run release:version -- patch + +# 3. 检查变更 +git diff + +# 4. 提交版本变更 +git add -A +git commit -m "chore(release): v0.1.32" + +# 5. 构建 + 质量检查 + 发布 +npm run prepare:package -- 0.1.32 + +# 6. 推送到 remote +git push && git push --tags +``` + +也可以简化为两步(`prepare:package` 会自动 commit 和 tag): + +```bash +npm run release:version -- patch +npm run prepare:package -- 0.1.32 +git push && git push --tags +``` + +--- + +## 预发布版本流程 + +```bash +# 第一个 beta +npm run release:version -- prerelease --preid beta +# → 0.1.32-beta.0 + +git add -A && git commit -m "chore(release): v0.1.32-beta.0" +npm run prepare:package -- 0.1.32-beta.0 --tag beta + +# 后续 beta +npm run release:version -- prerelease --preid beta +# → 0.1.32-beta.1 + +git add -A && git commit -m "chore(release): v0.1.32-beta.1" +npm run prepare:package -- 0.1.32-beta.1 --tag beta + +# 正式发布 +npm run release:version -- patch +# → 0.1.32 + +git add -A && git commit -m "chore(release): v0.1.32" +npm run prepare:package -- 0.1.32 +git push && git push --tags +``` diff --git a/RELEASE_en.md b/RELEASE_en.md new file mode 100644 index 00000000..4844bf70 --- /dev/null +++ b/RELEASE_en.md @@ -0,0 +1,235 @@ +# Release + +Deep Code uses two scripts to manage version releases in the monorepo: + +| Script | Command | Purpose | +|--------|---------|---------| +| `scripts/version.js` | `npm run release:version` | Bump all workspace package versions + regenerate lockfile | +| `scripts/prepare-package.js` | `npm run prepare:package` | Build + quality checks + publish to npm + git commit & tag | + +Use them together: bump version first, then publish. + +--- + +## release:version — Version Bump + +Works like `npm version`, supporting all standard bump types. + +### Basic Usage + +```bash +npm run release:version -- [options] +``` + +> Note: npm scripts require the `--` separator to pass arguments. + +### Supported Bump Types + +| Type | Current | Result | Description | +|------|---------|--------|-------------| +| `patch` | `0.1.31` | `0.1.32` | Patch version +1 | +| `minor` | `0.1.31` | `0.2.0` | Minor version +1, patch reset | +| `major` | `0.1.31` | `1.0.0` | Major version +1, minor/patch reset | +| `prepatch` | `0.1.31` | `0.1.32-0` | Pre-release patch | +| `preminor` | `0.1.31` | `0.2.0-0` | Pre-release minor | +| `premajor` | `0.1.31` | `1.0.0-0` | Pre-release major | +| `prerelease` | `0.1.31` | `0.1.32-0` | Increment pre-release number | +| `from-git` | — | Read from latest git tag | For cases where tag exists but package.json not updated | + +You can also specify an exact version: + +```bash +npm run release:version -- 0.2.0 +``` + +### Pre-release Chain + +`prerelease` supports chained increments: + +``` +0.1.31 + → prerelease → 0.1.32-beta.0 + → prerelease → 0.1.32-beta.1 + → prerelease → 0.1.32-beta.2 + → patch → 0.1.32 (drops prerelease suffix) +``` + +### --preid Option + +Pre-release identifier, defaults to `"0"`, customizable: + +```bash +npm run release:version -- prerelease --preid beta +# 0.1.31 → 0.1.32-beta.0 + +npm run release:version -- premajor --preid alpha +# 0.1.31 → 1.0.0-alpha.0 +``` + +### What It Does + +1. Reads current version from `packages/core/package.json` +2. Calculates target version based on bump type +3. Updates `version` field in **all** `packages/*/package.json` (core, cli, vscode-ide-companion) +4. Deletes old `package-lock.json` and regenerates via `npm install --package-lock-only` + +### Examples + +```bash +# Bump patch +npm run release:version -- patch + +# Bump minor +npm run release:version -- minor + +# Beta pre-release +npm run release:version -- prerelease --preid beta + +# Exact version +npm run release:version -- 0.2.0 + +# From git tag +npm run release:version -- from-git +``` + +After bumping, review changes and commit: + +```bash +git diff +git add -A +git commit -m "chore(release): v0.1.32" +git tag v0.1.32 +``` + +--- + +## prepare:package — Build and Publish to npm + +Runs quality checks, builds, publishes both npm packages, and automatically creates a git commit with tag. + +### Basic Usage + +```bash +npm run prepare:package -- [options] +``` + +### Arguments + +| Argument | Description | +|----------|-------------| +| `` | **Required**. Semver version to publish | +| `--tag ` | npm dist-tag, default `"latest"`, commonly `beta` or `next` | +| `--dry-run` | Preview mode, no actual writes | +| `--force` | Skip main branch check, allow publishing from other branches | + +### Execution Flow (9 Steps) + +| Step | Action | Description | +|------|--------|-------------| +| 1 | Git check | Working tree must be clean, must be on main branch (`--force` skips branch check) | +| 2 | npm auth | Checks `npm whoami`, aborts if not logged in | +| 3 | Update versions | Updates `packages/core` and `packages/cli` version fields | +| 4 | Quality checks | `npm run check` (typecheck + eslint + prettier) | +| 5 | Tests | `npm run test --workspaces` | +| 6 | Build | `npm run build` (core tsc + cli esbuild bundle) | +| 7 | Publish core | `npm publish --workspace=@vegamo/deepcode-core --access public` | +| 8 | Publish cli | Temporarily changes cli's `@vegamo/deepcode-core` dep from `file:../core` to `^`, restores after publish | +| 9 | Git commit & tag | `chore(release): v` + `git tag v` | + +### Examples + +```bash +# Publish stable release +npm run prepare:package -- 0.1.32 + +# Publish beta +npm run prepare:package -- 0.1.32-beta.1 --tag beta + +# Dry run (no actual publish) +npm run prepare:package -- 0.1.32 --dry-run + +# Publish from non-main branch +npm run prepare:package -- 0.1.32 --force +``` + +### About the file:../core Dependency + +The CLI package uses `"file:../core"` for the `@vegamo/deepcode-core` dependency during development (monorepo local link). When publishing to npm, the script automatically replaces it with `"^"` and restores it after publishing. This is transparent — no manual handling required. + +### After Publishing + +The script prompts you to push to remote: + +```bash +git push && git push --tags +``` + +Verify the release: + +```bash +npm view @vegamo/deepcode-cli version +npx @vegamo/deepcode-cli --version +``` + +--- + +## Typical Release Flow + +A complete version release follows these steps: + +```bash +# 1. Ensure clean working tree +git status + +# 2. Bump version +npm run release:version -- patch + +# 3. Review changes +git diff + +# 4. Commit version change +git add -A +git commit -m "chore(release): v0.1.32" + +# 5. Build + quality check + publish +npm run prepare:package -- 0.1.32 + +# 6. Push to remote +git push && git push --tags +``` + +Or simplified to two steps (`prepare:package` auto-commits and tags): + +```bash +npm run release:version -- patch +npm run prepare:package -- 0.1.32 +git push && git push --tags +``` + +--- + +## Pre-release Flow + +```bash +# First beta +npm run release:version -- prerelease --preid beta +# → 0.1.32-beta.0 + +git add -A && git commit -m "chore(release): v0.1.32-beta.0" +npm run prepare:package -- 0.1.32-beta.0 --tag beta + +# Subsequent betas +npm run release:version -- prerelease --preid beta +# → 0.1.32-beta.1 + +git add -A && git commit -m "chore(release): v0.1.32-beta.1" +npm run prepare:package -- 0.1.32-beta.1 --tag beta + +# Stable release +npm run release:version -- patch +# → 0.1.32 + +git add -A && git commit -m "chore(release): v0.1.32" +npm run prepare:package -- 0.1.32 +git push && git push --tags +``` diff --git a/eslint.config.mjs b/eslint.config.mjs index 50e41491..b9ec5dc1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -43,12 +43,43 @@ export default tseslint.config( }, // Test files: relaxed rules { - files: ["src/tests/**/*.ts"], + files: ["packages/*/src/tests/**/*.ts", "packages/*/src/tests/**/*.mjs"], + languageOptions: { + globals: { + process: "readonly", + console: "readonly", + }, + }, rules: { "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-unused-vars": "off", }, }, + // Script files: Node.js environment + { + files: ["./scripts/**/*.js", "./scripts/**/*.mjs", "packages/*/scripts/**/*.js"], + languageOptions: { + globals: { + process: "readonly", + console: "readonly", + }, + }, + }, + // Browser resources: VSCode webview scripts + { + files: ["packages/*/resources/**/*.js"], + languageOptions: { + globals: { + window: "readonly", + document: "readonly", + console: "readonly", + FileReader: "readonly", + Blob: "readonly", + URL: "readonly", + fetch: "readonly", + }, + }, + }, // Prettier config: disable conflicting ESLint rules, MUST be last - prettierConfig, + prettierConfig ); diff --git a/package-lock.json b/package-lock.json index 8db59638..e36f1926 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,29 +1,14 @@ { - "name": "@vegamo/deepcode-cli", - "version": "0.1.31", + "name": "@vegamo/deepcode", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@vegamo/deepcode-cli", - "version": "0.1.31", + "name": "@vegamo/deepcode", "license": "MIT", - "dependencies": { - "chalk": "^5.6.2", - "ejs": "^5.0.2", - "gradient-string": "^3.0.0", - "gray-matter": "^4.0.3", - "ignore": "^7.0.5", - "ink": "^7.0.4", - "ink-gradient": "^4.0.1", - "openai": "^6.35.0", - "react": "^19.2.5", - "undici": "^7.25.0", - "zod": "^4.4.3" - }, - "bin": { - "deepcode": "dist/cli.js" - }, + "workspaces": [ + "packages/*" + ], "devDependencies": { "@eslint/js": "^9.39.4", "@types/ejs": "^3.1.5", @@ -40,14 +25,11 @@ "tsx": "^4.21.0", "typescript": "^6.0.3", "typescript-eslint": "^8.59.2" - }, - "engines": { - "node": ">=22" } }, "node_modules/@alcalzone/ansi-tokenize": { "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.3.0.tgz", "integrity": "sha512-p+CMKJ93HFmLkjXKlXiVGlMQEuRb6H0MokBSwUsX+S6BRX8eV5naFZpQJFfJHjRZY0Hmnqy1/r6UWl3x+19zYA==", "license": "MIT", "dependencies": { @@ -58,14 +40,211 @@ "node": ">=18" } }, + "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", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@azu/format-text": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", + "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@azu/style-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", + "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "@azu/format-text": "^1.0.1" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.2.tgz", + "integrity": "sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz", + "integrity": "sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", + "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^5.1.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.14.0.tgz", + "integrity": "sha512-Dfl7hPZe9/JJwRhFFXHq2z1oHYBuGubmff3kWXOsd1AGgyXlqjNYAWuN/1JL/ZrcZBs8TKMjGSil6Rcc7E8VPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.9.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.9.0.tgz", + "integrity": "sha512-1MWGjqgUCRAYgLmVFZKp7fs3Rg1TFvIMgywY8ze2olNVvLlJoRThuoziWSDJuwwyJI5L4rnLb9Tyt5D9GvSLPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.2.5.tgz", + "integrity": "sha512-RUuewWk9JvWJS5Yiy8/74Lm1rQAWlrU/qg/Bgtk1jIauVRtnb9XKwS5Xg0J+Whwjesq9EVrBIFgQEP8vHxgezA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.9.0", + "jsonwebtoken": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -74,9 +253,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -84,21 +263,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -115,14 +294,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -132,14 +311,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -149,9 +328,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -159,29 +338,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -191,9 +370,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -201,9 +380,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -211,9 +390,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -221,27 +400,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -251,33 +430,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -285,14 +464,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -742,7 +921,7 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", @@ -761,7 +940,7 @@ }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", @@ -774,7 +953,7 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", @@ -784,7 +963,7 @@ }, "node_modules/@eslint/config-array": { "version": "0.21.2", - "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.21.2.tgz", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", @@ -799,7 +978,7 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", @@ -812,7 +991,7 @@ }, "node_modules/@eslint/core": { "version": "0.17.0", - "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.17.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", @@ -825,7 +1004,7 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.5", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", @@ -847,39 +1026,9 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/js": { "version": "9.39.4", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.39.4.tgz", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", @@ -892,7 +1041,7 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", - "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", @@ -902,7 +1051,7 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", @@ -916,7 +1065,7 @@ }, "node_modules/@humanfs/core": { "version": "0.19.2", - "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.2.tgz", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", @@ -929,7 +1078,7 @@ }, "node_modules/@humanfs/node": { "version": "0.16.8", - "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.8.tgz", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", @@ -944,7 +1093,7 @@ }, "node_modules/@humanfs/types": { "version": "0.15.0", - "resolved": "https://registry.npmmirror.com/@humanfs/types/-/types-0.15.0.tgz", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, "license": "Apache-2.0", @@ -954,7 +1103,7 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", @@ -968,7 +1117,7 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", @@ -982,7 +1131,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", @@ -993,7 +1142,7 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", @@ -1004,7 +1153,7 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", @@ -1014,14 +1163,14 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", @@ -1030,204 +1179,747 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmmirror.com/@types/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/gradient-string": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/@types/gradient-string/-/gradient-string-1.1.6.tgz", - "integrity": "sha512-LkaYxluY4G5wR1M4AKQUal2q61Di1yVVCw42ImFTuaIoQVgmV0WP1xUaLB8zwb47mp82vWTpePI9JmrjEnJ7nQ==", "license": "MIT", "dependencies": { - "@types/tinycolor2": "*" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "node_modules/@types/node": { - "version": "25.6.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.6.0.tgz", - "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.19.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "devOptional": true, + "node_modules/@secretlint/config-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", + "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", + "dev": true, "license": "MIT", "dependencies": { - "csstype": "^3.2.2" + "@secretlint/types": "^10.2.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@types/tinycolor2": { - "version": "1.4.6", - "resolved": "https://registry.npmmirror.com/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", - "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", - "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==", + "node_modules/@secretlint/config-loader": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", + "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/type-utils": "8.59.2", - "@typescript-eslint/utils": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" + "@secretlint/profiler": "^10.2.2", + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "ajv": "^8.17.1", + "debug": "^4.4.1", + "rc-config-loader": "^4.1.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.59.2", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">=20.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.59.2.tgz", - "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", + "node_modules/@secretlint/config-loader/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "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": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", - "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", + "node_modules/@secretlint/config-loader/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", + "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.2", - "@typescript-eslint/types": "^8.59.2", - "debug": "^4.4.3" + "@secretlint/profiler": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "structured-source": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "node": ">=20.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", - "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", + "node_modules/@secretlint/formatter": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", + "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2" + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "@textlint/linter-formatter": "^15.2.0", + "@textlint/module-interop": "^15.2.0", + "@textlint/types": "^15.2.0", + "chalk": "^5.4.1", + "debug": "^4.4.1", + "pluralize": "^8.0.0", + "strip-ansi": "^7.1.0", + "table": "^6.9.0", + "terminal-link": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.0.0" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", - "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", + "node_modules/@secretlint/formatter/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==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz", - "integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==", + "node_modules/@secretlint/node": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", + "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/utils": "8.59.2", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" + "@secretlint/config-loader": "^10.2.2", + "@secretlint/core": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "@secretlint/source-creator": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "p-map": "^7.0.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">=20.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.59.2.tgz", - "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", + "node_modules/@secretlint/profiler": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", + "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/resolver": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", + "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/secretlint-formatter-sarif": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", + "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-sarif-builder": "^3.2.0" + } + }, + "node_modules/@secretlint/secretlint-rule-no-dotenv": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", + "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/secretlint-rule-preset-recommend": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", + "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/source-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", + "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.2", + "istextorbinary": "^9.5.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/types": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", + "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@textlint/ast-node-types": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.7.1.tgz", + "integrity": "sha512-Wii5UgUKFEh9Uv6wbq1zr4/Kf+dtjiUuzPrrXzKp8H+ifkvKNzi23V4Nz+6wVyHQn5T28AFuc8VH8OtzvGYecA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.7.1.tgz", + "integrity": "sha512-TdwZ/debWYFD05K3CcoHtwvnCrza29wZxD+BjDTk/V5N7iRqkK1dTTHSD4A8AIgROLiDkHJmIKQbasbmsg8AvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "15.7.1", + "@textlint/resolver": "15.7.1", + "@textlint/types": "15.7.1", + "chalk": "^4.1.2", + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "lodash": "^4.18.1", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.9.0", + "text-table": "^0.2.0" + } + }, + "node_modules/@textlint/linter-formatter/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@textlint/linter-formatter/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, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@textlint/linter-formatter/node_modules/pluralize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", + "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter/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, + "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/@textlint/linter-formatter/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@textlint/module-interop": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.7.1.tgz", + "integrity": "sha512-Jg+sQW2L/cRJypk59wtcMUVVpt8vmit5ZMT3gUnFwevP3A6Qp1HfOtUy9ObT4hBX3lOSGT/ekcCDxR1pL7uH1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/resolver": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.7.1.tgz", + "integrity": "sha512-8XnO0pgF6mXnm41VvWmBbEIdGPhiCUt31uLZkOis1ECeg/1SoUcIT6Mx/F0e1rukq8l0UlOSeY9a31CsvRMK0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/types": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.7.1.tgz", + "integrity": "sha512-Vye/GmFNBTgVzZFtIFJTmLB+s2A7oIADxNG6r9UhfPuY+Czv0z5G3xeyFZZudPlfxURsKUyPIU5XsjOFqVp33A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "15.7.1" + } + }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/gradient-string": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz", + "integrity": "sha512-LkaYxluY4G5wR1M4AKQUal2q61Di1yVVCw42ImFTuaIoQVgmV0WP1xUaLB8zwb47mp82vWTpePI9JmrjEnJ7nQ==", + "license": "MIT", + "dependencies": { + "@types/tinycolor2": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz", + "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tinycolor2": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", + "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", + "license": "MIT" + }, + "node_modules/@types/vscode": { + "version": "1.125.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.125.0.tgz", + "integrity": "sha512-0icm/ZQAaism87P0ekHqi4/Ju9du+Tm0RUW+y7vqRsxY2cY0FNRX1nAnaW7nT6npPt2tfHiheZ55Zm9UhqonFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", + "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/type-utils": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.61.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", + "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", + "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.61.1", + "@typescript-eslint/types": "^8.61.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", + "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", + "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", + "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", + "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", + "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.61.1", + "@typescript-eslint/tsconfig-utils": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", + "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", + "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.1", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1236,37 +1928,237 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", - "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz", + "integrity": "sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@vegamo/deepcode-cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/@vegamo/deepcode-core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@vscode/vsce": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.9.2.tgz", + "integrity": "sha512-XSxMosEEDO6vLxELAHVkwmhC0qe0ijZni2jB9Rcs8kQsW4lhTDQ/wMzmwFs/buotAWSnpmUp/dRWD2ufG3UYKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/identity": "^4.1.0", + "@secretlint/node": "^10.1.2", + "@secretlint/secretlint-formatter-sarif": "^10.1.2", + "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", + "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.9", + "cockatiel": "^3.1.2", + "commander": "^12.1.0", + "form-data": "^4.0.0", + "glob": "^13.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^14.1.0", + "mime": "^1.3.4", + "minimatch": "^10.2.2", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "secretlint": "^10.1.2", + "semver": "^7.5.2", + "tmp": "^0.2.3", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^3.2.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce-sign": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", + "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", + "dev": true, + "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.6", + "@vscode/vsce-sign-alpine-x64": "2.0.6", + "@vscode/vsce-sign-darwin-arm64": "2.0.6", + "@vscode/vsce-sign-darwin-x64": "2.0.6", + "@vscode/vsce-sign-linux-arm": "2.0.6", + "@vscode/vsce-sign-linux-arm64": "2.0.6", + "@vscode/vsce-sign-linux-x64": "2.0.6", + "@vscode/vsce-sign-win32-arm64": "2.0.6", + "@vscode/vsce-sign-win32-x64": "2.0.6" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", + "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", + "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", + "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", + "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", + "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", + "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", + "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.2", - "@typescript-eslint/tsconfig-utils": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", + "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce/node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", @@ -1274,9 +2166,9 @@ "node": "18 || 20 || >=22" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "node_modules/@vscode/vsce/node_modules/brace-expansion": { "version": "5.0.6", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", @@ -1287,9 +2179,9 @@ "node": "18 || 20 || >=22" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "node_modules/@vscode/vsce/node_modules/minimatch": { "version": "10.2.5", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", @@ -1303,10 +2195,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "node_modules/@vscode/vsce/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -1316,65 +2208,10 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.59.2.tgz", - "integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", - "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.2", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -1386,7 +2223,7 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", @@ -1394,9 +2231,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.15.0", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", @@ -1413,7 +2260,7 @@ }, "node_modules/ansi-escapes": { "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", "dependencies": { @@ -1428,7 +2275,7 @@ }, "node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { @@ -1439,29 +2286,47 @@ } }, "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">=8" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/auto-bind": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/auto-bind/-/auto-bind-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "license": "MIT", "engines": { @@ -1471,17 +2336,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dev": true, + "license": "MIT", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, + "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==", + "dev": 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", + "optional": true + }, "node_modules/baseline-browser-mapping": { - "version": "2.10.29", - "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", - "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1491,10 +2389,53 @@ "node": ">=6.0.0" } }, + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -1502,9 +2443,22 @@ "concat-map": "0.0.1" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.28.2", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.2.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ @@ -1536,9 +2490,99 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": 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", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", @@ -1547,9 +2591,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001792", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "dev": true, "funding": [ { @@ -1568,20 +2612,77 @@ "license": "CC-BY-4.0" }, "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "dev": true, + "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.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.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==", + "dev": true, + "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/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/cli-boxes": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-4.0.1.tgz", "integrity": "sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==", "license": "MIT", "engines": { @@ -1593,7 +2694,7 @@ }, "node_modules/cli-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "license": "MIT", "dependencies": { @@ -1608,7 +2709,7 @@ }, "node_modules/cli-truncate": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.0.0.tgz", "integrity": "sha512-3+YKIUFsohD9MIoOFPFBldjAlnfCmCDcqe6aYGFqlDTRKg80p4wg35L+j83QQ63iOlKRccEkbn8IuM++HsgEjA==", "license": "MIT", "dependencies": { @@ -1622,9 +2723,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cockatiel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/code-excerpt": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/code-excerpt/-/code-excerpt-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "license": "MIT", "dependencies": { @@ -1636,7 +2747,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", @@ -1649,28 +2760,51 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/convert-to-spaces": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "license": "MIT", "engines": { @@ -1679,7 +2813,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", @@ -1692,16 +2826,46 @@ "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", @@ -1717,13 +2881,210 @@ } } }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, + "node_modules/deepcode-vscode": { + "resolved": "packages/vscode-ide-companion", + "link": true + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "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/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "version-range": "^4.15.0" + }, + "engines": { + "ecmascript": ">= es5", + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/ejs": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.2.tgz", @@ -1737,22 +3098,59 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.353", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.353.tgz", - "integrity": "sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==", + "version": "1.5.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz", + "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, + "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==", + "dev": true, + "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/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "once": "^1.4.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/environment": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "license": "MIT", "engines": { @@ -1762,10 +3160,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "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==", + "dev": true, + "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/es-toolkit": { - "version": "1.46.1", - "resolved": "https://registry.npmmirror.com/es-toolkit/-/es-toolkit-1.46.1.tgz", - "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.1.tgz", + "integrity": "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q==", "license": "MIT", "workspaces": [ "docs", @@ -1816,7 +3263,7 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", @@ -1825,17 +3272,21 @@ } }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "9.39.4", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.39.4.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", @@ -1895,7 +3346,7 @@ }, "node_modules/eslint-config-prettier": { "version": "10.1.8", - "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", @@ -1911,7 +3362,7 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, "license": "MIT", @@ -1929,95 +3380,39 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmmirror.com/espree/-/espree-10.4.0.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", @@ -2035,7 +3430,7 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { @@ -2048,7 +3443,7 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", @@ -2061,7 +3456,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", @@ -2074,7 +3469,7 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", @@ -2084,7 +3479,7 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", @@ -2094,14 +3489,25 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true, "license": "MIT" }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "license": "(MIT OR WTFPL)", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "license": "MIT", "dependencies": { @@ -2113,28 +3519,85 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", @@ -2152,7 +3615,7 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", @@ -2163,9 +3626,22 @@ "node": ">=16.0.0" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", @@ -2182,7 +3658,7 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", @@ -2196,14 +3672,54 @@ }, "node_modules/flatted": { "version": "3.4.2", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -2216,9 +3732,19 @@ "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", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", @@ -2227,9 +3753,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "license": "MIT", "engines": { "node": ">=18" @@ -2238,9 +3764,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "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-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/glob": { "version": "13.0.6", - "resolved": "https://registry.npmmirror.com/glob/-/glob-13.0.6.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", @@ -2258,7 +3831,7 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", @@ -2271,7 +3844,7 @@ }, "node_modules/glob/node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", @@ -2281,7 +3854,7 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "5.0.6", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", @@ -2294,7 +3867,7 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "10.2.5", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", @@ -2310,7 +3883,7 @@ }, "node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", @@ -2321,64 +3894,285 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gradient-string": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/gradient-string/-/gradient-string-3.0.0.tgz", - "integrity": "sha512-frdKI4Qi8Ihp4C6wZNB565de/THpIaw3DjP5ku87M+N9rNSGmPTjfkq61SdRXB7eCaL8O1hkKDvf6CDMtOzIAg==", - "license": "MIT", + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/gradient-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-3.0.0.tgz", + "integrity": "sha512-frdKI4Qi8Ihp4C6wZNB565de/THpIaw3DjP5ku87M+N9rNSGmPTjfkq61SdRXB7eCaL8O1hkKDvf6CDMtOzIAg==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "tinygradient": "^1.1.5" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gradient-string/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://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/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/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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, + "license": "MIT", + "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==", + "dev": true, + "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==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", "dependencies": { - "chalk": "^5.3.0", - "tinygradient": "^1.1.5" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">=14" + "node": ">=10" } }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" } }, - "node_modules/has-flag": { + "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, + "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.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "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==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "hermes-estree": "0.25.1" + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmmirror.com/husky/-/husky-9.1.7.tgz", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", @@ -2392,10 +4186,46 @@ "url": "https://github.com/sponsors/typicode" } }, + "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==", + "dev": 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", + "optional": true + }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -2403,7 +4233,7 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", @@ -2420,7 +4250,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", @@ -2430,7 +4260,7 @@ }, "node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "license": "MIT", "engines": { @@ -2440,10 +4270,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "optional": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/ink": { - "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/ink/-/ink-7.0.4.tgz", - "integrity": "sha512-4wsM/gMKOT2ZANNTJibI6I9IcwBfobqv/CgaDcwvOaCREZIQxo3iGQS7qPHa2hmA67NYltZWCMtBDELB/mcbJQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-7.1.0.tgz", + "integrity": "sha512-VWE6/yeLtFCJBNLflyI2OSylyXK1Rc24LuXup8Qt+icwkmmycFNdbn8IkSp6Frc0h1iA0NOvvi1ajW44U/w3Qg==", "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.3.0", @@ -2491,7 +4350,7 @@ }, "node_modules/ink-gradient": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/ink-gradient/-/ink-gradient-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/ink-gradient/-/ink-gradient-4.0.1.tgz", "integrity": "sha512-0ckdiM84zkfCdnTtcnq4BS3egIhUPPDoCqSx/7NUFsAVooBbdRuGnnWpk0fuaOTqU6rlZRh9F4LN1UI8fxd81Q==", "license": "MIT", "dependencies": { @@ -2510,9 +4369,49 @@ "react": ">=19.2.0" } }, + "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://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "license": "MIT", "engines": { @@ -2521,7 +4420,7 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", @@ -2531,7 +4430,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { @@ -2546,7 +4445,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", @@ -2559,7 +4458,7 @@ }, "node_modules/is-in-ci": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/is-in-ci/-/is-in-ci-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", "license": "MIT", "bin": { @@ -2572,28 +4471,101 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, + "node_modules/istextorbinary": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", + "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "binaryextensions": "^6.11.0", + "editions": "^6.21.0", + "textextensions": "^6.11.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -2601,7 +4573,7 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", @@ -2614,28 +4586,28 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", @@ -2646,9 +4618,101 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", @@ -2658,38 +4722,67 @@ }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", + "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" } }, "node_modules/lint-staged": { - "version": "17.0.4", - "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-17.0.4.tgz", - "integrity": "sha512-+rU9lSUyVOZ/hDUmRLVGzyS2v73cDdQjX+XQz1AaOdIE4RysLq0HoPW2HrrgeNCLklkhi904VBU1bmgWLHVnkA==", + "version": "17.0.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.0.7.tgz", + "integrity": "sha512-JrSobt+tW3rH8IOMi8tDZd3foorM5yPEkLD/V2NxobgHrFfHWGee4MOLVuZeScgxftEwbHrPHIFA/ZL+nUJeuA==", "dev": true, "license": "MIT", "dependencies": { "listr2": "^10.2.1", "picomatch": "^4.0.4", "string-argv": "^0.3.2", - "tinyexec": "^1.1.2" + "tinyexec": "^1.2.4" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -2701,12 +4794,12 @@ "url": "https://opencollective.com/lint-staged" }, "optionalDependencies": { - "yaml": "^2.8.4" + "yaml": "^2.9.0" } }, "node_modules/listr2": { "version": "10.2.1", - "resolved": "https://registry.npmmirror.com/listr2/-/listr2-10.2.1.tgz", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", "dev": true, "license": "MIT", @@ -2721,9 +4814,22 @@ "node": ">=22.13.0" } }, + "node_modules/listr2/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/listr2/node_modules/cli-truncate": { "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, "license": "MIT", @@ -2740,7 +4846,7 @@ }, "node_modules/listr2/node_modules/slice-ansi": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "dev": true, "license": "MIT", @@ -2757,7 +4863,7 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", @@ -2771,16 +4877,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", @@ -2798,9 +4967,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/log-update/node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", @@ -2816,7 +4998,7 @@ }, "node_modules/log-update/node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", @@ -2832,7 +5014,7 @@ }, "node_modules/log-update/node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", @@ -2849,7 +5031,7 @@ }, "node_modules/log-update/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", @@ -2862,7 +5044,7 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.2.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", @@ -2879,7 +5061,7 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", @@ -2897,7 +5079,7 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", @@ -2915,7 +5097,7 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -2923,9 +5105,125 @@ "yallist": "^3.0.2" } }, + "node_modules/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.1", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { @@ -2934,7 +5232,7 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", @@ -2945,9 +5243,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", @@ -2958,9 +5270,20 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.3", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "license": "BlueOak-1.0.0", @@ -2968,50 +5291,227 @@ "node": ">=16 || 14 >=14.17" } }, + "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==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-sarif-builder": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", + "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/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, + "license": "ISC" + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "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": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, - "license": "MIT" - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/openai": { - "version": "6.35.0", - "resolved": "https://registry.npmmirror.com/openai/-/openai-6.35.0.tgz", - "integrity": "sha512-L/skwIGnt5xQZHb0UfTu9uAUKbis3ehKypOuJKi20QvG7UStV6C8IC3myGYHcdiF4kms/bAvOJ9UqqNWqi8x/Q==", + "version": "6.44.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.44.0.tgz", + "integrity": "sha512-09/gH+8jH0RgUwsgWHAaxsKGRT5zVZ95IaJUnqAWj6XejIBmnFRwq2WUIF37VtDEsmGrtPmvCs5+yBSeZGWvkA==", "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" @@ -3027,7 +5527,7 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", @@ -3045,7 +5545,7 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", @@ -3061,7 +5561,7 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", @@ -3075,9 +5575,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", @@ -3088,9 +5601,113 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/patch-console": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/patch-console/-/patch-console-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", "license": "MIT", "engines": { @@ -3099,7 +5716,7 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", @@ -3109,7 +5726,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", @@ -3119,7 +5736,7 @@ }, "node_modules/path-scurry": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", @@ -3135,25 +5752,45 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.3.6", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.3.6.tgz", - "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", @@ -3164,9 +5801,48 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", @@ -3175,9 +5851,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", "dev": true, "license": "MIT", "bin": { @@ -3190,9 +5866,21 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", @@ -3200,10 +5888,97 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": 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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-config-loader": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.4.tgz", + "integrity": "sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "json5": "^2.2.3", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { - "version": "19.2.5", - "resolved": "https://registry.npmmirror.com/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3211,7 +5986,7 @@ }, "node_modules/react-reconciler": { "version": "0.33.0", - "resolved": "https://registry.npmmirror.com/react-reconciler/-/react-reconciler-0.33.0.tgz", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", "license": "MIT", "dependencies": { @@ -3224,9 +5999,94 @@ "react": "^19.2.0" } }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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_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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", @@ -3236,7 +6096,7 @@ }, "node_modules/restore-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "license": "MIT", "dependencies": { @@ -3250,22 +6110,130 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": 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": { + "queue-microtask": "^1.2.2" + } + }, + "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/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", + "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/secretlint": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", + "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/config-creator": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/node": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "debug": "^4.4.1", + "globby": "^14.1.0", + "read-pkg": "^9.0.1" + }, + "bin": { + "secretlint": "bin/secretlint.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/section-matter": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "license": "MIT", "dependencies": { @@ -3278,7 +6246,7 @@ }, "node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", @@ -3288,7 +6256,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", @@ -3301,7 +6269,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", @@ -3309,15 +6277,153 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "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/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "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/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": { + "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/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": 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", + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": 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", + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/slice-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-9.0.0.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-9.0.0.tgz", "integrity": "sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==", "license": "MIT", "dependencies": { @@ -3331,15 +6437,63 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "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": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "license": "MIT", "dependencies": { @@ -3349,9 +6503,29 @@ "node": ">=10" } }, + "node_modules/stack-utils/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", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", @@ -3361,7 +6535,7 @@ }, "node_modules/string-width": { "version": "8.2.1", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-8.2.1.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "license": "MIT", "dependencies": { @@ -3377,7 +6551,7 @@ }, "node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { @@ -3392,7 +6566,7 @@ }, "node_modules/strip-bom-string": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "license": "MIT", "engines": { @@ -3401,37 +6575,227 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/structured-source": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boundary": "^2.0.0" + } + }, + "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": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "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/table/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/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, + "license": "MIT" + }, + "node_modules/table/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/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, + "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/table/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "has-flag": "^4.0.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "node_modules/terminal-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", + "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", + "dev": true, "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^3.2.0" + }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3439,7 +6803,7 @@ }, "node_modules/terminal-size": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/terminal-size/-/terminal-size-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz", "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==", "license": "MIT", "engines": { @@ -3449,16 +6813,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, "license": "MIT", "engines": { @@ -3466,9 +6853,9 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -3484,7 +6871,7 @@ }, "node_modules/tinygradient": { "version": "1.1.5", - "resolved": "https://registry.npmmirror.com/tinygradient/-/tinygradient-1.1.5.tgz", + "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz", "integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==", "license": "MIT", "dependencies": { @@ -3492,9 +6879,32 @@ "tinycolor2": "^1.0.0" } }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", @@ -3505,6 +6915,13 @@ "typescript": ">=4.8.4" } }, + "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==", + "dev": true, + "license": "0BSD" + }, "node_modules/tsx": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", @@ -3524,9 +6941,33 @@ "fsevents": "~2.3.3" } }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", @@ -3538,9 +6979,9 @@ } }, "node_modules/type-fest": { - "version": "5.6.0", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-5.6.0.tgz", - "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", + "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -3552,9 +6993,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "node_modules/typescript": { "version": "6.0.3", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-6.0.3.tgz", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", @@ -3567,16 +7020,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.2", - "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.59.2.tgz", - "integrity": "sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", + "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.2", - "@typescript-eslint/parser": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/utils": "8.59.2" + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3590,25 +7043,61 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/undici": { - "version": "7.25.0", - "resolved": "https://registry.npmmirror.com/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ @@ -3639,7 +7128,7 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", @@ -3647,9 +7136,72 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "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==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", + "dev": true, + "license": "Artistic-2.0", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", @@ -3665,7 +7217,7 @@ }, "node_modules/widest-line": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/widest-line/-/widest-line-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-6.0.0.tgz", "integrity": "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==", "license": "MIT", "dependencies": { @@ -3680,7 +7232,7 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", @@ -3690,7 +7242,7 @@ }, "node_modules/wrap-ansi": { "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-10.0.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", "integrity": "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==", "license": "MIT", "dependencies": { @@ -3705,6 +7257,26 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-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": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "ISC", + "optional": true + }, "node_modules/ws": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", @@ -3726,17 +7298,57 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.4", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.4.tgz", - "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "optional": true, @@ -3750,9 +7362,32 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yauzl": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", @@ -3765,13 +7400,13 @@ }, "node_modules/yoga-layout": { "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/yoga-layout/-/yoga-layout-3.2.1.tgz", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", "license": "MIT" }, "node_modules/zod": { "version": "4.4.3", - "resolved": "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { @@ -3780,7 +7415,7 @@ }, "node_modules/zod-validation-error": { "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", @@ -3790,6 +7425,99 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } + }, + "packages/cli": { + "name": "@vegamo/deepcode-cli", + "version": "0.1.31", + "license": "MIT", + "dependencies": { + "@vegamo/deepcode-core": "file:../core", + "chalk": "^5.6.2", + "gradient-string": "^3.0.0", + "ignore": "^7.0.5", + "ink": "^7.0.4", + "ink-gradient": "^4.0.1", + "react": "^19.2.5" + }, + "bin": { + "deepcode": "dist/cli.js" + }, + "engines": { + "node": ">=22" + } + }, + "packages/cli/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://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/cli/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/core": { + "name": "@vegamo/deepcode-core", + "version": "0.1.31", + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "ejs": "^5.0.2", + "gray-matter": "^4.0.3", + "ignore": "^7.0.5", + "openai": "^6.35.0", + "undici": "^7.25.0", + "zod": "^4.4.3" + } + }, + "packages/core/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://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/core/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/vscode-ide-companion": { + "name": "deepcode-vscode", + "version": "0.1.22", + "license": "MIT", + "dependencies": { + "@vegamo/deepcode-core": "file:../core", + "markdown-it": "^14.2.0" + }, + "devDependencies": { + "@types/markdown-it": "^14.1.1", + "@types/vscode": "^1.85.0", + "@vscode/vsce": "^3.6.0" + }, + "engines": { + "vscode": "^1.85.0" + } } } } diff --git a/package.json b/package.json index d1165f4e..165ccfdb 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,34 @@ { - "name": "@vegamo/deepcode-cli", - "version": "0.1.31", - "description": "Deep Code CLI - Vibe coding for the deepseek-v4 model in your terminal", + "name": "@vegamo/deepcode", + "description": "Deep Code — CLI, core library, and VSCode companion", "license": "MIT", + "packageManager": "npm@10.9.4", "type": "module", + "workspaces": [ + "packages/*" + ], "repository": { "type": "git", - "url": "https://github.com/lessweb/deepcode-cli.git" - }, - "homepage": "https://deepcode.vegamo.cn", - "bin": { - "deepcode": "./dist/cli.js" - }, - "main": "./dist/cli.js", - "files": [ - "dist/cli.js", - "dist/bundled/**", - "templates/tools/**", - "templates/prompts/**", - "templates/skills/**", - "README.md", - "LICENSE" - ], - "engines": { - "node": ">=22" + "url": "git+https://github.com/lessweb/deepcode-cli.git" }, "scripts": { - "typecheck": "tsc -p ./ --noEmit", - "bundle": "esbuild ./src/cli.tsx --bundle --platform=node --format=esm --target=node18 --outfile=dist/cli.js --banner:js=\"#!/usr/bin/env node\" --jsx=automatic --jsx-import-source=react --packages=external --log-override:empty-import-meta=silent && node scripts/copy_bundle_assets.js", - "lint": "eslint src/", - "lint:fix": "eslint src/ --fix", - "format": "prettier --write 'src/**/*.{ts,tsx}'", - "format:check": "prettier --check 'src/**/*.{ts,tsx}'", + "typecheck": "npm run typecheck --workspaces --if-present", + "generate": "node scripts/generate-git-commit-info.js", + "bundle": "npm run generate && node scripts/esbuild.config.js && node scripts/copy-bundle-assets.js", + "lint": "eslint \"packages/*/src/**/*.{ts,tsx}\" \"scripts/*.js\"", + "lint:fix": "eslint \"packages/*/src/**/*.{ts,tsx}\" \"scripts/*.js\" --fix", + "format": "prettier --write \"packages/*/src/**/*.{ts,tsx}\" \"scripts/*.js\"", + "format:check": "prettier --check \"packages/*/src/**/*.{ts,tsx}\" \"scripts/*.js\"", "check": "npm run typecheck && npm run lint && npm run format:check", - "build": "npm run check && npm run bundle && node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"", - "test": "node src/tests/run-tests.mjs", - "test:single": "tsx --test", - "prepack": "npm run build", - "prepare": "husky" - }, - "dependencies": { - "chalk": "^5.6.2", - "ejs": "^5.0.2", - "gradient-string": "^3.0.0", - "gray-matter": "^4.0.3", - "ignore": "^7.0.5", - "ink": "^7.0.4", - "ink-gradient": "^4.0.1", - "openai": "^6.35.0", - "react": "^19.2.5", - "undici": "^7.25.0", - "zod": "^4.4.3" + "clean": "node scripts/clean.js", + "build": "node scripts/build.js", + "build:vscode": "node scripts/build-vscode-companion.js", + "start": "node scripts/start.js", + "build-and-start": "npm run build && npm run start", + "test": "npm run test --workspaces --if-present", + "release:version": "node scripts/version.js", + "prepare:package": "node scripts/prepare-package.js", + "prepare": "husky && npm run build && npm run bundle" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 00000000..654038ee --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,42 @@ +{ + "name": "@vegamo/deepcode-cli", + "version": "0.1.31", + "description": "Deep Code CLI - Vibe coding for the deepseek-v4 model in your terminal", + "license": "MIT", + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/lessweb/deepcode-cli.git" + }, + "homepage": "https://deepcode.vegamo.cn", + "bin": { + "deepcode": "./dist/cli.js" + }, + "main": "./dist/cli.js", + "files": [ + "dist/cli.js", + "dist/bundled/**", + "README.md", + "LICENSE" + ], + "engines": { + "node": ">=22" + }, + "scripts": { + "typecheck": "tsc -p ./ --noEmit", + "bundle": "node ../../scripts/esbuild.config.js", + "build": "npm run typecheck && npm run bundle && node ../../scripts/copy-bundle-assets.js && node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"", + "prepublishOnly": "npm run build", + "format": "prettier --write .", + "test": "node src/tests/run-tests.mjs" + }, + "dependencies": { + "@vegamo/deepcode-core": "file:../core", + "chalk": "^5.6.2", + "gradient-string": "^3.0.0", + "ignore": "^7.0.5", + "ink": "^7.0.4", + "ink-gradient": "^4.0.1", + "react": "^19.2.5" + } +} diff --git a/src/cli.tsx b/packages/cli/src/cli.tsx similarity index 98% rename from src/cli.tsx rename to packages/cli/src/cli.tsx index 6da6505d..c595916b 100644 --- a/src/cli.tsx +++ b/packages/cli/src/cli.tsx @@ -1,6 +1,6 @@ import React from "react"; import { render } from "ink"; -import { setShellIfWindows } from "./common/shell-utils"; +import { setShellIfWindows } from "@vegamo/deepcode-core"; import { checkForNpmUpdate, promptForPendingUpdate, type PackageInfo } from "./common/update-check"; import { AppContainer } from "./ui"; diff --git a/src/common/update-check.ts b/packages/cli/src/common/update-check.ts similarity index 99% rename from src/common/update-check.ts rename to packages/cli/src/common/update-check.ts index 2d27c7a6..7a4710be 100644 --- a/src/common/update-check.ts +++ b/packages/cli/src/common/update-check.ts @@ -5,7 +5,7 @@ import * as os from "os"; import * as path from "path"; import { render, type Instance } from "ink"; import { UpdatePrompt, type UpdatePromptChoice } from "../ui"; -import { killProcessTree } from "./process-tree"; +import { killProcessTree } from "@vegamo/deepcode-core"; export type PackageInfo = { name: string; diff --git a/src/tests/ask-user-question.test.ts b/packages/cli/src/tests/ask-user-question.test.ts similarity index 98% rename from src/tests/ask-user-question.test.ts rename to packages/cli/src/tests/ask-user-question.test.ts index f7543512..7b4f387e 100644 --- a/src/tests/ask-user-question.test.ts +++ b/packages/cli/src/tests/ask-user-question.test.ts @@ -1,7 +1,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import { findPendingAskUserQuestion, formatAskUserQuestionAnswers, formatAskUserQuestionDecline } from "../ui"; -import type { SessionMessage } from "../session"; +import type { SessionMessage } from "@vegamo/deepcode-core"; function message(content: unknown): SessionMessage { const now = "2026-04-29T00:00:00.000Z"; diff --git a/src/tests/clipboard.test.ts b/packages/cli/src/tests/clipboard.test.ts similarity index 100% rename from src/tests/clipboard.test.ts rename to packages/cli/src/tests/clipboard.test.ts diff --git a/src/tests/dropdown-menu.test.ts b/packages/cli/src/tests/dropdown-menu.test.ts similarity index 100% rename from src/tests/dropdown-menu.test.ts rename to packages/cli/src/tests/dropdown-menu.test.ts diff --git a/src/tests/exit-summary.test.ts b/packages/cli/src/tests/exit-summary.test.ts similarity index 97% rename from src/tests/exit-summary.test.ts rename to packages/cli/src/tests/exit-summary.test.ts index 5ea4b579..e0d481db 100644 --- a/src/tests/exit-summary.test.ts +++ b/packages/cli/src/tests/exit-summary.test.ts @@ -1,7 +1,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import { buildExitSummaryText } from "../ui"; -import type { ModelUsage, SessionEntry } from "../session"; +import type { ModelUsage, SessionEntry } from "@vegamo/deepcode-core"; const stripAnsi = (text: string): string => text.replace(/\u001b\[[0-9;]*m/g, ""); diff --git a/src/tests/file-mentions.test.ts b/packages/cli/src/tests/file-mentions.test.ts similarity index 100% rename from src/tests/file-mentions.test.ts rename to packages/cli/src/tests/file-mentions.test.ts diff --git a/src/tests/loading-text.test.ts b/packages/cli/src/tests/loading-text.test.ts similarity index 100% rename from src/tests/loading-text.test.ts rename to packages/cli/src/tests/loading-text.test.ts diff --git a/src/tests/markdown.test.ts b/packages/cli/src/tests/markdown.test.ts similarity index 100% rename from src/tests/markdown.test.ts rename to packages/cli/src/tests/markdown.test.ts diff --git a/src/tests/message-view.test.ts b/packages/cli/src/tests/message-view.test.ts similarity index 99% rename from src/tests/message-view.test.ts rename to packages/cli/src/tests/message-view.test.ts index ff497707..fbd2b097 100644 --- a/src/tests/message-view.test.ts +++ b/packages/cli/src/tests/message-view.test.ts @@ -13,7 +13,7 @@ import { parseToolPayload, } from "../ui/components/MessageView/utils"; import { RawMode } from "../ui/contexts"; -import type { SessionMessage } from "../session"; +import type { SessionMessage } from "@vegamo/deepcode-core"; import type { ToolSummary } from "../ui/components/MessageView/types"; test("parseDiffPreview removes headers and classifies lines", () => { diff --git a/src/tests/permission-prompt.test.ts b/packages/cli/src/tests/permission-prompt.test.ts similarity index 100% rename from src/tests/permission-prompt.test.ts rename to packages/cli/src/tests/permission-prompt.test.ts diff --git a/src/tests/prompt-buffer.test.ts b/packages/cli/src/tests/prompt-buffer.test.ts similarity index 100% rename from src/tests/prompt-buffer.test.ts rename to packages/cli/src/tests/prompt-buffer.test.ts diff --git a/src/tests/prompt-input-keys.test.ts b/packages/cli/src/tests/prompt-input-keys.test.ts similarity index 99% rename from src/tests/prompt-input-keys.test.ts rename to packages/cli/src/tests/prompt-input-keys.test.ts index bcad3395..0c5773cf 100644 --- a/src/tests/prompt-input-keys.test.ts +++ b/packages/cli/src/tests/prompt-input-keys.test.ts @@ -28,7 +28,7 @@ import { insertText, backspace, } from "../ui"; -import type { SessionMessage, SkillInfo } from "../session"; +import type { SessionMessage, SkillInfo } from "@vegamo/deepcode-core"; import { dispatchTerminalInput, parseTerminalInput } from "../ui/hooks"; function collectDispatchedInput(data: string) { diff --git a/src/tests/prompt-undo-redo.test.ts b/packages/cli/src/tests/prompt-undo-redo.test.ts similarity index 100% rename from src/tests/prompt-undo-redo.test.ts rename to packages/cli/src/tests/prompt-undo-redo.test.ts diff --git a/packages/cli/src/tests/run-tests.mjs b/packages/cli/src/tests/run-tests.mjs new file mode 100644 index 00000000..87748b2d --- /dev/null +++ b/packages/cli/src/tests/run-tests.mjs @@ -0,0 +1,15 @@ +// Test runner for @vegamo/deepcode-cli +import { globSync } from "glob"; +import { spawnSync } from "child_process"; +import { fileURLToPath } from "url"; +import * as path from "path"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const testFiles = globSync("*.test.ts", { cwd: __dirname }); + +const result = spawnSync(process.execPath, ["--import", "tsx", "--test", ...testFiles], { + stdio: "inherit", + cwd: __dirname, +}); + +process.exit(result.status ?? 1); diff --git a/src/tests/session-list.test.ts b/packages/cli/src/tests/session-list.test.ts similarity index 98% rename from src/tests/session-list.test.ts rename to packages/cli/src/tests/session-list.test.ts index 6fe41c70..654b4152 100644 --- a/src/tests/session-list.test.ts +++ b/packages/cli/src/tests/session-list.test.ts @@ -1,7 +1,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import { formatSessionTitle, filterSessions, formatSessionStatus } from "../ui"; -import type { SessionEntry } from "../session"; +import type { SessionEntry } from "@vegamo/deepcode-core"; test("formatSessionTitle replaces newlines with spaces", () => { assert.equal(formatSessionTitle("first line\nsecond line\r\nthird"), "first line second line third"); diff --git a/src/tests/slash-commands.test.ts b/packages/cli/src/tests/slash-commands.test.ts similarity index 98% rename from src/tests/slash-commands.test.ts rename to packages/cli/src/tests/slash-commands.test.ts index 30d77eeb..420e5a48 100644 --- a/src/tests/slash-commands.test.ts +++ b/packages/cli/src/tests/slash-commands.test.ts @@ -7,7 +7,7 @@ import { formatSlashCommandDescription, formatSlashCommandLabel, } from "../ui"; -import type { SkillInfo } from "../session"; +import type { SkillInfo } from "@vegamo/deepcode-core"; const skills: SkillInfo[] = [ { name: "skill-writer", path: "~/.agents/skills/skill-writer/SKILL.md", description: "Write a SKILL.md" }, diff --git a/src/tests/thinking-state.test.ts b/packages/cli/src/tests/thinking-state.test.ts similarity index 96% rename from src/tests/thinking-state.test.ts rename to packages/cli/src/tests/thinking-state.test.ts index 8f2a0e30..efbee883 100644 --- a/src/tests/thinking-state.test.ts +++ b/packages/cli/src/tests/thinking-state.test.ts @@ -1,7 +1,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import { findExpandedThinkingId } from "../ui"; -import type { SessionMessage } from "../session"; +import type { SessionMessage } from "@vegamo/deepcode-core"; function buildMessage( id: string, diff --git a/src/tests/update-check.test.ts b/packages/cli/src/tests/update-check.test.ts similarity index 100% rename from src/tests/update-check.test.ts rename to packages/cli/src/tests/update-check.test.ts diff --git a/src/tests/welcome-screen.test.ts b/packages/cli/src/tests/welcome-screen.test.ts similarity index 100% rename from src/tests/welcome-screen.test.ts rename to packages/cli/src/tests/welcome-screen.test.ts diff --git a/src/ui/ascii-art.ts b/packages/cli/src/ui/ascii-art.ts similarity index 100% rename from src/ui/ascii-art.ts rename to packages/cli/src/ui/ascii-art.ts diff --git a/src/ui/components/DropdownMenu/index.tsx b/packages/cli/src/ui/components/DropdownMenu/index.tsx similarity index 100% rename from src/ui/components/DropdownMenu/index.tsx rename to packages/cli/src/ui/components/DropdownMenu/index.tsx diff --git a/src/ui/components/FileMentionMenu/index.tsx b/packages/cli/src/ui/components/FileMentionMenu/index.tsx similarity index 100% rename from src/ui/components/FileMentionMenu/index.tsx rename to packages/cli/src/ui/components/FileMentionMenu/index.tsx diff --git a/src/ui/components/MessageView/index.tsx b/packages/cli/src/ui/components/MessageView/index.tsx similarity index 100% rename from src/ui/components/MessageView/index.tsx rename to packages/cli/src/ui/components/MessageView/index.tsx diff --git a/src/ui/components/MessageView/markdown.ts b/packages/cli/src/ui/components/MessageView/markdown.ts similarity index 100% rename from src/ui/components/MessageView/markdown.ts rename to packages/cli/src/ui/components/MessageView/markdown.ts diff --git a/src/ui/components/MessageView/types.ts b/packages/cli/src/ui/components/MessageView/types.ts similarity index 84% rename from src/ui/components/MessageView/types.ts rename to packages/cli/src/ui/components/MessageView/types.ts index 743eb2dc..dc727469 100644 --- a/src/ui/components/MessageView/types.ts +++ b/packages/cli/src/ui/components/MessageView/types.ts @@ -1,4 +1,4 @@ -import type { SessionMessage } from "../../../session"; +import type { SessionMessage } from "@vegamo/deepcode-core"; export type MessageViewProps = { message: SessionMessage; diff --git a/src/ui/components/MessageView/utils.ts b/packages/cli/src/ui/components/MessageView/utils.ts similarity index 99% rename from src/ui/components/MessageView/utils.ts rename to packages/cli/src/ui/components/MessageView/utils.ts index 91ae64be..4b6158d1 100644 --- a/src/ui/components/MessageView/utils.ts +++ b/packages/cli/src/ui/components/MessageView/utils.ts @@ -1,5 +1,5 @@ import type { DiffPreviewLine, ToolSummary } from "./types"; -import type { SessionMessage } from "../../../session"; +import type { SessionMessage } from "@vegamo/deepcode-core"; import { RawMode } from "../../contexts"; import chalk from "chalk"; diff --git a/src/ui/components/ModelsDropdown/index.tsx b/packages/cli/src/ui/components/ModelsDropdown/index.tsx similarity index 98% rename from src/ui/components/ModelsDropdown/index.tsx rename to packages/cli/src/ui/components/ModelsDropdown/index.tsx index 6e807569..9fe968b4 100644 --- a/src/ui/components/ModelsDropdown/index.tsx +++ b/packages/cli/src/ui/components/ModelsDropdown/index.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from "react"; import { useInput } from "ink"; import DropdownMenu from "../DropdownMenu"; -import type { ModelConfigSelection, ReasoningEffort } from "../../../settings"; +import type { ModelConfigSelection, ReasoningEffort } from "@vegamo/deepcode-core"; type ModelStep = "model" | "thinking"; diff --git a/src/ui/components/RawModeExitPrompt/index.tsx b/packages/cli/src/ui/components/RawModeExitPrompt/index.tsx similarity index 100% rename from src/ui/components/RawModeExitPrompt/index.tsx rename to packages/cli/src/ui/components/RawModeExitPrompt/index.tsx diff --git a/src/ui/components/RawModelDropdown/index.tsx b/packages/cli/src/ui/components/RawModelDropdown/index.tsx similarity index 100% rename from src/ui/components/RawModelDropdown/index.tsx rename to packages/cli/src/ui/components/RawModelDropdown/index.tsx diff --git a/src/ui/components/SkillsDropdown/index.tsx b/packages/cli/src/ui/components/SkillsDropdown/index.tsx similarity index 97% rename from src/ui/components/SkillsDropdown/index.tsx rename to packages/cli/src/ui/components/SkillsDropdown/index.tsx index 4ec53397..1fe65ebb 100644 --- a/src/ui/components/SkillsDropdown/index.tsx +++ b/packages/cli/src/ui/components/SkillsDropdown/index.tsx @@ -1,6 +1,6 @@ import DropdownMenu from "../DropdownMenu"; import React, { useEffect, useState } from "react"; -import type { SkillInfo } from "../../../session"; +import type { SkillInfo } from "@vegamo/deepcode-core"; import { useInput } from "ink"; import { isSkillSelected } from "../../views/SlashCommandMenu"; diff --git a/src/ui/components/index.ts b/packages/cli/src/ui/components/index.ts similarity index 100% rename from src/ui/components/index.ts rename to packages/cli/src/ui/components/index.ts diff --git a/src/ui/constants.ts b/packages/cli/src/ui/constants.ts similarity index 100% rename from src/ui/constants.ts rename to packages/cli/src/ui/constants.ts diff --git a/src/ui/contexts/AppContext.tsx b/packages/cli/src/ui/contexts/AppContext.tsx similarity index 100% rename from src/ui/contexts/AppContext.tsx rename to packages/cli/src/ui/contexts/AppContext.tsx diff --git a/src/ui/contexts/RawModeContext.tsx b/packages/cli/src/ui/contexts/RawModeContext.tsx similarity index 100% rename from src/ui/contexts/RawModeContext.tsx rename to packages/cli/src/ui/contexts/RawModeContext.tsx diff --git a/src/ui/contexts/index.ts b/packages/cli/src/ui/contexts/index.ts similarity index 100% rename from src/ui/contexts/index.ts rename to packages/cli/src/ui/contexts/index.ts diff --git a/src/ui/core/ask-user-question.ts b/packages/cli/src/ui/core/ask-user-question.ts similarity index 98% rename from src/ui/core/ask-user-question.ts rename to packages/cli/src/ui/core/ask-user-question.ts index 8a07e400..f49b191e 100644 --- a/src/ui/core/ask-user-question.ts +++ b/packages/cli/src/ui/core/ask-user-question.ts @@ -1,4 +1,4 @@ -import type { SessionMessage, SessionStatus } from "../../session"; +import type { SessionMessage, SessionStatus } from "@vegamo/deepcode-core"; export type AskUserQuestionOption = { label: string; diff --git a/src/ui/core/clipboard.ts b/packages/cli/src/ui/core/clipboard.ts similarity index 100% rename from src/ui/core/clipboard.ts rename to packages/cli/src/ui/core/clipboard.ts diff --git a/src/ui/core/file-mentions.ts b/packages/cli/src/ui/core/file-mentions.ts similarity index 100% rename from src/ui/core/file-mentions.ts rename to packages/cli/src/ui/core/file-mentions.ts diff --git a/src/ui/core/loading-text.ts b/packages/cli/src/ui/core/loading-text.ts similarity index 96% rename from src/ui/core/loading-text.ts rename to packages/cli/src/ui/core/loading-text.ts index 2c965ea3..c757ce55 100644 --- a/src/ui/core/loading-text.ts +++ b/packages/cli/src/ui/core/loading-text.ts @@ -1,4 +1,4 @@ -import type { LlmStreamProgress, SessionEntry } from "../../session"; +import type { LlmStreamProgress, SessionEntry } from "@vegamo/deepcode-core"; type RunningProcesses = SessionEntry["processes"]; diff --git a/src/ui/core/prompt-buffer.ts b/packages/cli/src/ui/core/prompt-buffer.ts similarity index 100% rename from src/ui/core/prompt-buffer.ts rename to packages/cli/src/ui/core/prompt-buffer.ts diff --git a/src/ui/core/prompt-undo-redo.ts b/packages/cli/src/ui/core/prompt-undo-redo.ts similarity index 100% rename from src/ui/core/prompt-undo-redo.ts rename to packages/cli/src/ui/core/prompt-undo-redo.ts diff --git a/src/ui/core/slash-commands.ts b/packages/cli/src/ui/core/slash-commands.ts similarity index 98% rename from src/ui/core/slash-commands.ts rename to packages/cli/src/ui/core/slash-commands.ts index 04840baa..ba5ae6ec 100644 --- a/src/ui/core/slash-commands.ts +++ b/packages/cli/src/ui/core/slash-commands.ts @@ -1,4 +1,4 @@ -import type { SkillInfo } from "../../session"; +import type { SkillInfo } from "@vegamo/deepcode-core"; export type SlashCommandKind = | "skill" diff --git a/src/ui/core/thinking-state.ts b/packages/cli/src/ui/core/thinking-state.ts similarity index 94% rename from src/ui/core/thinking-state.ts rename to packages/cli/src/ui/core/thinking-state.ts index 02245091..0c9c5c7f 100644 --- a/src/ui/core/thinking-state.ts +++ b/packages/cli/src/ui/core/thinking-state.ts @@ -1,4 +1,4 @@ -import type { SessionMessage } from "../../session"; +import type { SessionMessage } from "@vegamo/deepcode-core"; /** * Returns the message id of the assistant "thinking" message that should stay diff --git a/src/ui/exit-summary.ts b/packages/cli/src/ui/exit-summary.ts similarity index 98% rename from src/ui/exit-summary.ts rename to packages/cli/src/ui/exit-summary.ts index c55d9ce8..25e09b48 100644 --- a/src/ui/exit-summary.ts +++ b/packages/cli/src/ui/exit-summary.ts @@ -1,6 +1,6 @@ import chalk from "chalk"; import gradientString from "gradient-string"; -import type { ModelUsage, SessionEntry } from "../session"; +import type { ModelUsage, SessionEntry } from "@vegamo/deepcode-core"; type ExitSummaryInput = { session: SessionEntry | null; diff --git a/src/ui/hooks/cursor.ts b/packages/cli/src/ui/hooks/cursor.ts similarity index 100% rename from src/ui/hooks/cursor.ts rename to packages/cli/src/ui/hooks/cursor.ts diff --git a/src/ui/hooks/index.ts b/packages/cli/src/ui/hooks/index.ts similarity index 100% rename from src/ui/hooks/index.ts rename to packages/cli/src/ui/hooks/index.ts diff --git a/src/ui/hooks/useHistoryNavigation.ts b/packages/cli/src/ui/hooks/useHistoryNavigation.ts similarity index 100% rename from src/ui/hooks/useHistoryNavigation.ts rename to packages/cli/src/ui/hooks/useHistoryNavigation.ts diff --git a/src/ui/hooks/usePasteHandling.ts b/packages/cli/src/ui/hooks/usePasteHandling.ts similarity index 100% rename from src/ui/hooks/usePasteHandling.ts rename to packages/cli/src/ui/hooks/usePasteHandling.ts diff --git a/src/ui/hooks/useTerminalInput.ts b/packages/cli/src/ui/hooks/useTerminalInput.ts similarity index 100% rename from src/ui/hooks/useTerminalInput.ts rename to packages/cli/src/ui/hooks/useTerminalInput.ts diff --git a/src/ui/index.ts b/packages/cli/src/ui/index.ts similarity index 100% rename from src/ui/index.ts rename to packages/cli/src/ui/index.ts diff --git a/src/ui/utils/index.ts b/packages/cli/src/ui/utils/index.ts similarity index 94% rename from src/ui/utils/index.ts rename to packages/cli/src/ui/utils/index.ts index b9b61ec4..6feb0306 100644 --- a/src/ui/utils/index.ts +++ b/packages/cli/src/ui/utils/index.ts @@ -2,9 +2,9 @@ import chalk from "chalk"; import { renderMessageToStdout } from "../components/MessageView/utils"; import type { RawMode } from "../contexts"; import type { PromptDraft } from "../views/PromptInput"; -import type { ModelConfigSelection } from "../../settings"; -import type { SessionEntry, SessionMessage } from "../../session"; -import type { SessionManager } from "../../session"; +import type { ModelConfigSelection } from "@vegamo/deepcode-core"; +import type { SessionEntry, SessionMessage } from "@vegamo/deepcode-core"; +import type { SessionManager } from "@vegamo/deepcode-core"; /** * Render all messages directly to stdout for Raw mode display. diff --git a/src/ui/views/App.tsx b/packages/cli/src/ui/views/App.tsx similarity index 98% rename from src/ui/views/App.tsx rename to packages/cli/src/ui/views/App.tsx index bc12962a..fe1f81cf 100644 --- a/src/ui/views/App.tsx +++ b/packages/cli/src/ui/views/App.tsx @@ -1,9 +1,9 @@ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; import { Box, Static, Text, useApp, useStdout, useWindowSize } from "ink"; import chalk from "chalk"; -import { createOpenAIClient } from "../../common/openai-client"; -import type { PermissionScope } from "../../settings"; -import { type ModelConfigSelection } from "../../settings"; +import { createOpenAIClient } from "@vegamo/deepcode-core"; +import type { PermissionScope } from "@vegamo/deepcode-core"; +import { type ModelConfigSelection } from "@vegamo/deepcode-core"; import { type PromptDraft, PromptInput, type PromptSubmission } from "./PromptInput"; import { MessageView, RawModeExitPrompt } from "../components"; import { SessionList } from "./SessionList"; @@ -31,7 +31,7 @@ import { isCurrentSessionEmpty, renderRawModeMessages, } from "../utils"; -import { resolveCurrentSettings, writeModelConfigSelection } from "../../settings"; +import { resolveCurrentSettings, writeModelConfigSelection } from "@vegamo/deepcode-core"; import { isCollapsedThinking } from "../core/thinking-state"; import { ANSI_CLEAR_SCREEN } from "../constants"; import type { @@ -43,8 +43,8 @@ import type { SkillInfo, UndoTarget, UserPromptContent, -} from "../../session"; -import { SessionManager } from "../../session"; +} from "@vegamo/deepcode-core"; +import { SessionManager } from "@vegamo/deepcode-core"; type View = "chat" | "session-list" | "undo" | "mcp-status"; diff --git a/src/ui/views/AppContainer.tsx b/packages/cli/src/ui/views/AppContainer.tsx similarity index 100% rename from src/ui/views/AppContainer.tsx rename to packages/cli/src/ui/views/AppContainer.tsx diff --git a/src/ui/views/AskUserQuestionPrompt.tsx b/packages/cli/src/ui/views/AskUserQuestionPrompt.tsx similarity index 100% rename from src/ui/views/AskUserQuestionPrompt.tsx rename to packages/cli/src/ui/views/AskUserQuestionPrompt.tsx diff --git a/src/ui/views/McpStatusList.tsx b/packages/cli/src/ui/views/McpStatusList.tsx similarity index 99% rename from src/ui/views/McpStatusList.tsx rename to packages/cli/src/ui/views/McpStatusList.tsx index 40d2f3f4..5a68832b 100644 --- a/src/ui/views/McpStatusList.tsx +++ b/packages/cli/src/ui/views/McpStatusList.tsx @@ -1,6 +1,6 @@ import React, { useState, useMemo, useCallback } from "react"; import { Box, Text, useInput, useWindowSize } from "ink"; -import type { McpServerStatus } from "../../mcp/mcp-manager"; +import type { McpServerStatus } from "@vegamo/deepcode-core"; type Props = { statuses: McpServerStatus[]; diff --git a/src/ui/views/PermissionPrompt.tsx b/packages/cli/src/ui/views/PermissionPrompt.tsx similarity index 98% rename from src/ui/views/PermissionPrompt.tsx rename to packages/cli/src/ui/views/PermissionPrompt.tsx index 320dd7ab..c90f5e68 100644 --- a/src/ui/views/PermissionPrompt.tsx +++ b/packages/cli/src/ui/views/PermissionPrompt.tsx @@ -1,8 +1,8 @@ import React, { useEffect, useMemo, useState } from "react"; import { Box, Text } from "ink"; import { useTerminalInput } from "../hooks"; -import type { AskPermissionRequest, AskPermissionScope, UserToolPermission } from "../../common/permissions"; -import type { PermissionScope } from "../../settings"; +import type { AskPermissionRequest, AskPermissionScope, UserToolPermission } from "@vegamo/deepcode-core"; +import type { PermissionScope } from "@vegamo/deepcode-core"; export type PermissionPromptResult = { permissions: UserToolPermission[]; diff --git a/src/ui/views/ProcessStdoutView.tsx b/packages/cli/src/ui/views/ProcessStdoutView.tsx similarity index 98% rename from src/ui/views/ProcessStdoutView.tsx rename to packages/cli/src/ui/views/ProcessStdoutView.tsx index bd5e6363..f341eb82 100644 --- a/src/ui/views/ProcessStdoutView.tsx +++ b/packages/cli/src/ui/views/ProcessStdoutView.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useMemo, useRef, useState } from "react"; import { Box, Text } from "ink"; -import { BASH_TIMEOUT_DECREMENT_MS, BASH_TIMEOUT_INCREMENT_MS } from "../../common/bash-timeout"; -import type { BashTimeoutAdjustment, SessionEntry, SessionProcessEntry } from "../../session"; +import { BASH_TIMEOUT_DECREMENT_MS, BASH_TIMEOUT_INCREMENT_MS } from "@vegamo/deepcode-core"; +import type { BashTimeoutAdjustment, SessionEntry, SessionProcessEntry } from "@vegamo/deepcode-core"; import { useTerminalInput } from "../hooks"; type RunningProcesses = SessionEntry["processes"]; diff --git a/src/ui/views/PromptInput.tsx b/packages/cli/src/ui/views/PromptInput.tsx similarity index 99% rename from src/ui/views/PromptInput.tsx rename to packages/cli/src/ui/views/PromptInput.tsx index c6b150cb..8124d7aa 100644 --- a/src/ui/views/PromptInput.tsx +++ b/packages/cli/src/ui/views/PromptInput.tsx @@ -60,10 +60,10 @@ import { useTerminalFocusReporting, } from "../hooks"; import SlashCommandMenu, { isSkillSelected } from "./SlashCommandMenu"; -import type { ModelConfigSelection, PermissionScope } from "../../settings"; +import type { ModelConfigSelection, PermissionScope } from "@vegamo/deepcode-core"; import { FileMentionMenu, ModelsDropdown, RawModelDropdown, SkillsDropdown } from "../components"; -import type { SessionEntry, SkillInfo } from "../../session"; -import type { UserToolPermission } from "../../common/permissions"; +import type { SessionEntry, SkillInfo } from "@vegamo/deepcode-core"; +import type { UserToolPermission } from "@vegamo/deepcode-core"; export type PromptSubmission = { text: string; diff --git a/src/ui/views/SessionList.tsx b/packages/cli/src/ui/views/SessionList.tsx similarity index 99% rename from src/ui/views/SessionList.tsx rename to packages/cli/src/ui/views/SessionList.tsx index 49d94e7f..a41cae3a 100644 --- a/src/ui/views/SessionList.tsx +++ b/packages/cli/src/ui/views/SessionList.tsx @@ -1,6 +1,6 @@ import React, { useState, useMemo, useCallback } from "react"; import { Box, Text, useInput, useWindowSize } from "ink"; -import type { SessionEntry, SessionStatus } from "../../session"; +import type { SessionEntry, SessionStatus } from "@vegamo/deepcode-core"; import { truncate } from "../components/MessageView/utils"; type Props = { diff --git a/src/ui/views/SlashCommandMenu.tsx b/packages/cli/src/ui/views/SlashCommandMenu.tsx similarity index 98% rename from src/ui/views/SlashCommandMenu.tsx rename to packages/cli/src/ui/views/SlashCommandMenu.tsx index d93446de..c138bec8 100644 --- a/src/ui/views/SlashCommandMenu.tsx +++ b/packages/cli/src/ui/views/SlashCommandMenu.tsx @@ -3,7 +3,7 @@ import type { SlashCommandItem } from "../core/slash-commands"; import { ARGS_SEPARATOR } from "../constants"; import React from "react"; import { Box, Text } from "ink"; -import type { SkillInfo } from "../../session"; +import type { SkillInfo } from "@vegamo/deepcode-core"; type SlashCommandMenuProps = { items: SlashCommandItem[]; diff --git a/src/ui/views/ThemedGradient.tsx b/packages/cli/src/ui/views/ThemedGradient.tsx similarity index 100% rename from src/ui/views/ThemedGradient.tsx rename to packages/cli/src/ui/views/ThemedGradient.tsx diff --git a/src/ui/views/UndoSelector.tsx b/packages/cli/src/ui/views/UndoSelector.tsx similarity index 99% rename from src/ui/views/UndoSelector.tsx rename to packages/cli/src/ui/views/UndoSelector.tsx index 977bca26..50a99977 100644 --- a/src/ui/views/UndoSelector.tsx +++ b/packages/cli/src/ui/views/UndoSelector.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useState } from "react"; import { Box, Text, useInput, useWindowSize } from "ink"; -import type { UndoTarget } from "../../session"; +import type { UndoTarget } from "@vegamo/deepcode-core"; export type UndoRestoreMode = "code-and-conversation" | "conversation"; diff --git a/src/ui/views/UpdatePrompt.tsx b/packages/cli/src/ui/views/UpdatePrompt.tsx similarity index 100% rename from src/ui/views/UpdatePrompt.tsx rename to packages/cli/src/ui/views/UpdatePrompt.tsx diff --git a/src/ui/views/WelcomeScreen.tsx b/packages/cli/src/ui/views/WelcomeScreen.tsx similarity index 97% rename from src/ui/views/WelcomeScreen.tsx rename to packages/cli/src/ui/views/WelcomeScreen.tsx index bee7e9ae..fdcf9211 100644 --- a/src/ui/views/WelcomeScreen.tsx +++ b/packages/cli/src/ui/views/WelcomeScreen.tsx @@ -2,8 +2,8 @@ import React, { useMemo, useState } from "react"; import { Box, Text } from "ink"; import * as os from "node:os"; import path from "node:path"; -import type { SkillInfo } from "../../session"; -import type { ResolvedDeepcodingSettings } from "../../settings"; +import type { SkillInfo } from "@vegamo/deepcode-core"; +import type { ResolvedDeepcodingSettings } from "@vegamo/deepcode-core"; import { buildSlashCommands, BUILTIN_SLASH_COMMANDS, formatSlashCommandDescription } from "../core/slash-commands"; import { ThemedGradient } from "./ThemedGradient"; import { AsciiLogo } from "../ascii-art"; diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 00000000..44d2799d --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "ignoreDeprecations": "6.0", + "lib": ["ES2022"], + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "noEmit": true, + "isolatedModules": true, + "allowSyntheticDefaultImports": true, + "types": ["node"], + "baseUrl": ".", + "paths": { + "@vegamo/deepcode-core": ["../core/src/index.ts"], + "@vegamo/deepcode-core/*": ["../core/src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "../core/src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 00000000..1f924389 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,39 @@ +{ + "name": "@vegamo/deepcode-core", + "version": "0.1.31", + "description": "Deep Code core library — LLM session management, tool execution, and shared utilities", + "license": "MIT", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/lessweb/deepcode-cli.git" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "files": [ + "dist/**", + "templates/**" + ], + "scripts": { + "typecheck": "tsc -p ./ --noEmit", + "build": "tsc -p ./", + "prepublishOnly": "npm run build", + "format": "prettier --write .", + "test": "node src/tests/run-tests.mjs" + }, + "dependencies": { + "chalk": "^5.6.2", + "ejs": "^5.0.2", + "gray-matter": "^4.0.3", + "ignore": "^7.0.5", + "openai": "^6.35.0", + "undici": "^7.25.0", + "zod": "^4.4.3" + } +} diff --git a/src/common/bash-timeout.ts b/packages/core/src/common/bash-timeout.ts similarity index 100% rename from src/common/bash-timeout.ts rename to packages/core/src/common/bash-timeout.ts diff --git a/src/common/debug-logger.ts b/packages/core/src/common/debug-logger.ts similarity index 100% rename from src/common/debug-logger.ts rename to packages/core/src/common/debug-logger.ts diff --git a/src/common/error-logger.ts b/packages/core/src/common/error-logger.ts similarity index 100% rename from src/common/error-logger.ts rename to packages/core/src/common/error-logger.ts diff --git a/src/common/file-history.ts b/packages/core/src/common/file-history.ts similarity index 100% rename from src/common/file-history.ts rename to packages/core/src/common/file-history.ts diff --git a/src/common/file-utils.ts b/packages/core/src/common/file-utils.ts similarity index 100% rename from src/common/file-utils.ts rename to packages/core/src/common/file-utils.ts diff --git a/src/common/model-capabilities.ts b/packages/core/src/common/model-capabilities.ts similarity index 100% rename from src/common/model-capabilities.ts rename to packages/core/src/common/model-capabilities.ts diff --git a/src/common/notify.ts b/packages/core/src/common/notify.ts similarity index 100% rename from src/common/notify.ts rename to packages/core/src/common/notify.ts diff --git a/src/common/openai-client.ts b/packages/core/src/common/openai-client.ts similarity index 100% rename from src/common/openai-client.ts rename to packages/core/src/common/openai-client.ts diff --git a/src/common/openai-message-converter.ts b/packages/core/src/common/openai-message-converter.ts similarity index 100% rename from src/common/openai-message-converter.ts rename to packages/core/src/common/openai-message-converter.ts diff --git a/src/common/openai-thinking.ts b/packages/core/src/common/openai-thinking.ts similarity index 100% rename from src/common/openai-thinking.ts rename to packages/core/src/common/openai-thinking.ts diff --git a/src/common/permissions.ts b/packages/core/src/common/permissions.ts similarity index 100% rename from src/common/permissions.ts rename to packages/core/src/common/permissions.ts diff --git a/src/common/process-tree.ts b/packages/core/src/common/process-tree.ts similarity index 100% rename from src/common/process-tree.ts rename to packages/core/src/common/process-tree.ts diff --git a/src/common/shell-utils.ts b/packages/core/src/common/shell-utils.ts similarity index 100% rename from src/common/shell-utils.ts rename to packages/core/src/common/shell-utils.ts diff --git a/src/common/state.ts b/packages/core/src/common/state.ts similarity index 100% rename from src/common/state.ts rename to packages/core/src/common/state.ts diff --git a/src/common/telemetry.ts b/packages/core/src/common/telemetry.ts similarity index 100% rename from src/common/telemetry.ts rename to packages/core/src/common/telemetry.ts diff --git a/packages/core/src/common/tool-types.ts b/packages/core/src/common/tool-types.ts new file mode 100644 index 00000000..1d664a76 --- /dev/null +++ b/packages/core/src/common/tool-types.ts @@ -0,0 +1,107 @@ +import type OpenAI from "openai"; +import type { ReasoningEffort } from "../settings"; + +export type CreateOpenAIClient = () => { + client: OpenAI | null; + model: string; + baseURL?: string; + temperature?: number; + thinkingEnabled: boolean; + reasoningEffort?: ReasoningEffort; + debugLogEnabled?: boolean; + telemetryEnabled?: boolean; + notify?: string; + webSearchTool?: string; + env?: Record; + machineId?: string; +}; + +export type ToolCall = { + id: string; + type: "function"; + function: { + name: string; + arguments: string; + }; +}; + +export type ToolExecutionContext = { + sessionId: string; + projectRoot: string; + toolCall: ToolCall; + createOpenAIClient?: CreateOpenAIClient; + onProcessStart?: (processId: string | number, command: string) => void; + onProcessExit?: (processId: string | number) => void; + onProcessStdout?: (processId: string | number, chunk: string) => void; + onProcessTimeoutControl?: (processId: string | number, control: ProcessTimeoutControl | null) => void; + onBackgroundProcessComplete?: (completion: BackgroundProcessCompletion) => void; + onBeforeFileMutation?: (filePath: string) => void; + onAfterFileMutation?: (filePath: string) => void; + bashTimeoutMs?: number; + bashMinTimeoutMs?: number; +}; + +export type ToolExecutionHooks = { + onProcessStart?: (processId: string | number, command: string) => void; + onProcessExit?: (processId: string | number) => void; + onProcessStdout?: (processId: string | number, chunk: string) => void; + onProcessTimeoutControl?: (processId: string | number, control: ProcessTimeoutControl | null) => void; + onBackgroundProcessComplete?: (completion: BackgroundProcessCompletion) => void; + onBeforeFileMutation?: (filePath: string) => void; + onAfterFileMutation?: (filePath: string) => void; + shouldStop?: () => boolean; +}; + +export type BackgroundProcessCompletion = { + taskId: string; + processId: number; + command: string; + outputPath: string; + ok: boolean; + exitCode: number | null; + signal: string | null; + error?: string; + cwd: string | null; + shellPath: string; + startedAtMs: number; + completedAtMs: number; +}; + +export type ProcessTimeoutInfo = { + timeoutMs: number; + startedAtMs: number; + deadlineAtMs: number; + timedOut: boolean; +}; + +export type ProcessTimeoutControl = { + getInfo: () => ProcessTimeoutInfo; + setTimeoutMs: (timeoutMs: number) => ProcessTimeoutInfo; +}; + +export type ToolExecutionResult = { + ok: boolean; + name: string; + output?: string; + error?: string; + metadata?: Record; + awaitUserResponse?: boolean; + followUpMessages?: ToolExecutionFollowUpMessage[]; +}; + +export type ToolExecutionFollowUpMessage = { + role: "system"; + content: string; + contentParams?: unknown | null; +}; + +export type ToolHandler = ( + args: Record, + context: ToolExecutionContext +) => Promise; + +export type ToolCallExecution = { + toolCallId: string; + content: string; + result: ToolExecutionResult; +}; diff --git a/src/common/validate.ts b/packages/core/src/common/validate.ts similarity index 99% rename from src/common/validate.ts rename to packages/core/src/common/validate.ts index b1195d8d..7e274253 100644 --- a/src/common/validate.ts +++ b/packages/core/src/common/validate.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import type { ToolExecutionContext, ToolExecutionResult } from "../tools/executor"; +import type { ToolExecutionContext, ToolExecutionResult } from "./tool-types"; export type ValidationResult = { ok: true; input: Record } | { ok: false; error: string }; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 00000000..8ad813a7 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,132 @@ +// Core library public API — used by both CLI and VSCode companion. + +// Settings +export { + resolveCurrentSettings, + resolveSettings, + resolveSettingsSources, + readSettings, + readProjectSettings, + writeSettings, + writeProjectSettings, + writeModelConfigSelection, + applyModelConfigSelection, + modelConfigKey, + getUserSettingsPath, + getProjectSettingsPath, + DEFAULT_MODEL, + DEFAULT_BASE_URL, +} from "./settings"; +export type { + DeepcodingSettings, + ResolvedDeepcodingSettings, + ModelConfigSelection, + PermissionScope, + PermissionSettings, + PermissionDefaultMode, + McpServerConfig, + ReasoningEffort, +} from "./settings"; + +// Session +export { SessionManager, getProjectCode, getCompactPromptTokenThreshold } from "./session"; +export type { + SessionMessage, + SessionEntry, + SessionStatus, + SessionsIndex, + SessionMessageRole, + MessageMeta, + UndoTarget, + UserPromptContent, + SkillInfo, + ModelUsage, + SessionProcessEntry, + BashTimeoutAdjustment, + LlmStreamProgress, +} from "./session"; + +// Prompt utilities +export { + getSystemPrompt, + getCompactPrompt, + getRuntimeContext, + getDefaultSkillPrompt, + getExtensionRoot, + getTools, + buildSkillDocumentsPrompt, +} from "./prompt"; +export type { ToolDefinition, SkillPromptDocument } from "./prompt"; + +// Tools +export { ToolExecutor } from "./tools/executor"; +export type { + CreateOpenAIClient, + ToolCall, + ToolExecutionContext, + ToolExecutionHooks, + ToolExecutionResult, + ToolHandler, + ToolCallExecution, + ProcessTimeoutInfo, + ProcessTimeoutControl, + BackgroundProcessCompletion, + ToolExecutionFollowUpMessage, +} from "./common/tool-types"; + +// Tool handlers +export { handleBashTool, clearSessionWorkingDir } from "./tools/bash-handler"; +export { handleReadTool } from "./tools/read-handler"; +export { handleWriteTool } from "./tools/write-handler"; +export { handleEditTool } from "./tools/edit-handler"; +export { handleUpdatePlanTool } from "./tools/update-plan-handler"; +export { handleWebSearchTool } from "./tools/web-search-handler"; +export { handleAskUserQuestionTool } from "./tools/ask-user-question-handler"; + +// MCP +export { McpManager } from "./mcp/mcp-manager"; +export { McpClient } from "./mcp/mcp-client"; +export type { McpServerStatus } from "./mcp/mcp-manager"; + +// Common utilities +export { createOpenAIClient } from "./common/openai-client"; +export { buildThinkingRequestOptions } from "./common/openai-thinking"; +export { readTextFileWithMetadata, writeTextFile, buildDiffPreview, ensureParentDirectory } from "./common/file-utils"; +export { normalizeFilePath, getSnippet, clearSessionState, recordFileState, getFileState } from "./common/state"; +export { GitFileHistory } from "./common/file-history"; +export { killProcessTree } from "./common/process-tree"; +export { launchNotifyScript } from "./common/notify"; +export { reportNewPrompt } from "./common/telemetry"; +export { DEEPSEEK_V4_MODELS, supportsMultimodal, defaultsToThinkingMode } from "./common/model-capabilities"; +export { findGitBashPath, resolveShellPath, setShellIfWindows } from "./common/shell-utils"; +export { logApiError } from "./common/error-logger"; +export { logOpenAIChatCompletionDebug } from "./common/debug-logger"; +export { + clampBashTimeoutMs, + DEFAULT_BASH_TIMEOUT_MS, + BASH_TIMEOUT_INCREMENT_MS, + BASH_TIMEOUT_DECREMENT_MS, +} from "./common/bash-timeout"; +export { executeValidatedTool, semanticBoolean } from "./common/validate"; +export { OpenAIMessageConverter } from "./common/openai-message-converter"; +export { + computeToolCallPermissions, + buildPermissionToolExecution, + hasUserPermissionReplies, + appendProjectPermissionAllows, + normalizeAskPermissions, + parseToolCallForPermissions, +} from "./common/permissions"; +export type { + AskPermissionRequest, + AskPermissionScope, + BashPermissionScope, + MessageToolPermission, + PermissionDecision, + PermissionToolCall, + UserToolPermission, +} from "./common/permissions"; + +// State types +export type { FileState, FileSnippet, FileLineEnding } from "./common/state"; +export type { FileReadMetadata } from "./common/file-utils"; diff --git a/src/mcp/mcp-client.ts b/packages/core/src/mcp/mcp-client.ts similarity index 100% rename from src/mcp/mcp-client.ts rename to packages/core/src/mcp/mcp-client.ts diff --git a/src/mcp/mcp-manager.ts b/packages/core/src/mcp/mcp-manager.ts similarity index 100% rename from src/mcp/mcp-manager.ts rename to packages/core/src/mcp/mcp-manager.ts diff --git a/src/prompt.ts b/packages/core/src/prompt.ts similarity index 100% rename from src/prompt.ts rename to packages/core/src/prompt.ts diff --git a/src/session.ts b/packages/core/src/session.ts similarity index 100% rename from src/session.ts rename to packages/core/src/session.ts diff --git a/src/settings.ts b/packages/core/src/settings.ts similarity index 100% rename from src/settings.ts rename to packages/core/src/settings.ts diff --git a/src/tests/debug-logger.test.ts b/packages/core/src/tests/debug-logger.test.ts similarity index 100% rename from src/tests/debug-logger.test.ts rename to packages/core/src/tests/debug-logger.test.ts diff --git a/src/tests/mcp-client.test.ts b/packages/core/src/tests/mcp-client.test.ts similarity index 100% rename from src/tests/mcp-client.test.ts rename to packages/core/src/tests/mcp-client.test.ts diff --git a/src/tests/memory-leak.test.ts b/packages/core/src/tests/memory-leak.test.ts similarity index 100% rename from src/tests/memory-leak.test.ts rename to packages/core/src/tests/memory-leak.test.ts diff --git a/src/tests/openai-message-converter.test.ts b/packages/core/src/tests/openai-message-converter.test.ts similarity index 100% rename from src/tests/openai-message-converter.test.ts rename to packages/core/src/tests/openai-message-converter.test.ts diff --git a/src/tests/openai-thinking.test.ts b/packages/core/src/tests/openai-thinking.test.ts similarity index 100% rename from src/tests/openai-thinking.test.ts rename to packages/core/src/tests/openai-thinking.test.ts diff --git a/src/tests/permissions.test.ts b/packages/core/src/tests/permissions.test.ts similarity index 100% rename from src/tests/permissions.test.ts rename to packages/core/src/tests/permissions.test.ts diff --git a/src/tests/process-tree.test.ts b/packages/core/src/tests/process-tree.test.ts similarity index 100% rename from src/tests/process-tree.test.ts rename to packages/core/src/tests/process-tree.test.ts diff --git a/src/tests/prompt.test.ts b/packages/core/src/tests/prompt.test.ts similarity index 100% rename from src/tests/prompt.test.ts rename to packages/core/src/tests/prompt.test.ts diff --git a/packages/core/src/tests/run-tests.mjs b/packages/core/src/tests/run-tests.mjs new file mode 100644 index 00000000..ce87cbd2 --- /dev/null +++ b/packages/core/src/tests/run-tests.mjs @@ -0,0 +1,15 @@ +// Test runner for @vegamo/deepcode-core +import { globSync } from "glob"; +import { spawnSync } from "child_process"; +import { fileURLToPath } from "url"; +import * as path from "path"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const testFiles = globSync("*.test.ts", { cwd: __dirname }); + +const result = spawnSync(process.execPath, ["--import", "tsx", "--test", ...testFiles], { + stdio: "inherit", + cwd: __dirname, +}); + +process.exit(result.status ?? 1); diff --git a/src/tests/session.test.ts b/packages/core/src/tests/session.test.ts similarity index 100% rename from src/tests/session.test.ts rename to packages/core/src/tests/session.test.ts diff --git a/src/tests/settings-and-notify.test.ts b/packages/core/src/tests/settings-and-notify.test.ts similarity index 100% rename from src/tests/settings-and-notify.test.ts rename to packages/core/src/tests/settings-and-notify.test.ts diff --git a/src/tests/shell-utils.test.ts b/packages/core/src/tests/shell-utils.test.ts similarity index 100% rename from src/tests/shell-utils.test.ts rename to packages/core/src/tests/shell-utils.test.ts diff --git a/src/tests/telemetry.test.ts b/packages/core/src/tests/telemetry.test.ts similarity index 100% rename from src/tests/telemetry.test.ts rename to packages/core/src/tests/telemetry.test.ts diff --git a/src/tests/tool-executor.test.ts b/packages/core/src/tests/tool-executor.test.ts similarity index 100% rename from src/tests/tool-executor.test.ts rename to packages/core/src/tests/tool-executor.test.ts diff --git a/src/tests/tool-handlers.test.ts b/packages/core/src/tests/tool-handlers.test.ts similarity index 100% rename from src/tests/tool-handlers.test.ts rename to packages/core/src/tests/tool-handlers.test.ts diff --git a/src/tests/web-search-handler.test.ts b/packages/core/src/tests/web-search-handler.test.ts similarity index 100% rename from src/tests/web-search-handler.test.ts rename to packages/core/src/tests/web-search-handler.test.ts diff --git a/src/tools/ask-user-question-handler.ts b/packages/core/src/tools/ask-user-question-handler.ts similarity index 100% rename from src/tools/ask-user-question-handler.ts rename to packages/core/src/tools/ask-user-question-handler.ts diff --git a/src/tools/bash-handler.ts b/packages/core/src/tools/bash-handler.ts similarity index 100% rename from src/tools/bash-handler.ts rename to packages/core/src/tools/bash-handler.ts diff --git a/src/tools/edit-handler.ts b/packages/core/src/tools/edit-handler.ts similarity index 100% rename from src/tools/edit-handler.ts rename to packages/core/src/tools/edit-handler.ts diff --git a/src/tools/executor.ts b/packages/core/src/tools/executor.ts similarity index 67% rename from src/tools/executor.ts rename to packages/core/src/tools/executor.ts index 53846f48..6af57c4c 100644 --- a/src/tools/executor.ts +++ b/packages/core/src/tools/executor.ts @@ -1,5 +1,3 @@ -import type OpenAI from "openai"; -import type { ReasoningEffort } from "../settings"; import { handleAskUserQuestionTool } from "./ask-user-question-handler"; import { handleBashTool } from "./bash-handler"; import { handleEditTool } from "./edit-handler"; @@ -8,105 +6,28 @@ import { handleUpdatePlanTool } from "./update-plan-handler"; import { handleWebSearchTool } from "./web-search-handler"; import { handleWriteTool } from "./write-handler"; import type { McpManager } from "../mcp/mcp-manager"; - -export type CreateOpenAIClient = () => { - client: OpenAI | null; - model: string; - baseURL?: string; - temperature?: number; - thinkingEnabled: boolean; - reasoningEffort?: ReasoningEffort; - debugLogEnabled?: boolean; - telemetryEnabled?: boolean; - notify?: string; - webSearchTool?: string; - env?: Record; - machineId?: string; -}; - -export type ToolCall = { - id: string; - type: "function"; - function: { - name: string; - arguments: string; - }; -}; - -export type ToolExecutionContext = { - sessionId: string; - projectRoot: string; - toolCall: ToolCall; - createOpenAIClient?: CreateOpenAIClient; - onProcessStart?: (processId: string | number, command: string) => void; - onProcessExit?: (processId: string | number) => void; - onProcessStdout?: (processId: string | number, chunk: string) => void; - onProcessTimeoutControl?: (processId: string | number, control: ProcessTimeoutControl | null) => void; - onBackgroundProcessComplete?: (completion: BackgroundProcessCompletion) => void; - onBeforeFileMutation?: (filePath: string) => void; - onAfterFileMutation?: (filePath: string) => void; - bashTimeoutMs?: number; - bashMinTimeoutMs?: number; -}; - -export type ToolExecutionHooks = { - onProcessStart?: (processId: string | number, command: string) => void; - onProcessExit?: (processId: string | number) => void; - onProcessStdout?: (processId: string | number, chunk: string) => void; - onProcessTimeoutControl?: (processId: string | number, control: ProcessTimeoutControl | null) => void; - onBackgroundProcessComplete?: (completion: BackgroundProcessCompletion) => void; - onBeforeFileMutation?: (filePath: string) => void; - onAfterFileMutation?: (filePath: string) => void; - shouldStop?: () => boolean; -}; - -export type BackgroundProcessCompletion = { - taskId: string; - processId: number; - command: string; - outputPath: string; - ok: boolean; - exitCode: number | null; - signal: string | null; - error?: string; - cwd: string | null; - shellPath: string; - startedAtMs: number; - completedAtMs: number; -}; - -export type ProcessTimeoutInfo = { - timeoutMs: number; - startedAtMs: number; - deadlineAtMs: number; - timedOut: boolean; -}; - -export type ProcessTimeoutControl = { - getInfo: () => ProcessTimeoutInfo; - setTimeoutMs: (timeoutMs: number) => ProcessTimeoutInfo; -}; - -export type ToolExecutionResult = { - ok: boolean; - name: string; - output?: string; - error?: string; - metadata?: Record; - awaitUserResponse?: boolean; - followUpMessages?: ToolExecutionFollowUpMessage[]; -}; - -export type ToolExecutionFollowUpMessage = { - role: "system"; - content: string; - contentParams?: unknown | null; -}; - -export type ToolHandler = ( - args: Record, - context: ToolExecutionContext -) => Promise; +import type { + CreateOpenAIClient, + ToolCall, + ToolExecutionHooks, + ToolExecutionResult, + ToolHandler, + ToolCallExecution, +} from "../common/tool-types"; + +export type { + CreateOpenAIClient, + ToolCall, + ToolExecutionContext, + ToolExecutionHooks, + ToolExecutionResult, + ToolHandler, + ToolCallExecution, + ProcessTimeoutInfo, + ProcessTimeoutControl, + BackgroundProcessCompletion, + ToolExecutionFollowUpMessage, +} from "../common/tool-types"; const BUILT_IN_TOOL_NAME_ALIASES = new Map([ ["Bash", "bash"], @@ -115,12 +36,6 @@ const BUILT_IN_TOOL_NAME_ALIASES = new Map([ ["Edit", "edit"], ]); -export type ToolCallExecution = { - toolCallId: string; - content: string; - result: ToolExecutionResult; -}; - export class ToolExecutor { private readonly projectRoot: string; private readonly createOpenAIClient?: CreateOpenAIClient; @@ -216,7 +131,6 @@ export class ToolExecutor { const handlerName = BUILT_IN_TOOL_NAME_ALIASES.get(toolName) ?? toolName; const handler = this.toolHandlers.get(handlerName); if (!handler) { - // Try MCP tools if (this.mcpManager?.isMcpTool(toolName)) { const parsedArgs = this.parseToolArguments(toolCall.function.arguments); const args = parsedArgs.ok ? parsedArgs.args : {}; diff --git a/src/tools/read-handler.ts b/packages/core/src/tools/read-handler.ts similarity index 100% rename from src/tools/read-handler.ts rename to packages/core/src/tools/read-handler.ts diff --git a/src/tools/update-plan-handler.ts b/packages/core/src/tools/update-plan-handler.ts similarity index 100% rename from src/tools/update-plan-handler.ts rename to packages/core/src/tools/update-plan-handler.ts diff --git a/src/tools/web-search-handler.ts b/packages/core/src/tools/web-search-handler.ts similarity index 100% rename from src/tools/web-search-handler.ts rename to packages/core/src/tools/web-search-handler.ts diff --git a/src/tools/write-handler.ts b/packages/core/src/tools/write-handler.ts similarity index 100% rename from src/tools/write-handler.ts rename to packages/core/src/tools/write-handler.ts diff --git a/templates/prompts/init_command.md.ejs b/packages/core/templates/prompts/init_command.md.ejs similarity index 100% rename from templates/prompts/init_command.md.ejs rename to packages/core/templates/prompts/init_command.md.ejs diff --git a/templates/skills/bundled/deepcode-self-refer/SKILL.md b/packages/core/templates/skills/bundled/deepcode-self-refer/SKILL.md similarity index 81% rename from templates/skills/bundled/deepcode-self-refer/SKILL.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/SKILL.md index 357868cd..5a8b377c 100644 --- a/templates/skills/bundled/deepcode-self-refer/SKILL.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/SKILL.md @@ -31,14 +31,14 @@ Use this Skill when the user asks any question about Deep Code itself, such as: Map the user's question to the appropriate document(s): -| Topic | Document | Key contents | -|-------|----------|-------------| -| **Overview, features, quick start** | `references/README.md` | Installation, slash commands, keyboard shortcuts, supported models, FAQ | -| **Configuration & settings** | `references/configuration.md` | `settings.json` fields, config hierarchy, env vars, thinking mode, reasoning effort, webSearchTool, enabledSkills | -| **MCP setup & usage** | `references/mcp.md` | MCP server config format, GitHub/Playwright/Filesystem examples, tool naming (`mcp____`), troubleshooting | -| **Permissions** | `references/permission.md` | Permission scopes (10 types), allow/deny/ask/defaultMode config, priority rules, persistence | -| **Notifications** | `references/notify.md` | Notify script path, injected env vars, Slack/Feishu/iTerm2/macOS/Linux/Windows examples | -| **Session persistence** | `references/session-persistence.md` | Storage paths, JSONL format, session index, compaction, `/undo` mechanics, code snapshots | +| Topic | Document | Key contents | +| ----------------------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| **Overview, features, quick start** | `references/README.md` | Installation, slash commands, keyboard shortcuts, supported models, FAQ | +| **Configuration & settings** | `references/configuration.md` | `settings.json` fields, config hierarchy, env vars, thinking mode, reasoning effort, webSearchTool, enabledSkills | +| **MCP setup & usage** | `references/mcp.md` | MCP server config format, GitHub/Playwright/Filesystem examples, tool naming (`mcp____`), troubleshooting | +| **Permissions** | `references/permission.md` | Permission scopes (10 types), allow/deny/ask/defaultMode config, priority rules, persistence | +| **Notifications** | `references/notify.md` | Notify script path, injected env vars, Slack/Feishu/iTerm2/macOS/Linux/Windows examples | +| **Session persistence** | `references/session-persistence.md` | Storage paths, JSONL format, session index, compaction, `/undo` mechanics, code snapshots | ### Step 2: Read the relevant document(s) @@ -58,6 +58,7 @@ Use the `Read` tool to read the appropriate document(s) from the list above. All ### Step 4: Handle common request patterns **"列出/查看可用的 skills":** + - Treat `/skills` as the canonical UI for listing currently available skills. - If answering directly, do not infer the list only from loaded skill prompts or from project/user directories. Enumerate all discovery roots: 1. `./.deepcode/skills//SKILL.md` @@ -77,18 +78,21 @@ Use the `Read` tool to read the appropriate document(s) from the list above. All - Mention that `/skills` can be used to verify the result and `enabledSkills` can enable/disable specific skills by name. **"配置 MCP":** + - Read `references/mcp.md` for the MCP format and examples - Ask the user for any required credentials (e.g., GitHub token) - Provide the exact `mcpServers` JSON block to add to `settings.json` - Mention using `/mcp` to verify the setup afterwards **"如何配置/修改 <设置项>":** + - Read `references/configuration.md` - Explain which `settings.json` field controls the setting - Clarify user-level (`~/.deepcode/settings.json`) vs project-level (`.deepcode/settings.json`) - Provide the exact JSON snippet **"<斜杠命令> 是做什么的?":** + - Read the slash command table from references/README.md - Provide a brief explanation with any additional context from relevant docs diff --git a/templates/skills/bundled/deepcode-self-refer/references/README.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/README.md similarity index 87% rename from templates/skills/bundled/deepcode-self-refer/references/README.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/README.md index de34da9a..9a4e27e0 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/README.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/README.md @@ -51,46 +51,48 @@ npm install -g @vegamo/deepcode-cli ## 主要功能 ### **Skills** + Deep Code CLI 支持 agent skills,允许您扩展助手的能力: Skills 会按以下优先级扫描: -| Scope | Path | Purpose | -| :------ | :-------------------- | :---------------------------- | -| Project | `./.deepcode/skills/` | Deep Code 原生位置,最高优先级 | -| Project | `./.agents/skills/` | 跨客户端互操作 | -| User | `~/.deepcode/skills/` | Deep Code 原生位置 | -| User | `~/.agents/skills/` | 跨客户端互操作 | +| Scope | Path | Purpose | +| :------ | :------------------------- | :-------------------------------- | +| Project | `./.deepcode/skills/` | Deep Code 原生位置,最高优先级 | +| Project | `./.agents/skills/` | 跨客户端互操作 | +| User | `~/.deepcode/skills/` | Deep Code 原生位置 | +| User | `~/.agents/skills/` | 跨客户端互操作 | | Bundled | `bundled:/SKILL.md` | Deep Code 内置 skills,最低优先级 | ### **为 DeepSeek 优化** + - 专门为 DeepSeek 模型性能调优。 - 通过使用[上下文缓存](https://api-docs.deepseek.com/guides/kv_cache)来降低成本。 - 原生支持[思考模式](https://api-docs.deepseek.com/guides/thinking_mode)和思考强度控制。 ## 斜杠命令与按键功能 -| 斜杠命令 | 操作 | -|-------------|----------------------------------| -| `/` | 打开 skills / 命令菜单 | -| `/new` | 开始新对话 | -| `/resume` | 选择历史对话继续 | -| `/continue` | 继续当前对话,或选择历史对话恢复 | -| `/model` | 切换模型、思考模式和推理强度 | +| 斜杠命令 | 操作 | +| ----------- | -------------------------------------------- | +| `/` | 打开 skills / 命令菜单 | +| `/new` | 开始新对话 | +| `/resume` | 选择历史对话继续 | +| `/continue` | 继续当前对话,或选择历史对话恢复 | +| `/model` | 切换模型、思考模式和推理强度 | | `/raw` | 切换显示模式(Normal / Lite / Raw 滚动回溯) | -| `/init` | 初始化 AGENTS.md 文件 | -| `/skills` | 列出可用 skills | +| `/init` | 初始化 AGENTS.md 文件 | +| `/skills` | 列出可用 skills | | `/mcp` | 查看 MCP 服务器状态和可用工具 | -| `/undo` | 将代码和/或对话恢复到之前的状态 | -| `/exit` | 退出(也可用连续 `Ctrl+D`) | +| `/undo` | 将代码和/或对话恢复到之前的状态 | +| `/exit` | 退出(也可用连续 `Ctrl+D`) | -| 按键 | 操作 | -|---------------|--------------------| -| `Enter` | 发送消息 | +| 按键 | 操作 | +| ------------- | --------------------------- | +| `Enter` | 发送消息 | | `Shift+Enter` | 插入换行(也可用 `Ctrl+J`) | -| `Ctrl+V` | 从剪贴板粘贴图片 | -| `Esc` | 中断当前模型回复 | -| 连续 `Ctrl+D` | 退出 | +| `Ctrl+V` | 从剪贴板粘贴图片 | +| `Esc` | 中断当前模型回复 | +| 连续 `Ctrl+D` | 退出 | ## 支持的模型 @@ -98,7 +100,6 @@ Skills 会按以下优先级扫描: - `deepseek-v4-flash` - 任何其他 OpenAI 兼容模型 - ## 常见问题 ### Deep Code 是否有 VSCode 插件? diff --git a/templates/skills/bundled/deepcode-self-refer/references/configuration.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/configuration.md similarity index 64% rename from templates/skills/bundled/deepcode-self-refer/references/configuration.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/configuration.md index 2f198b10..ad437ab8 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/configuration.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/configuration.md @@ -4,53 +4,53 @@ 配置按以下优先级顺序应用(数字较小的会被数字较大的覆盖): -| 层级 | 配置来源 | 说明 | -| ---- | ------------ | ------------------------------------------- | -| 1 | 默认值 | 应用程序内硬编码的默认值 | -| 2 | 用户设置文件 | 当前用户的全局设置 | -| 3 | 项目设置文件 | 项目特定的设置 | -| 4 | 环境变量 | 系统范围或会话特定的变量 | +| 层级 | 配置来源 | 说明 | +| ---- | ------------ | ------------------------ | +| 1 | 默认值 | 应用程序内硬编码的默认值 | +| 2 | 用户设置文件 | 当前用户的全局设置 | +| 3 | 项目设置文件 | 项目特定的设置 | +| 4 | 环境变量 | 系统范围或会话特定的变量 | ## 设置文件 Deep Code 使用 `settings.json` 设置文件进行持久化配置,支持两个层级的存放位置: -| 文件类型 | 位置 | 作用范围 | -| ------------ | ---------------------------------- | ---------------------------------------------------- | -| 用户设置文件 | `~/.deepcode/settings.json` | 适用于当前用户的所有 Deep Code 会话。 | +| 文件类型 | 位置 | 作用范围 | +| ------------ | ------------------------------------ | --------------------------------------------------------------- | +| 用户设置文件 | `~/.deepcode/settings.json` | 适用于当前用户的所有 Deep Code 会话。 | | 项目设置文件 | `项目根目录/.deepcode/settings.json` | 仅在该特定项目中运行 Deep Code 时生效。项目设置会覆盖用户设置。 | ### `settings.json` 中的可用设置 以下是 `settings.json` 支持的全部顶层字段,以及 `env` 内部支持的子字段: -| 字段 | 类型 | 说明 | -| -------------------- | --------- | ------------------------------------------------------------------- | -| `env` | object | 环境变量分组(见下方子字段表) | -| `model` | string | 模型名称。优先级高于 `env.MODEL` | -| `thinkingEnabled` | boolean | 是否启用思考模式(DeepSeek V4 系列默认启用) | -| `reasoningEffort` | string | 推理强度,可选 `"high"` 或 `"max"`(默认 `"max"`) | -| `debugLogEnabled` | boolean | 是否启用调试日志输出(默认 `false`) | -| `telemetryEnabled` | boolean | 是否启用匿名使用数据上报(默认 `true`) | -| `notify` | string | 任务完成通知脚本的完整路径(如 Slack 通知脚本) | -| `webSearchTool` | string | 自定义联网搜索脚本的完整路径 | -| `mcpServers` | object | MCP 服务器配置(键为服务名,值为 McpServerConfig 对象) | -| `temperature` | number | 模型采样温度,范围 `0` 到 `2` | -| `enabledSkills` | object | 按 skill 名称启用或禁用 skill 的配置 | +| 字段 | 类型 | 说明 | +| ------------------ | ------- | ------------------------------------------------------- | +| `env` | object | 环境变量分组(见下方子字段表) | +| `model` | string | 模型名称。优先级高于 `env.MODEL` | +| `thinkingEnabled` | boolean | 是否启用思考模式(DeepSeek V4 系列默认启用) | +| `reasoningEffort` | string | 推理强度,可选 `"high"` 或 `"max"`(默认 `"max"`) | +| `debugLogEnabled` | boolean | 是否启用调试日志输出(默认 `false`) | +| `telemetryEnabled` | boolean | 是否启用匿名使用数据上报(默认 `true`) | +| `notify` | string | 任务完成通知脚本的完整路径(如 Slack 通知脚本) | +| `webSearchTool` | string | 自定义联网搜索脚本的完整路径 | +| `mcpServers` | object | MCP 服务器配置(键为服务名,值为 McpServerConfig 对象) | +| `temperature` | number | 模型采样温度,范围 `0` 到 `2` | +| `enabledSkills` | object | 按 skill 名称启用或禁用 skill 的配置 | #### `env` 子字段 -| 字段 | 类型 | 说明 | -| ---------- | ------ | ------------------------------------------------------------------ | -| `MODEL` | string | 模型名称。例如 `"deepseek-v4-pro"`、`"deepseek-v4-flash"` | -| `BASE_URL` | string | API 请求的基础 URL。例如 `"https://api.deepseek.com"` | -| `API_KEY` | string | API 密钥 | -| `TEMPERATURE` | string | Chat Completions 采样温度,范围 `"0"` 到 `"2"` | -| `THINKING_ENABLED` | string | 是否启用思考模式 | -| `REASONING_EFFORT` | string | 推理强度 | -| `DEBUG_LOG_ENABLED` | string | 是否启用调试日志输出 | -| `TELEMETRY_ENABLED` | string | 是否启用匿名使用数据上报 | -| `<其他任意KEY>` | string | 自定义环境变量 | +| 字段 | 类型 | 说明 | +| ------------------- | ------ | --------------------------------------------------------- | +| `MODEL` | string | 模型名称。例如 `"deepseek-v4-pro"`、`"deepseek-v4-flash"` | +| `BASE_URL` | string | API 请求的基础 URL。例如 `"https://api.deepseek.com"` | +| `API_KEY` | string | API 密钥 | +| `TEMPERATURE` | string | Chat Completions 采样温度,范围 `"0"` 到 `"2"` | +| `THINKING_ENABLED` | string | 是否启用思考模式 | +| `REASONING_EFFORT` | string | 推理强度 | +| `DEBUG_LOG_ENABLED` | string | 是否启用调试日志输出 | +| `TELEMETRY_ENABLED` | string | 是否启用匿名使用数据上报 | +| `<其他任意KEY>` | string | 自定义环境变量 | #### `thinkingEnabled` — 思考模式 @@ -63,10 +63,10 @@ Deep Code 使用 `settings.json` 设置文件进行持久化配置,支持两 当思考模式启用时,控制模型思考的深度: -| 值 | 说明 | -| ------ | --------------------------------- | -| `max` | 最大推理深度(默认值) | -| `high` | 较高推理深度,token消耗相对较小 | +| 值 | 说明 | +| ------ | ------------------------------- | +| `max` | 最大推理深度(默认值) | +| `high` | 较高推理深度,token消耗相对较小 | #### `notify` — 任务完成通知 @@ -74,13 +74,13 @@ Deep Code 使用 `settings.json` 设置文件进行持久化配置,支持两 通知脚本执行时,会通过环境变量注入以下上下文信息: -| 环境变量 | 说明 | -|----------|------| -| `DURATION` | 会话耗时,单位秒(整数) | -| `STATUS` | 会话状态:`"completed"` 或 `"failed"` | -| `FAIL_REASON` | 失败原因(仅失败时设置) | -| `BODY` | 最后一条 AI 助手回复的文本内容 | -| `TITLE` | 会话标题(对应 resume 列表中的标题) | +| 环境变量 | 说明 | +| ------------- | ------------------------------------- | +| `DURATION` | 会话耗时,单位秒(整数) | +| `STATUS` | 会话状态:`"completed"` 或 `"failed"` | +| `FAIL_REASON` | 失败原因(仅失败时设置) | +| `BODY` | 最后一条 AI 助手回复的文本内容 | +| `TITLE` | 会话标题(对应 resume 列表中的标题) | ```json { @@ -137,17 +137,16 @@ MCP(Model Context Protocol)服务器配置。值是键值对,键为服务 } ``` -| McpServerConfig 字段 | 类型 | 必填 | 说明 | -| -------------------- | -------- | ---- | -------------------------------------------------------------------- | -| `command` | string | 是 | 可执行文件路径或命令(如 `npx`、`node`、`python`) | -| `args` | string[] | 否 | 传递给命令的参数列表 | -| `env` | object | 否 | 传递给 MCP 服务器进程的环境变量 | +| McpServerConfig 字段 | 类型 | 必填 | 说明 | +| -------------------- | -------- | ---- | -------------------------------------------------- | +| `command` | string | 是 | 可执行文件路径或命令(如 `npx`、`node`、`python`) | +| `args` | string[] | 否 | 传递给命令的参数列表 | +| `env` | object | 否 | 传递给 MCP 服务器进程的环境变量 | > 当 `command` 为 `npx` 时,Deep Code 会自动在参数前补充 `-y`。 详细 MCP 使用说明请参考 [mcp.md](mcp.md)。 - #### `debugLogEnabled` — 调试日志 设为 `true` 可让程序输出详细的调试日志(默认 `false`),用于排查 API 调用和工具执行的问题。 @@ -171,6 +170,7 @@ DEEPCODE_TELEMETRY_ENABLED=0 deepcode 环境变量优先级遵循“越具体、越局部的配置,优先级越高”和“env文件默认保护现有环境,系统变量高于env文件”的覆盖逻辑。(settings.json的env对象可以认为是一种env文件) 优先级层级 (由低到高) + 1. settings.json 外层的 env:这是针对整个工具及其所有子进程的通用配置(全局变量)。可被外层环境变量覆盖,但环境变量KEY会移除`DEEPCODE_`前缀。 2. settings.json mcpServers 内定义的 env:这是针对特定 MCP 服务的最具体配置(局部变量)。可被外层环境变量覆盖,但环境变量KEY会移除`MCP_`前缀。 3. Shell 环境系统变量:操作系统层面的环境变量。 diff --git a/templates/skills/bundled/deepcode-self-refer/references/configuration_en.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/configuration_en.md similarity index 71% rename from templates/skills/bundled/deepcode-self-refer/references/configuration_en.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/configuration_en.md index fac8c349..2c58b5d0 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/configuration_en.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/configuration_en.md @@ -4,53 +4,53 @@ Configuration is applied in the following priority order (lower-numbered sources are overridden by higher-numbered ones): -| Layer | Configuration Source | Description | -| ----- | -------------------- | ---------------------------------------------- | -| 1 | Defaults | Hardcoded defaults within the application | -| 2 | User settings file | Global settings for the current user | -| 3 | Project settings file| Project-specific settings | -| 4 | Environment variables| System-wide or session-specific variables | +| Layer | Configuration Source | Description | +| ----- | --------------------- | ----------------------------------------- | +| 1 | Defaults | Hardcoded defaults within the application | +| 2 | User settings file | Global settings for the current user | +| 3 | Project settings file | Project-specific settings | +| 4 | Environment variables | System-wide or session-specific variables | ## Settings File Deep Code uses the `settings.json` file for persistent configuration, supporting two storage locations: -| File Type | Location | Scope | -| ------------------- | ----------------------------------------- | --------------------------------------------------------------------- | -| User settings file | `~/.deepcode/settings.json` | Applies to all Deep Code sessions for the current user. | +| File Type | Location | Scope | +| --------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| User settings file | `~/.deepcode/settings.json` | Applies to all Deep Code sessions for the current user. | | Project settings file | `/.deepcode/settings.json` | Takes effect only when running Deep Code in that specific project. Project settings override user settings. | ### Available Settings in `settings.json` The following are all the top-level fields supported in `settings.json`, along with the sub-fields inside `env`: -| Field | Type | Description | -| ------------------ | ------- | --------------------------------------------------------------------------- | -| `env` | object | Group of environment variables (see sub-field table below) | -| `model` | string | Model name. Takes precedence over `env.MODEL` | -| `thinkingEnabled` | boolean | Whether to enable thinking mode (enabled by default for DeepSeek V4 series)| -| `reasoningEffort` | string | Reasoning intensity, either `"high"` or `"max"` (default `"max"`) | -| `debugLogEnabled` | boolean | Enable debug log output (default `false`) | -| `telemetryEnabled` | boolean | Enable anonymous usage reporting (default `true`) | -| `notify` | string | Full path to a task-completion notification script (e.g., Slack notification script) | -| `webSearchTool` | string | Full path to a custom web search script | +| Field | Type | Description | +| ------------------ | ------- | -------------------------------------------------------------------------------------- | +| `env` | object | Group of environment variables (see sub-field table below) | +| `model` | string | Model name. Takes precedence over `env.MODEL` | +| `thinkingEnabled` | boolean | Whether to enable thinking mode (enabled by default for DeepSeek V4 series) | +| `reasoningEffort` | string | Reasoning intensity, either `"high"` or `"max"` (default `"max"`) | +| `debugLogEnabled` | boolean | Enable debug log output (default `false`) | +| `telemetryEnabled` | boolean | Enable anonymous usage reporting (default `true`) | +| `notify` | string | Full path to a task-completion notification script (e.g., Slack notification script) | +| `webSearchTool` | string | Full path to a custom web search script | | `mcpServers` | object | MCP server configurations (keys are service names, values are McpServerConfig objects) | -| `temperature` | number | Sampling temperature for LLM, from `0` to `2` | -| `enabledSkills` | object | Per-skill enable/disable map, keyed by skill name | +| `temperature` | number | Sampling temperature for LLM, from `0` to `2` | +| `enabledSkills` | object | Per-skill enable/disable map, keyed by skill name | #### `env` Sub-fields -| Field | Type | Description | -| ----------------- | ------ | ---------------------------------------------------------------- | -| `MODEL` | string | Model name, e.g. `"deepseek-v4-pro"`, `"deepseek-v4-flash"` | -| `BASE_URL` | string | Base URL for API requests, e.g. `"https://api.deepseek.com"` | -| `API_KEY` | string | API key | -| `TEMPERATURE` | string | Sampling temperature for chat completions, from `"0"` to `"2"` | -| `THINKING_ENABLED`| string | Enable thinking mode | -| `REASONING_EFFORT`| string | Reasoning intensity | -| `DEBUG_LOG_ENABLED`| string| Enable debug log output | -| `TELEMETRY_ENABLED`| string| Enable anonymous usage reporting | -| `` | string | Custom environment variable | +| Field | Type | Description | +| ------------------- | ------ | -------------------------------------------------------------- | +| `MODEL` | string | Model name, e.g. `"deepseek-v4-pro"`, `"deepseek-v4-flash"` | +| `BASE_URL` | string | Base URL for API requests, e.g. `"https://api.deepseek.com"` | +| `API_KEY` | string | API key | +| `TEMPERATURE` | string | Sampling temperature for chat completions, from `"0"` to `"2"` | +| `THINKING_ENABLED` | string | Enable thinking mode | +| `REASONING_EFFORT` | string | Reasoning intensity | +| `DEBUG_LOG_ENABLED` | string | Enable debug log output | +| `TELEMETRY_ENABLED` | string | Enable anonymous usage reporting | +| `` | string | Custom environment variable | #### `thinkingEnabled` — Thinking Mode @@ -63,10 +63,10 @@ Whether to enable DeepSeek thinking mode. Set to `true` to enable, `false` to di When thinking mode is enabled, controls the depth of the model’s reasoning: -| Value | Description | -| ------ | --------------------------------------------------------- | -| `max` | Maximum reasoning depth (default) | -| `high` | Higher reasoning depth with relatively lower token usage | +| Value | Description | +| ------ | -------------------------------------------------------- | +| `max` | Maximum reasoning depth (default) | +| `high` | Higher reasoning depth with relatively lower token usage | #### `notify` — Task Completion Notification @@ -74,13 +74,13 @@ Set a full path to a shell script. When the AI assistant finishes a round of tas The following context is injected as environment variables when the notify script runs: -| Variable | Description | -|----------|-------------| -| `DURATION` | Session duration in seconds (integer) | -| `STATUS` | Session status: `"completed"` or `"failed"` | -| `FAIL_REASON` | Failure reason (only set on failure) | -| `BODY` | The text content of the last AI assistant reply | -| `TITLE` | Session title (matches the resume list title) | +| Variable | Description | +| ------------- | ----------------------------------------------- | +| `DURATION` | Session duration in seconds (integer) | +| `STATUS` | Session status: `"completed"` or `"failed"` | +| `FAIL_REASON` | Failure reason (only set on failure) | +| `BODY` | The text content of the last AI assistant reply | +| `TITLE` | Session title (matches the resume list title) | ```json { @@ -137,11 +137,11 @@ Configuration for MCP (Model Context Protocol) servers. The value is a key-value } ``` -| McpServerConfig field | Type | Required | Description | -| --------------------- | -------- | -------- | ------------------------------------------------------------------------ | -| `command` | string | Yes | Executable path or command (e.g. `npx`, `node`, `python`) | -| `args` | string[] | No | List of arguments passed to the command | -| `env` | object | No | Environment variables passed to the MCP server process | +| McpServerConfig field | Type | Required | Description | +| --------------------- | -------- | -------- | --------------------------------------------------------- | +| `command` | string | Yes | Executable path or command (e.g. `npx`, `node`, `python`) | +| `args` | string[] | No | List of arguments passed to the command | +| `env` | object | No | Environment variables passed to the MCP server process | > When `command` is `npx`, Deep Code automatically prepends `-y` to the arguments. @@ -170,6 +170,7 @@ Environment variables are a common way to configure applications, especially for Environment variable priority follows the logic of “the more specific and localized the configuration, the higher the priority”, and the override rule of “env files protect existing environment by default, system variables override env files”. (The `env` object in settings.json can be thought of as a type of env file.) Priority levels (from lowest to highest): + 1. `env` defined at the top level of `settings.json` – this is a general configuration for the entire tool and all its subprocesses (global variables). Can be overridden by outer environment variables, but the environment variable KEY has the `DEEPCODE_` prefix removed. 2. `env` defined inside `mcpServers` in `settings.json` – this is the most specific configuration for a particular MCP service (local variables). Can be overridden by outer environment variables, but the KEY has the `MCP_` prefix removed. 3. Shell/system environment variables – operating system level. diff --git a/templates/skills/bundled/deepcode-self-refer/references/mcp.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/mcp.md similarity index 100% rename from templates/skills/bundled/deepcode-self-refer/references/mcp.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/mcp.md diff --git a/templates/skills/bundled/deepcode-self-refer/references/mcp_en.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/mcp_en.md similarity index 96% rename from templates/skills/bundled/deepcode-self-refer/references/mcp_en.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/mcp_en.md index 03c4b30c..7933db6a 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/mcp_en.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/mcp_en.md @@ -41,11 +41,11 @@ Edit `~/.deepcode/settings.json` and add the `mcpServers` field: ### Configuration Fields -| Field | Type | Required | Description | -| --------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Field | Type | Required | Description | +| --------- | -------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `command` | string | Yes | Path or command of the MCP server executable (e.g., `npx`, `node`, `python`). When the command is `npx`, Deep Code automatically prepends `-y` to the arguments. | -| `args` | string[] | No | List of arguments to pass to the command | -| `env` | object | No | Environment variables (e.g., API keys) to pass to the MCP server process | +| `args` | string[] | No | List of arguments to pass to the command | +| `env` | object | No | Environment variables (e.g., API keys) to pass to the MCP server process | ## Common MCP Examples @@ -160,12 +160,12 @@ The AI will automatically invoke the `mcp__github__search_issues` tool to comple An MCP tool name consists of three parts: `mcp____` -| Service | Tool Name | Full Invocation Name | -| ---------- | ----------------------- | ------------------------------------------- | -| github | search_code | `mcp__github__search_code` | -| github | create_pull_request | `mcp__github__create_pull_request` | -| playwright | browser_navigate | `mcp__playwright__browser_navigate` | -| playwright | browser_take_screenshot | `mcp__playwright__browser_take_screenshot` | +| Service | Tool Name | Full Invocation Name | +| ---------- | ----------------------- | ------------------------------------------ | +| github | search_code | `mcp__github__search_code` | +| github | create_pull_request | `mcp__github__create_pull_request` | +| playwright | browser_navigate | `mcp__playwright__browser_navigate` | +| playwright | browser_take_screenshot | `mcp__playwright__browser_take_screenshot` | You can view the list of tools provided by each server using `/mcp`. @@ -197,4 +197,4 @@ MCP servers follow the [Model Context Protocol](https://modelcontextprotocol.io/ 2. `tools/list` — Return the list of available tools 3. `tools/call` — Execute a tool call -For more information, see the [official MCP documentation](https://modelcontextprotocol.io/). \ No newline at end of file +For more information, see the [official MCP documentation](https://modelcontextprotocol.io/). diff --git a/templates/skills/bundled/deepcode-self-refer/references/notify.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/notify.md similarity index 91% rename from templates/skills/bundled/deepcode-self-refer/references/notify.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/notify.md index d73eef45..553722f3 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/notify.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/notify.md @@ -8,13 +8,13 @@ ## 注入的环境变量 -| 环境变量 | 说明 | -|----------|------| -| `DURATION` | 会话耗时,单位秒(整数) | -| `STATUS` | 会话状态:`"completed"` 或 `"failed"` | -| `FAIL_REASON` | 失败原因(仅失败时设置) | -| `BODY` | 最后一条 AI 助手回复的文本内容 | -| `TITLE` | 会话标题(对应 resume 列表中的标题) | +| 环境变量 | 说明 | +| ------------- | ------------------------------------- | +| `DURATION` | 会话耗时,单位秒(整数) | +| `STATUS` | 会话状态:`"completed"` 或 `"failed"` | +| `FAIL_REASON` | 失败原因(仅失败时设置) | +| `BODY` | 最后一条 AI 助手回复的文本内容 | +| `TITLE` | 会话标题(对应 resume 列表中的标题) | ## 配置方法 diff --git a/templates/skills/bundled/deepcode-self-refer/references/notify_en.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/notify_en.md similarity index 91% rename from templates/skills/bundled/deepcode-self-refer/references/notify_en.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/notify_en.md index b949161c..90fcf706 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/notify_en.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/notify_en.md @@ -8,13 +8,13 @@ Configure the `notify` field in `settings.json` with the full path to an executa ## Injected Environment Variables -| Variable | Description | -|----------|-------------| -| `DURATION` | Session duration in seconds (integer) | -| `STATUS` | Session status: `"completed"` or `"failed"` | -| `FAIL_REASON` | Failure reason (only set on failure) | -| `BODY` | The text content of the last AI assistant reply | -| `TITLE` | Session title (matches the resume list title) | +| Variable | Description | +| ------------- | ----------------------------------------------- | +| `DURATION` | Session duration in seconds (integer) | +| `STATUS` | Session status: `"completed"` or `"failed"` | +| `FAIL_REASON` | Failure reason (only set on failure) | +| `BODY` | The text content of the last AI assistant reply | +| `TITLE` | Session title (matches the resume list title) | ## Configuration diff --git a/templates/skills/bundled/deepcode-self-refer/references/permission.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/permission.md similarity index 61% rename from templates/skills/bundled/deepcode-self-refer/references/permission.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/permission.md index 91c19c6f..e315c47c 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/permission.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/permission.md @@ -14,18 +14,18 @@ Deep Code 内置了一套细粒度的权限控制机制,在 AI 助手执行工 Deep Code 定义了以下 10 种权限范围,覆盖了工具调用的各类风险场景: -| 权限范围 | 说明 | -| -------- | ---- | -| `read-in-cwd` | 读取当前工作区内的文件 | -| `read-out-cwd` | 读取当前工作区外的文件 | -| `write-in-cwd` | 在当前工作区内创建或覆写文件 | -| `write-out-cwd` | 在当前工作区外创建或覆写文件 | -| `delete-in-cwd` | 删除当前工作区内的文件 | -| `delete-out-cwd` | 删除当前工作区外的文件 | -| `query-git-log` | 查询 Git 历史(如 `git log`、`git show`、`git blame`) | +| 权限范围 | 说明 | +| ---------------- | --------------------------------------------------------- | +| `read-in-cwd` | 读取当前工作区内的文件 | +| `read-out-cwd` | 读取当前工作区外的文件 | +| `write-in-cwd` | 在当前工作区内创建或覆写文件 | +| `write-out-cwd` | 在当前工作区外创建或覆写文件 | +| `delete-in-cwd` | 删除当前工作区内的文件 | +| `delete-out-cwd` | 删除当前工作区外的文件 | +| `query-git-log` | 查询 Git 历史(如 `git log`、`git show`、`git blame`) | | `mutate-git-log` | 修改 Git 历史(如 `git commit`、`git rebase`、`git tag`) | -| `network` | 访问网络(如 `curl`、`npm install` 等联网操作) | -| `mcp` | 调用 MCP 外部工具 | +| `network` | 访问网络(如 `curl`、`npm install` 等联网操作) | +| `mcp` | 调用 MCP 外部工具 | 此外还有一个特殊的 `unknown` 范围,当 LLM 无法准确分类命令的副作用时使用,**`unknown` 总是触发询问**。 @@ -46,11 +46,11 @@ Deep Code 定义了以下 10 种权限范围,覆盖了工具调用的各类风 ### 配置项说明 -| 字段 | 类型 | 说明 | -| ---- | ---- | ---- | -| `allow` | `string[]` | 始终自动放行的权限范围列表 | -| `deny` | `string[]` | 始终自动拒绝的权限范围列表 | -| `ask` | `string[]` | 始终弹出询问的权限范围列表 | +| 字段 | 类型 | 说明 | +| ------------- | -------------------------- | --------------------------------------------------------------------------------- | +| `allow` | `string[]` | 始终自动放行的权限范围列表 | +| `deny` | `string[]` | 始终自动拒绝的权限范围列表 | +| `ask` | `string[]` | 始终弹出询问的权限范围列表 | | `defaultMode` | `"allowAll"` \| `"askAll"` | 未在 `allow`/`deny`/`ask` 中明确列出的权限范围的默认处理方式。默认为 `"allowAll"` | ### 优先级规则 @@ -86,10 +86,10 @@ Deep Code 定义了以下 10 种权限范围,覆盖了工具调用的各类风 ``` 此配置的效果: + - 工作区内读写、Git 查询 → 自动放行 - 其他操作都需要用户确认。 - ## 持久化机制 当用户在权限提示中选择 "Yes, and always allow" 后,对应的权限范围会被写入当前项目的 `.deepcode/settings.json` 文件中: diff --git a/templates/skills/bundled/deepcode-self-refer/references/permission_en.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/permission_en.md similarity index 64% rename from templates/skills/bundled/deepcode-self-refer/references/permission_en.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/permission_en.md index dae739c0..1298a1d6 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/permission_en.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/permission_en.md @@ -14,18 +14,18 @@ Each time the AI assistant invokes a tool, the system automatically analyzes the Deep Code defines the following 10 permission scopes, covering various risk scenarios for tool calls: -| Permission Scope | Description | -| ---------------- | ----------- | -| `read-in-cwd` | Read files inside the current workspace | -| `read-out-cwd` | Read files outside the current workspace | -| `write-in-cwd` | Create or overwrite files inside the current workspace | -| `write-out-cwd` | Create or overwrite files outside the current workspace | -| `delete-in-cwd` | Delete files inside the current workspace | -| `delete-out-cwd` | Delete files outside the current workspace | -| `query-git-log` | Query Git history (e.g., `git log`, `git show`, `git blame`) | +| Permission Scope | Description | +| ---------------- | ---------------------------------------------------------------- | +| `read-in-cwd` | Read files inside the current workspace | +| `read-out-cwd` | Read files outside the current workspace | +| `write-in-cwd` | Create or overwrite files inside the current workspace | +| `write-out-cwd` | Create or overwrite files outside the current workspace | +| `delete-in-cwd` | Delete files inside the current workspace | +| `delete-out-cwd` | Delete files outside the current workspace | +| `query-git-log` | Query Git history (e.g., `git log`, `git show`, `git blame`) | | `mutate-git-log` | Mutate Git history (e.g., `git commit`, `git rebase`, `git tag`) | -| `network` | Access the network (e.g., `curl`, `npm install`) | -| `mcp` | Invoke MCP external tools | +| `network` | Access the network (e.g., `curl`, `npm install`) | +| `mcp` | Invoke MCP external tools | There is also a special `unknown` scope used when the LLM cannot classify a command's side effects — **`unknown` always triggers a prompt**. @@ -46,11 +46,11 @@ Configure permissions in `~/.deepcode/settings.json` (user-level) or `.deepcode/ ### Configuration Fields -| Field | Type | Description | -| ----- | ---- | ----------- | -| `allow` | `string[]` | Permission scopes that are always auto-allowed | -| `deny` | `string[]` | Permission scopes that are always auto-denied | -| `ask` | `string[]` | Permission scopes that always trigger a confirmation prompt | +| Field | Type | Description | +| ------------- | -------------------------- | --------------------------------------------------------------------------------------------------- | +| `allow` | `string[]` | Permission scopes that are always auto-allowed | +| `deny` | `string[]` | Permission scopes that are always auto-denied | +| `ask` | `string[]` | Permission scopes that always trigger a confirmation prompt | | `defaultMode` | `"allowAll"` \| `"askAll"` | Default behavior for scopes not explicitly listed in `allow`/`deny`/`ask`. Defaults to `"allowAll"` | ### Priority Rules @@ -86,6 +86,7 @@ Default behavior: all operations are auto-allowed with no confirmation required. ``` With this configuration: + - Reading/writing inside the workspace and querying Git history → auto-allowed - All other operations → require user confirmation diff --git a/templates/skills/bundled/deepcode-self-refer/references/session-persistence.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/session-persistence.md similarity index 75% rename from templates/skills/bundled/deepcode-self-refer/references/session-persistence.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/session-persistence.md index 835d2881..1c629e4d 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/session-persistence.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/session-persistence.md @@ -14,11 +14,11 @@ Deep Code 会把每个项目的会话记录保存在本机用户目录中。会 项目存储目录包含以下主要文件和目录: -| 路径 | 说明 | -| ---- | ---- | +| 路径 | 说明 | +| --------------------- | ------------------------------------------------------ | | `sessions-index.json` | 当前项目的会话索引,保存会话列表和每个会话的概要信息。 | -| `.jsonl` | 单个会话的消息记录。每一行是一条 JSON 格式的消息。 | -| `file-history/.git` | 用于代码快照的内部 Git 仓库,供 `/undo` 恢复文件内容。 | +| `.jsonl` | 单个会话的消息记录。每一行是一条 JSON 格式的消息。 | +| `file-history/.git` | 用于代码快照的内部 Git 仓库,供 `/undo` 恢复文件内容。 | ## 持久化内容 @@ -38,18 +38,18 @@ Deep Code 会把每个项目的会话记录保存在本机用户目录中。会 每个会话有一个独立的 JSONL 消息文件,文件名是 `.jsonl`。消息按追加顺序写入,常见字段包括: -| 字段 | 说明 | -| ---- | ---- | -| `id` | 消息 ID。 | -| `sessionId` | 所属会话 ID。 | -| `role` | 消息角色:`system`、`user`、`assistant` 或 `tool`。 | -| `content` | 文本内容。 | -| `contentParams` | 结构化内容,例如图片输入。 | -| `messageParams` | 模型消息参数,例如 tool call ID、tool calls、reasoning content。 | -| `visible` | 是否在界面中显示。 | -| `compacted` | 是否已经被长会话压缩替代。 | -| `checkpointHash` | 与 `/undo` 关联的代码快照哈希。 | -| `meta` | 工具展示、skill、权限、摘要等附加信息。 | +| 字段 | 说明 | +| ---------------- | ---------------------------------------------------------------- | +| `id` | 消息 ID。 | +| `sessionId` | 所属会话 ID。 | +| `role` | 消息角色:`system`、`user`、`assistant` 或 `tool`。 | +| `content` | 文本内容。 | +| `contentParams` | 结构化内容,例如图片输入。 | +| `messageParams` | 模型消息参数,例如 tool call ID、tool calls、reasoning content。 | +| `visible` | 是否在界面中显示。 | +| `compacted` | 是否已经被长会话压缩替代。 | +| `checkpointHash` | 与 `/undo` 关联的代码快照哈希。 | +| `meta` | 工具展示、skill、权限、摘要等附加信息。 | 读取消息文件时,Deep Code 会逐行解析 JSON;无法解析的行会被忽略,以便尽量保留其余可用历史。 @@ -113,11 +113,11 @@ Deep Code 使用 `file-history/.git` 保存代码快照。这个仓库只作为 根据选择,Deep Code 可以执行以下操作: -| 操作 | 行为 | -| ---- | ---- | +| 操作 | 行为 | +| -------- | ------------------------------------------------------------------- | | 恢复对话 | 截断所选用户消息之前的消息历史,并更新索引中的最新 assistant 信息。 | -| 恢复代码 | 从 `file-history/.git` 中读取所选快照,并还原被跟踪文件。 | -| 同时恢复 | 先恢复代码,再截断对话历史。 | +| 恢复代码 | 从 `file-history/.git` 中读取所选快照,并还原被跟踪文件。 | +| 同时恢复 | 先恢复代码,再截断对话历史。 | 恢复对话会重写该会话的 JSONL 文件;恢复代码会修改工作区中被快照跟踪的文件。 diff --git a/templates/skills/bundled/deepcode-self-refer/references/session-persistence_en.md b/packages/core/templates/skills/bundled/deepcode-self-refer/references/session-persistence_en.md similarity index 72% rename from templates/skills/bundled/deepcode-self-refer/references/session-persistence_en.md rename to packages/core/templates/skills/bundled/deepcode-self-refer/references/session-persistence_en.md index 071a5353..865bf04b 100644 --- a/templates/skills/bundled/deepcode-self-refer/references/session-persistence_en.md +++ b/packages/core/templates/skills/bundled/deepcode-self-refer/references/session-persistence_en.md @@ -14,11 +14,11 @@ Each project has its own storage directory: The project storage directory contains these main files and directories: -| Path | Description | -| ---- | ----------- | +| Path | Description | +| --------------------- | --------------------------------------------------------------------------------------- | | `sessions-index.json` | Session index for the current project, including the session list and summary metadata. | -| `.jsonl` | Message log for one session. Each line is one JSON message. | -| `file-history/.git` | Internal Git repository used for code checkpoints restored by `/undo`. | +| `.jsonl` | Message log for one session. Each line is one JSON message. | +| `file-history/.git` | Internal Git repository used for code checkpoints restored by `/undo`. | ## Persisted Data @@ -38,18 +38,18 @@ The default session title comes from the first 100 characters of the first user Each session has a separate JSONL message file named `.jsonl`. Messages are appended in order. Common fields include: -| Field | Description | -| ----- | ----------- | -| `id` | Message ID. | -| `sessionId` | Owning session ID. | -| `role` | Message role: `system`, `user`, `assistant`, or `tool`. | -| `content` | Text content. | -| `contentParams` | Structured content, such as image input. | -| `messageParams` | Model message parameters, such as tool call IDs, tool calls, and reasoning content. | -| `visible` | Whether the message is shown in the UI. | -| `compacted` | Whether the message has been replaced by long-session compaction. | -| `checkpointHash` | Code checkpoint hash associated with `/undo`. | -| `meta` | Extra metadata for tool display, skills, permissions, summaries, and related features. | +| Field | Description | +| ---------------- | -------------------------------------------------------------------------------------- | +| `id` | Message ID. | +| `sessionId` | Owning session ID. | +| `role` | Message role: `system`, `user`, `assistant`, or `tool`. | +| `content` | Text content. | +| `contentParams` | Structured content, such as image input. | +| `messageParams` | Model message parameters, such as tool call IDs, tool calls, and reasoning content. | +| `visible` | Whether the message is shown in the UI. | +| `compacted` | Whether the message has been replaced by long-session compaction. | +| `checkpointHash` | Code checkpoint hash associated with `/undo`. | +| `meta` | Extra metadata for tool display, skills, permissions, summaries, and related features. | When loading a message file, Deep Code parses JSON one line at a time. Malformed lines are ignored so the remaining usable history can still be loaded. @@ -113,11 +113,11 @@ These states are persisted in `sessions-index.json`, so they remain visible in t Depending on the selected mode, Deep Code can perform these operations: -| Operation | Behavior | -| --------- | -------- | +| Operation | Behavior | +| -------------------- | -------------------------------------------------------------------------------------------------------------- | | Restore conversation | Truncates message history before the selected user message and updates the latest assistant data in the index. | -| Restore code | Reads the selected checkpoint from `file-history/.git` and restores tracked files. | -| Restore both | Restores code first, then truncates the conversation history. | +| Restore code | Reads the selected checkpoint from `file-history/.git` and restores tracked files. | +| Restore both | Restores code first, then truncates the conversation history. | Restoring conversation rewrites the session JSONL file. Restoring code modifies workspace files tracked by the selected checkpoint. diff --git a/templates/skills/bundled/plan/SKILL.md b/packages/core/templates/skills/bundled/plan/SKILL.md similarity index 78% rename from templates/skills/bundled/plan/SKILL.md rename to packages/core/templates/skills/bundled/plan/SKILL.md index b73c1abc..41c43013 100644 --- a/templates/skills/bundled/plan/SKILL.md +++ b/packages/core/templates/skills/bundled/plan/SKILL.md @@ -5,7 +5,7 @@ description: Plan tasks through a strict non-mutating collaboration workflow bef # Plan Mode (Conversational) -You work in 3 phases, and you should *chat your way* to a great plan before finalizing it. A great plan is very detailed—intent- and implementation-wise—so that it can be handed to another engineer or agent to be implemented right away. It must be **decision complete**, where the implementer does not need to make any decisions. +You work in 3 phases, and you should _chat your way_ to a great plan before finalizing it. A great plan is very detailed—intent- and implementation-wise—so that it can be handed to another engineer or agent to be implemented right away. It must be **decision complete**, where the implementer does not need to make any decisions. ## Mode rules (strict) @@ -27,19 +27,19 @@ You may explore and execute **non-mutating** actions that improve the plan. You Actions that gather truth, reduce ambiguity, or validate feasibility without changing repo-tracked state. Examples: -* Reading or searching files, configs, schemas, types, manifests, and docs -* Static analysis, inspection, and repo exploration -* Dry-run style commands when they do not edit repo-tracked files -* Tests, builds, or checks that may write to caches or build artifacts (for example, `target/`, `.cache/`, or snapshots) so long as they do not edit repo-tracked files +- Reading or searching files, configs, schemas, types, manifests, and docs +- Static analysis, inspection, and repo exploration +- Dry-run style commands when they do not edit repo-tracked files +- Tests, builds, or checks that may write to caches or build artifacts (for example, `target/`, `.cache/`, or snapshots) so long as they do not edit repo-tracked files ### Not allowed (mutating, plan-executing) Actions that implement the plan or change repo-tracked state. Examples: -* Editing or writing files -* Running formatters or linters that rewrite files -* Applying patches, migrations, or codegen that updates repo-tracked files -* Side-effectful commands whose purpose is to carry out the plan rather than refine it +- Editing or writing files +- Running formatters or linters that rewrite files +- Applying patches, migrations, or codegen that updates repo-tracked files +- Side-effectful commands whose purpose is to carry out the plan rather than refine it When in doubt: if the action would reasonably be described as "doing the work" rather than "planning the work," do not do it. @@ -55,27 +55,27 @@ Do not ask questions that can be answered from the repo or system (for example, ## PHASE 2 — Intent chat (what they actually want) -* Keep asking until you can clearly state: goal + success criteria, audience, in/out of scope, constraints, current state, and the key preferences/tradeoffs. -* Bias toward questions over guessing: if any high-impact ambiguity remains, do NOT plan yet—ask. +- Keep asking until you can clearly state: goal + success criteria, audience, in/out of scope, constraints, current state, and the key preferences/tradeoffs. +- Bias toward questions over guessing: if any high-impact ambiguity remains, do NOT plan yet—ask. ## PHASE 3 — Implementation chat (what/how we’ll build) -* Once intent is stable, keep asking until the spec is decision complete: approach, interfaces (APIs/schemas/I/O), data flow, edge cases/failure modes, testing + acceptance criteria, rollout/monitoring, and any migrations/compat constraints. +- Once intent is stable, keep asking until the spec is decision complete: approach, interfaces (APIs/schemas/I/O), data flow, edge cases/failure modes, testing + acceptance criteria, rollout/monitoring, and any migrations/compat constraints. ## Asking questions Critical rules: -* Strongly prefer using the `AskUserQuestion` tool to ask any questions. -* Offer only meaningful multiple‑choice options; don’t include filler choices that are obviously wrong or irrelevant. -* In rare cases where an unavoidable, important question can’t be expressed with reasonable multiple‑choice options (due to extreme ambiguity), you may ask it directly without the tool. +- Strongly prefer using the `AskUserQuestion` tool to ask any questions. +- Offer only meaningful multiple‑choice options; don’t include filler choices that are obviously wrong or irrelevant. +- In rare cases where an unavoidable, important question can’t be expressed with reasonable multiple‑choice options (due to extreme ambiguity), you may ask it directly without the tool. You SHOULD ask many questions, but each question must: -* materially change the spec/plan, OR -* confirm/lock an assumption, OR -* choose between meaningful tradeoffs. -* not be answerable by non-mutating commands. +- materially change the spec/plan, OR +- confirm/lock an assumption, OR +- choose between meaningful tradeoffs. +- not be answerable by non-mutating commands. Use the `AskUserQuestion` tool only for decisions that materially change the plan, for confirming important assumptions, or for information that cannot be discovered via non-mutating exploration. Ask one question at a time when possible, provide concrete options with `label` and optional `description`, and use `multiSelect` only when multiple choices can be combined. @@ -83,16 +83,16 @@ Use the `AskUserQuestion` tool only for decisions that materially change the pla 1. **Discoverable facts** (repo/system truth): explore first. - * Before asking, run targeted searches and check likely sources of truth (configs/manifests/entrypoints/schemas/types/constants). - * Ask only if: multiple plausible candidates; nothing found but you need a missing identifier/context; or ambiguity is actually product intent. - * If asking, present concrete candidates (paths/service names) + recommend one. - * Never ask questions you can answer from your environment (e.g., “where is this struct”). + - Before asking, run targeted searches and check likely sources of truth (configs/manifests/entrypoints/schemas/types/constants). + - Ask only if: multiple plausible candidates; nothing found but you need a missing identifier/context; or ambiguity is actually product intent. + - If asking, present concrete candidates (paths/service names) + recommend one. + - Never ask questions you can answer from your environment (e.g., “where is this struct”). 2. **Preferences/tradeoffs** (not discoverable): ask early. - * These are intent or implementation preferences that cannot be derived from exploration. - * Provide 2–4 mutually exclusive options + a recommended default. - * If unanswered, proceed with the recommended option and record it as an assumption in the final plan. + - These are intent or implementation preferences that cannot be derived from exploration. + - Provide 2–4 mutually exclusive options + a recommended default. + - If unanswered, proceed with the recommended option and record it as an assumption in the final plan. ## Finalization rule @@ -100,11 +100,11 @@ Only output the final plan when it is decision complete and leaves no decisions When you present the official plan, wrap it in a `` block so the client can render it specially: -1) The opening tag must be on its own line. -2) Start the plan content on the next line (no text on the same line as the tag). -3) The closing tag must be on its own line. -4) Use Markdown inside the block. -5) Keep the tags exactly as `` and `` (do not translate or rename them), even if the plan content is in another language. +1. The opening tag must be on its own line. +2. Start the plan content on the next line (no text on the same line as the tag). +3. The closing tag must be on its own line. +4. Use Markdown inside the block. +5. Keep the tags exactly as `` and `` (do not translate or rename them), even if the plan content is in another language. Example: @@ -114,11 +114,11 @@ plan content plan content should be human and agent digestible. The final plan must be plan-only, concise by default, and include: -* A clear title -* A brief summary section -* Important changes or additions to public APIs/interfaces/types -* Test cases and scenarios -* Explicit assumptions and defaults chosen where needed +- A clear title +- A brief summary section +- Important changes or additions to public APIs/interfaces/types +- Test cases and scenarios +- Explicit assumptions and defaults chosen where needed When possible, prefer a compact structure with 3-5 short sections, usually: Summary, Key Changes or Implementation Changes, Test Plan, and Assumptions. Do not include a separate Scope section unless scope boundaries are genuinely important to avoid mistakes. diff --git a/templates/skills/bundled/skill-digester/SKILL.md b/packages/core/templates/skills/bundled/skill-digester/SKILL.md similarity index 100% rename from templates/skills/bundled/skill-digester/SKILL.md rename to packages/core/templates/skills/bundled/skill-digester/SKILL.md diff --git a/templates/skills/bundled/skill-digester/scripts/find-skill.js b/packages/core/templates/skills/bundled/skill-digester/scripts/find-skill.js similarity index 100% rename from templates/skills/bundled/skill-digester/scripts/find-skill.js rename to packages/core/templates/skills/bundled/skill-digester/scripts/find-skill.js diff --git a/templates/skills/bundled/skill-writer/SKILL.md b/packages/core/templates/skills/bundled/skill-writer/SKILL.md similarity index 99% rename from templates/skills/bundled/skill-writer/SKILL.md rename to packages/core/templates/skills/bundled/skill-writer/SKILL.md index 1a7801c3..ca2adc41 100644 --- a/templates/skills/bundled/skill-writer/SKILL.md +++ b/packages/core/templates/skills/bundled/skill-writer/SKILL.md @@ -10,6 +10,7 @@ This Skill helps you create well-structured Agent Skills for AI agents that foll ## When to use this Skill Use this Skill when: + - Creating a new Agent Skill - Writing or updating SKILL.md files - Designing skill structure and frontmatter @@ -37,11 +38,13 @@ First, understand what the Skill should do: Determine where to create the Skill: **Personal Skills** (`~/.agents/skills/`): + - Individual workflows and preferences - Experimental Skills - Personal productivity tools **Project Skills** (`.agents/skills/`): + - Team workflows and conventions - Project-specific expertise - Shared utilities (committed to git) @@ -59,6 +62,7 @@ mkdir -p .agents/skills/skill-name ``` For multi-file Skills: + ``` skill-name/ ├── SKILL.md (required) @@ -116,22 +120,26 @@ The description is critical for AI agents to discover your Skill. **Examples**: ✅ **Good**: + ```yaml description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction. ``` ✅ **Good**: + ```yaml description: Analyze Excel spreadsheets, create pivot tables, and generate charts. Use when working with Excel files, spreadsheets, or analyzing tabular data in .xlsx format. ``` ❌ **Too vague**: + ```yaml description: Helps with documents description: For data analysis ``` **Tips**: + - Include specific file extensions (.pdf, .xlsx, .json) - Mention common user phrases ("analyze", "extract", "generate") - List concrete operations (not generic verbs) @@ -141,7 +149,7 @@ description: For data analysis Use clear Markdown sections: -```markdown +````markdown # Skill Name Brief overview of what this Skill does. @@ -153,6 +161,7 @@ Provide a simple example to get started immediately. ## Instructions Step-by-step guidance for AI agents: + 1. First step with clear action 2. Second step with expected outcome 3. Handle edge cases @@ -170,14 +179,17 @@ Show concrete usage examples with code or commands. ## Requirements List any dependencies or prerequisites: + ```bash pip install package-name ``` +```` ## Advanced usage For complex scenarios, see [reference.md](reference.md). -``` + +```` ### Step 7: Add supporting files (optional) @@ -196,17 +208,19 @@ Run the helper script: \`\`\`bash python scripts/helper.py input.txt \`\`\` -``` +```` ### Step 8: Validate the Skill Check these requirements: ✅ **File structure**: + - [ ] SKILL.md exists in correct location - [ ] Directory name matches frontmatter `name` ✅ **YAML frontmatter**: + - [ ] Opening `---` on line 1 - [ ] Closing `---` before content - [ ] Valid YAML (no tabs, correct indentation) @@ -214,12 +228,14 @@ Check these requirements: - [ ] `description` is specific and < 1024 chars ✅ **Content quality**: + - [ ] Clear instructions for AI agents - [ ] Concrete examples provided - [ ] Edge cases handled - [ ] Dependencies listed (if any) ✅ **Testing**: + - [ ] Description matches user questions - [ ] Skill activates on relevant queries - [ ] Instructions are clear and actionable @@ -229,6 +245,7 @@ Check these requirements: 1. **Restart AI agents** (if running) to load the Skill 2. **Ask relevant questions** that match the description: + ``` Can you help me extract text from this PDF? ``` @@ -247,6 +264,7 @@ If AI agents doesn't use the Skill: - Mention common user phrases 2. **Check file location**: + ```bash ls ~/.agents/skills/skill-name/SKILL.md ls .agents/skills/skill-name/SKILL.md @@ -343,16 +361,19 @@ Before finalizing a Skill, verify: ## Troubleshooting **Skill doesn't activate**: + - Make description more specific with trigger words - Include file types and operations in description - Add "Use when..." clause with user phrases **Multiple Skills conflict**: + - Make descriptions more distinct - Use different trigger words - Narrow the scope of each Skill **Skill has errors**: + - Check YAML syntax (no tabs, proper indentation) - Verify file paths (use forward slashes) - Ensure scripts have execute permissions @@ -361,6 +382,7 @@ Before finalizing a Skill, verify: ## Examples See the documentation for complete examples: + - Simple single-file Skill (commit-helper) - Skill with tool permissions (code-reviewer) - Multi-file Skill (pdf-processing) @@ -378,4 +400,3 @@ When creating a Skill, I will: 7. Validate against all requirements The result will be a complete, working Skill that follows all best practices and validation rules. - diff --git a/templates/skills/karpathy-guidelines.md b/packages/core/templates/skills/karpathy-guidelines.md similarity index 97% rename from templates/skills/karpathy-guidelines.md rename to packages/core/templates/skills/karpathy-guidelines.md index 41e23d73..8f5d86bf 100644 --- a/templates/skills/karpathy-guidelines.md +++ b/packages/core/templates/skills/karpathy-guidelines.md @@ -14,6 +14,7 @@ Behavioral guidelines to reduce common LLM coding mistakes. **Don't assume. Don't hide confusion. Surface tradeoffs.** Before implementing: + - State your assumptions explicitly. If uncertain, ask. - If multiple interpretations exist, present them - don't pick silently. - If a simpler approach exists, say so. Push back when warranted. @@ -36,12 +37,14 @@ Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, sim **Touch only what you must. Clean up only your own mess.** When editing existing code: + - Don't "improve" adjacent code, comments, or formatting. - Don't refactor things that aren't broken. - Match existing style, even if you'd do it differently. - If you notice unrelated dead code, mention it - don't delete it. When your changes create orphans: + - Remove imports/variables/functions that YOUR changes made unused. - Don't remove pre-existing dead code unless asked. @@ -52,15 +55,17 @@ The test: Every changed line should trace directly to the user's request. **Define success criteria. Loop until verified.** Transform tasks into verifiable goals: + - "Add validation" → "Write tests for invalid inputs, then make them pass" - "Fix the bug" → "Write a test that reproduces it, then make it pass" - "Refactor X" → "Ensure tests pass before and after" For multi-step tasks, state a brief plan: + ``` 1. [Step] → verify: [check] 2. [Step] → verify: [check] 3. [Step] → verify: [check] ``` -Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification. \ No newline at end of file +Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification. diff --git a/templates/tools/ask-user-question.md b/packages/core/templates/tools/ask-user-question.md similarity index 99% rename from templates/tools/ask-user-question.md rename to packages/core/templates/tools/ask-user-question.md index 7e072982..bcf4ebcc 100644 --- a/templates/tools/ask-user-question.md +++ b/packages/core/templates/tools/ask-user-question.md @@ -1,12 +1,14 @@ ## AskUserQuestion Use this tool when you need to ask the user questions during execution. This allows you to: + 1. Gather user preferences or requirements 2. Clarify ambiguous instructions 3. Get decisions on implementation choices as you work 4. Offer choices to the user about what direction to take. Usage notes: + - Users will always be able to select "Other" to provide custom text input - Use multiSelect: true to allow multiple answers to be selected for a question - If you recommend a specific option, make that the first option in the list and add "(Recommended)" at the end of the label diff --git a/templates/tools/bash.md b/packages/core/templates/tools/bash.md similarity index 54% rename from templates/tools/bash.md rename to packages/core/templates/tools/bash.md index 12f52af3..c69d7cd0 100644 --- a/templates/tools/bash.md +++ b/packages/core/templates/tools/bash.md @@ -7,6 +7,7 @@ On Windows, Bash runs through Git Bash. Use POSIX commands and quote Windows pat IMPORTANT: This tool is for terminal operations like git, npm, docker, etc. DO NOT use it for file operations (reading, writing, editing, searching, finding files) - use the specialized tools for this instead. IMPORTANT: Before reaching for generic shell pipelines, prefer purpose-built CLI tools when they make the task more accurate, safer, faster, or easier to understand: + - Use `ripgrep` (`rg`) when you need to search file contents by text or regex across the workspace; prefer it over slower tools like `grep`. - Use `jq` when you need to inspect, filter, or transform JSON output; prefer it over ad-hoc parsing with `sed`, `awk`, or Python one-liners. @@ -27,35 +28,36 @@ Before executing the command, please follow these steps: - Capture the output of the command. Usage notes: - - The command argument is required. - - The sideEffects argument is required. Declare the minimum permission scopes the command may need. - - You can use `run_in_background: true` to run a command in the background. Only use this if you need to perform a blocking task, like running a server for the upcoming test scripts. - - When using `run_in_background`, do NOT add `&` to the command. Output is written to a log file. - - Before your final response, stop background tasks that has not reported a completed state, unless the user explicitly asks to keep it running. - - To stop a background command, use the `stopCommand` returned in the tool result metadata. - - Use `sideEffects: []` only for commands that do not read, write, delete, query Git history, mutate Git history, or access the network, such as `date` or `node --version`. - - Use `*-out-cwd` when the command accesses paths outside the current workspace. For example, `cat /etc/hosts` requires `["read-out-cwd"]`. - - Use `query-git-log` for commands such as `git log`, `git show HEAD`, `git blame`, or history diffs. Use `mutate-git-log` for commands such as `git commit`, `git reset`, `git rebase`, `git merge`, `git cherry-pick`, or `git tag`. - - Use `["unknown"]` when you cannot classify the command safely. - - It is very helpful if you write a clear, concise description of what this command does. For simple commands, keep it brief (5-10 words). For complex commands (piped commands, obscure flags, or anything hard to understand at a glance), add enough context to clarify what it does. - - If the output exceeds 30000 characters, output will be truncated before being returned to you. - - Always prefer using the dedicated tools for these commands: - - Read files: Use Read (NOT cat/head/tail) - - Edit files: Use Edit (NOT sed/awk) - - Write files: Use Write (NOT echo >/cat < - pytest /foo/bar/tests - - - cd /foo/bar && pytest tests - + +- The command argument is required. +- The sideEffects argument is required. Declare the minimum permission scopes the command may need. +- You can use `run_in_background: true` to run a command in the background. Only use this if you need to perform a blocking task, like running a server for the upcoming test scripts. +- When using `run_in_background`, do NOT add `&` to the command. Output is written to a log file. +- Before your final response, stop background tasks that has not reported a completed state, unless the user explicitly asks to keep it running. +- To stop a background command, use the `stopCommand` returned in the tool result metadata. +- Use `sideEffects: []` only for commands that do not read, write, delete, query Git history, mutate Git history, or access the network, such as `date` or `node --version`. +- Use `*-out-cwd` when the command accesses paths outside the current workspace. For example, `cat /etc/hosts` requires `["read-out-cwd"]`. +- Use `query-git-log` for commands such as `git log`, `git show HEAD`, `git blame`, or history diffs. Use `mutate-git-log` for commands such as `git commit`, `git reset`, `git rebase`, `git merge`, `git cherry-pick`, or `git tag`. +- Use `["unknown"]` when you cannot classify the command safely. +- It is very helpful if you write a clear, concise description of what this command does. For simple commands, keep it brief (5-10 words). For complex commands (piped commands, obscure flags, or anything hard to understand at a glance), add enough context to clarify what it does. +- If the output exceeds 30000 characters, output will be truncated before being returned to you. +- Always prefer using the dedicated tools for these commands: + - Read files: Use Read (NOT cat/head/tail) + - Edit files: Use Edit (NOT sed/awk) + - Write files: Use Write (NOT echo >/cat < + pytest /foo/bar/tests + + + cd /foo/bar && pytest tests + ```json { @@ -95,10 +97,7 @@ Usage notes: "type": "boolean" } }, - "required": [ - "command", - "sideEffects" - ], + "required": ["command", "sideEffects"], "additionalProperties": false } ``` diff --git a/templates/tools/edit.md b/packages/core/templates/tools/edit.md similarity index 97% rename from templates/tools/edit.md rename to packages/core/templates/tools/edit.md index efa8574d..4f039127 100644 --- a/templates/tools/edit.md +++ b/packages/core/templates/tools/edit.md @@ -3,6 +3,7 @@ Performs scoped string replacements in files. Usage: + - You must use `Read` tool at least once in the conversation before editing to get the required `snippet_id`. This tool will error if you attempt an edit without reading the file. - `snippet_id` defines the search scope. Provide `file_path` only as an optional guard that the snippet belongs to the expected file. - When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. The line number prefix format is: spaces + line number + tab. Everything after that tab is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string. @@ -43,11 +44,7 @@ Usage: "type": "number" } }, - "required": [ - "snippet_id", - "old_string", - "new_string" - ], + "required": ["snippet_id", "old_string", "new_string"], "additionalProperties": false } ``` diff --git a/templates/tools/read.md.ejs b/packages/core/templates/tools/read.md.ejs similarity index 100% rename from templates/tools/read.md.ejs rename to packages/core/templates/tools/read.md.ejs diff --git a/templates/tools/update-plan.md b/packages/core/templates/tools/update-plan.md similarity index 97% rename from templates/tools/update-plan.md rename to packages/core/templates/tools/update-plan.md index 0c74b367..9459242e 100644 --- a/templates/tools/update-plan.md +++ b/packages/core/templates/tools/update-plan.md @@ -3,6 +3,7 @@ Updates the current task plan and progress display. Usage: + - Use this tool for non-trivial multi-step tasks when a task list helps track execution progress. - Pass the complete current task list every time. The latest call replaces the previous visible plan. - The `plan` argument is a markdown string, not an array of step objects. If the requirement is in Chinese, then use Chinese for the markdown as well. @@ -25,9 +26,7 @@ Usage: "type": "string" } }, - "required": [ - "plan" - ], + "required": ["plan"], "additionalProperties": false } ``` diff --git a/templates/tools/web-search.md b/packages/core/templates/tools/web-search.md similarity index 99% rename from templates/tools/web-search.md rename to packages/core/templates/tools/web-search.md index 92e22753..e5eabf0f 100644 --- a/templates/tools/web-search.md +++ b/packages/core/templates/tools/web-search.md @@ -19,9 +19,11 @@ JSON schema: ``` Usage: + - Do not reduce `query` to space-separated keywords. Typical use cases: + - Confirm recent SDK, framework, or API changes - Check current compatibility, deprecations, or migration notes - Look up active issue tracker discussions or recent regressions diff --git a/templates/tools/write.md b/packages/core/templates/tools/write.md similarity index 86% rename from templates/tools/write.md rename to packages/core/templates/tools/write.md index 1a969754..ce774eb3 100644 --- a/templates/tools/write.md +++ b/packages/core/templates/tools/write.md @@ -3,12 +3,13 @@ Writes a file to the local filesystem. Usage: + - This tool will overwrite the existing file if there is one at the provided path. - If this is an existing file, you MUST read the full file first. A partial read is not enough for overwriting an existing file. - `content` must be a single string. If you are writing JSON, serialize the full document to text before calling this tool. - Prefer `Edit` for updating existing files. Use `Write` for new files or intentional full-file rewrites. - ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required. -- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User. +- NEVER proactively create documentation files (\*.md) or README files. Only create documentation files if explicitly requested by the User. - NEVER proactively create one-off test script. Only create one-off test script files if explicitly requested by the User. - Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked. @@ -26,10 +27,7 @@ Usage: "type": "string" } }, - "required": [ - "file_path", - "content" - ], + "required": ["file_path", "content"], "additionalProperties": false } ``` diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 00000000..ac00d953 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "composite": true, + "declaration": true, + "declarationMap": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist", "src/tests"] +} diff --git a/packages/vscode-ide-companion/LICENSE b/packages/vscode-ide-companion/LICENSE new file mode 100644 index 00000000..7fd7a206 --- /dev/null +++ b/packages/vscode-ide-companion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 lessweb + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/vscode-ide-companion/README.md b/packages/vscode-ide-companion/README.md new file mode 100644 index 00000000..ee11be0f --- /dev/null +++ b/packages/vscode-ide-companion/README.md @@ -0,0 +1,94 @@ +# Deep Code + +[Deep Code](https://marketplace.visualstudio.com/items?itemName=vegamo.deepcode-vscode) 是 Visual Studio Code 的 AI 编码助手扩展,专门为最新的 `deepseek-v4` 模型优化。 + +## 配置 + +创建 `~/.deepcode/settings.json` 文件,内容如下: + +```json +{ + "env": { + "MODEL": "deepseek-v4-pro", + "BASE_URL": "https://api.deepseek.com", + "API_KEY": "sk-..." + }, + "thinkingEnabled": true, + "reasoningEffort": "max" +} +``` + +## 主要功能 + +### **Skills** +Deep Code 支持 agent skills,允许您扩展助手的能力: + +- **User-level Skills**:从 `~/.agents/skills/` 目录中发现并激活 skills。 +- **Project-level Skills**:从 `./.agents/skills/` 目录中加载项目专属 skills,并兼容旧的 `./.deepcode/skills/` 目录。 + +### **为 DeepSeek 优化** +- 专门为 DeepSeek 模型性能调优。 +- 通过使用[上下文缓存](https://api-docs.deepseek.com/guides/kv_cache)来降低成本。 +- 原生支持[思考模式](https://api-docs.deepseek.com/guides/thinking_mode)和思考强度控制。 + +## 支持的模型 + +- `deepseek-v4-pro`(推荐使用) +- `deepseek-v4-flash` +- 任何其他 OpenAI 兼容模型 + +## 截图示例 + +![screenshot](resources/deepcode_screenshot.png) + +## Deep Code CLI + +```bash +npm install -g @vegamo/deepcode-cli +``` + +![intro1](https://raw.githubusercontent.com/lessweb/deepcode-cli/main/resources/intro1.png) + +> VSCode插件和CLI共享配置文件和数据,但运行时没有依赖。 + +- GitHub: https://github.com/lessweb/deepcode-cli + +## 常见问题 + +### 如何将 Deep Code 从左侧边栏移动到右侧边栏(Secondary Side Bar)? + +![faq1](resources/faq1.gif) + +### Deep Code是否支持理解图片? + +Deep Code支持多模态,但目前deepseek-v4不支持多模态。有些模型虽然有多模态能力,但对多轮对话请求的限制太严。目前多模态输入推荐使用火山方舟的Doubao-Seed-2.0-pro模型,适配效果最好。 + +### 怎样在任务完成后自动给Slack发消息? + +编写一个调用Slack webhook的Shell通知脚本,然后在`~/.deepcode/settings.json`中将`notify`字段设为该脚本的完整路径即可。详细步骤可参考:https://binfer.net/share/jby5xnc-so6g + +### 是否支持Coding Plan? + +支持。只要把`~/.deepcode/settings.json`的env.BASE_URL配置为OpenAI兼容的接口地址就行。以火山方舟的Coding Plan为例,`~/.deepcode/settings.json`这样配置: + +```json +{ + "env": { + "MODEL": "ark-code-latest", + "BASE_URL": "https://ark.cn-beijing.volces.com/api/coding/v3", + "API_KEY": "**************" + }, + "thinkingEnabled": true +} +``` + +## 获取帮助 +- 在 GitHub Issues 上报告错误或请求功能 (https://github.com/lessweb/deepcode/issues) + +## 支持我们 + +如果你觉得这个插件对你有帮助,请考虑通过以下方式支持我们: + +- 在 GitHub 上给我们一个 Star (https://github.com/lessweb/deepcode) +- 向我们提交反馈和建议 +- 分享给你的朋友和同事 diff --git a/packages/vscode-ide-companion/README_cn.md b/packages/vscode-ide-companion/README_cn.md new file mode 100644 index 00000000..ee11be0f --- /dev/null +++ b/packages/vscode-ide-companion/README_cn.md @@ -0,0 +1,94 @@ +# Deep Code + +[Deep Code](https://marketplace.visualstudio.com/items?itemName=vegamo.deepcode-vscode) 是 Visual Studio Code 的 AI 编码助手扩展,专门为最新的 `deepseek-v4` 模型优化。 + +## 配置 + +创建 `~/.deepcode/settings.json` 文件,内容如下: + +```json +{ + "env": { + "MODEL": "deepseek-v4-pro", + "BASE_URL": "https://api.deepseek.com", + "API_KEY": "sk-..." + }, + "thinkingEnabled": true, + "reasoningEffort": "max" +} +``` + +## 主要功能 + +### **Skills** +Deep Code 支持 agent skills,允许您扩展助手的能力: + +- **User-level Skills**:从 `~/.agents/skills/` 目录中发现并激活 skills。 +- **Project-level Skills**:从 `./.agents/skills/` 目录中加载项目专属 skills,并兼容旧的 `./.deepcode/skills/` 目录。 + +### **为 DeepSeek 优化** +- 专门为 DeepSeek 模型性能调优。 +- 通过使用[上下文缓存](https://api-docs.deepseek.com/guides/kv_cache)来降低成本。 +- 原生支持[思考模式](https://api-docs.deepseek.com/guides/thinking_mode)和思考强度控制。 + +## 支持的模型 + +- `deepseek-v4-pro`(推荐使用) +- `deepseek-v4-flash` +- 任何其他 OpenAI 兼容模型 + +## 截图示例 + +![screenshot](resources/deepcode_screenshot.png) + +## Deep Code CLI + +```bash +npm install -g @vegamo/deepcode-cli +``` + +![intro1](https://raw.githubusercontent.com/lessweb/deepcode-cli/main/resources/intro1.png) + +> VSCode插件和CLI共享配置文件和数据,但运行时没有依赖。 + +- GitHub: https://github.com/lessweb/deepcode-cli + +## 常见问题 + +### 如何将 Deep Code 从左侧边栏移动到右侧边栏(Secondary Side Bar)? + +![faq1](resources/faq1.gif) + +### Deep Code是否支持理解图片? + +Deep Code支持多模态,但目前deepseek-v4不支持多模态。有些模型虽然有多模态能力,但对多轮对话请求的限制太严。目前多模态输入推荐使用火山方舟的Doubao-Seed-2.0-pro模型,适配效果最好。 + +### 怎样在任务完成后自动给Slack发消息? + +编写一个调用Slack webhook的Shell通知脚本,然后在`~/.deepcode/settings.json`中将`notify`字段设为该脚本的完整路径即可。详细步骤可参考:https://binfer.net/share/jby5xnc-so6g + +### 是否支持Coding Plan? + +支持。只要把`~/.deepcode/settings.json`的env.BASE_URL配置为OpenAI兼容的接口地址就行。以火山方舟的Coding Plan为例,`~/.deepcode/settings.json`这样配置: + +```json +{ + "env": { + "MODEL": "ark-code-latest", + "BASE_URL": "https://ark.cn-beijing.volces.com/api/coding/v3", + "API_KEY": "**************" + }, + "thinkingEnabled": true +} +``` + +## 获取帮助 +- 在 GitHub Issues 上报告错误或请求功能 (https://github.com/lessweb/deepcode/issues) + +## 支持我们 + +如果你觉得这个插件对你有帮助,请考虑通过以下方式支持我们: + +- 在 GitHub 上给我们一个 Star (https://github.com/lessweb/deepcode) +- 向我们提交反馈和建议 +- 分享给你的朋友和同事 diff --git a/packages/vscode-ide-companion/README_en.md b/packages/vscode-ide-companion/README_en.md new file mode 100644 index 00000000..40b199bc --- /dev/null +++ b/packages/vscode-ide-companion/README_en.md @@ -0,0 +1,87 @@ +# Deep Code + +[Deep Code](https://marketplace.visualstudio.com/items?itemName=vegamo.deepcode-vscode) is an AI coding assistant extension for Visual Studio Code, specifically optimized for the latest `deepseek-v4` model. + +## Configuration + +Create `~/.deepcode/settings.json` with: + +```json +{ + "env": { + "MODEL": "deepseek-v4-pro", + "BASE_URL": "https://api.deepseek.com", + "API_KEY": "sk-..." + }, + "thinkingEnabled": true, + "reasoningEffort": "max" +} +``` + +## Key Features + +### **Skills** +Deep Code supports agent skills that allows you to extend the assistant's capabilities: + +- **User-level Skills**: discovered and activated from `~/.agents/skills/`. +- **Project-level Skills**: loaded from `./.agents/skills/` for project-specific workflows, with legacy `./.deepcode/skills/` compatibility. + +### **Optimized for DeepSeek** +- Specifically tuned for DeepSeek model performance. +- Reduce costs by using [Context Caching](https://api-docs.deepseek.com/guides/kv_cache). +- Natively supports [Thinking Mode](https://api-docs.deepseek.com/guides/thinking_mode) and Thinking Effort Control. + +## Supported Models + +- `deepseek-v4-pro` (Recommended) +- `deepseek-v4-flash` +- `deepseek-chat` +- Any other OpenAI-compatible model + +## Screenshot + +![screenshot](resources/deepcode_screenshot.png) + +## Deep Code CLI + +```bash +npm install -g @vegamo/deepcode-cli +``` + +![intro1](https://raw.githubusercontent.com/lessweb/deepcode-cli/main/resources/intro1.png) + +> The VSCode plugin and CLI share configuration and data, but they have no dependencies at runtime. + +- GitHub: https://github.com/lessweb/deepcode-cli + +## FAQ + +### How can I move Deep Code from the left sidebar to the right (Secondary Side Bar) in VS Code? + +![faq1](resources/faq1.gif) + +### Does Deep Code support understanding images? + +Deep Code supports multimodal, but `deepseek-v4` does not support multimodal yet. Some models have multimodal capabilities but impose strict limits on multi-turn dialogue requests. For multimodal input, we recommend using the Volcano Ark `Doubao-Seed-2.0-pro` model, which has the best integration. + +### How to automatically send a Slack message after a task completes? + +Write a shell notification script that calls a Slack webhook, then set the `notify` field in `~/.deepcode/settings.json` to the full path of the script. For detailed steps, refer to: https://binfer.net/share/jby5xnc-so6g + +### Does it support Coding Plan? + +Yes. Just set `env.BASE_URL` in `~/.deepcode/settings.json` to an OpenAI-compatible API endpoint. Take Volcano Ark's Coding Plan as an example, configure `~/.deepcode/settings.json` as follows: + +```json +{ + "env": { + "MODEL": "ark-code-latest", + "BASE_URL": "https://ark.cn-beijing.volces.com/api/coding/v3", + "API_KEY": "**************" + }, + "thinkingEnabled": true +} +``` + +## Getting Help +- Report bugs or request features on GitHub Issues (https://github.com/lessweb/deepcode/issues) diff --git a/packages/vscode-ide-companion/package.json b/packages/vscode-ide-companion/package.json new file mode 100644 index 00000000..fd4da3ac --- /dev/null +++ b/packages/vscode-ide-companion/package.json @@ -0,0 +1,95 @@ +{ + "name": "deepcode-vscode", + "version": "0.1.22", + "publisher": "vegamo", + "displayName": "Deep Code", + "description": "Deep Code VSCode companion — AI-assisted development in your editor", + "license": "MIT", + "type": "commonjs", + "main": "./out/extension.js", + "repository": { + "type": "git", + "url": "git+https://github.com/lessweb/deepcode-cli.git" + }, + "engines": { + "vscode": "^1.85.0" + }, + "categories": [ + "AI" + ], + "keywords": [ + "deep-code", + "deep code", + "deep", + "code", + "cli", + "ide integration", + "ide companion" + ], + "icon": "resources/deepcoding_icon.png", + "activationEvents": [], + "files": [ + "out/extension.js", + "resources/**", + "templates/**", + "README.md", + "README_cn.md", + "README_en.md", + "LICENSE" + ], + "contributes": { + "commands": [ + { + "command": "deepcode.openView", + "title": "Open Deep Code", + "icon": { + "light": "resources/deepcoding_icon.svg", + "dark": "resources/deepcoding_icon.svg" + } + } + ], + "viewsContainers": { + "activitybar": [ + { + "id": "deepcode", + "title": "Deep Code", + "icon": "resources/deepcoding_icon.png" + } + ] + }, + "views": { + "deepcode": [ + { + "id": "deepcode.chatView", + "name": "Deep Code", + "icon": "resources/deepcoding_icon.png", + "type": "webview" + } + ] + }, + "menus": { + "editor/title": [ + { + "command": "deepcode.openView", + "group": "navigation@100" + } + ] + } + }, + "scripts": { + "typecheck": "tsc -p ./ --noEmit", + "build": "node ../../scripts/esbuild-vscode.config.js", + "prepublishOnly": "npm run build", + "package": "vsce package --no-dependencies", + "test": "node src/tests/run-tests.mjs" + }, + "dependencies": { + "@vegamo/deepcode-core": "file:../core", + "markdown-it": "^14.2.0" + }, + "devDependencies": { + "@types/markdown-it": "^14.1.1", + "@types/vscode": "^1.85.0", + "@vscode/vsce": "^3.6.0" + } +} diff --git a/packages/vscode-ide-companion/resources/deepcode_screenshot.png b/packages/vscode-ide-companion/resources/deepcode_screenshot.png new file mode 100644 index 00000000..3e1f2a9d Binary files /dev/null and b/packages/vscode-ide-companion/resources/deepcode_screenshot.png differ diff --git a/packages/vscode-ide-companion/resources/deepcoding_icon.png b/packages/vscode-ide-companion/resources/deepcoding_icon.png new file mode 100644 index 00000000..7268ce7e Binary files /dev/null and b/packages/vscode-ide-companion/resources/deepcoding_icon.png differ diff --git a/packages/vscode-ide-companion/resources/deepcoding_icon.svg b/packages/vscode-ide-companion/resources/deepcoding_icon.svg new file mode 100644 index 00000000..cabdba13 --- /dev/null +++ b/packages/vscode-ide-companion/resources/deepcoding_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/vscode-ide-companion/resources/faq1.gif b/packages/vscode-ide-companion/resources/faq1.gif new file mode 100644 index 00000000..93d69449 Binary files /dev/null and b/packages/vscode-ide-companion/resources/faq1.gif differ diff --git a/packages/vscode-ide-companion/resources/prompt-attachments.js b/packages/vscode-ide-companion/resources/prompt-attachments.js new file mode 100644 index 00000000..81bfc174 --- /dev/null +++ b/packages/vscode-ide-companion/resources/prompt-attachments.js @@ -0,0 +1,273 @@ +(function () { + const ATTACHMENT_LABEL = "粘贴的图像"; + const PREVIEW_OFFSET = 10; + + function createElement(tagName, className) { + const element = document.createElement(tagName); + if (className) { + element.className = className; + } + return element; + } + + function isImageFile(file) { + return Boolean(file && typeof file.type === "string" && file.type.startsWith("image/")); + } + + function readFileAsDataUrl(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve(typeof reader.result === "string" ? reader.result : ""); + reader.onerror = () => reject(reader.error || new Error("Failed to read file.")); + reader.readAsDataURL(file); + }); + } + + function pickImageFileFromClipboard(event) { + const items = Array.from(event.clipboardData?.items || []); + for (const item of items) { + if (item.kind !== "file") { + continue; + } + const file = item.getAsFile(); + if (isImageFile(file)) { + return file; + } + } + return null; + } + + function createPromptAttachmentManager(options) { + const promptInput = options?.promptInput; + const inputWrap = options?.inputWrap; + const toolsLine = options?.toolsLine; + const onAttachmentChange = + typeof options?.onAttachmentChange === "function" ? options.onAttachmentChange : function () {}; + + if (!promptInput || !inputWrap || !toolsLine) { + throw new Error("Prompt attachment manager requires promptInput, inputWrap, and toolsLine."); + } + + let attachment = null; + let previewPopup = null; + let previewImage = null; + + function ensurePreviewPopup() { + if (previewPopup) { + return; + } + + previewPopup = createElement("div", "chat-attached-context-preview"); + previewImage = createElement("img", "chat-attached-context-preview-image"); + previewImage.alt = ATTACHMENT_LABEL; + previewPopup.appendChild(previewImage); + document.body.appendChild(previewPopup); + } + + function hidePreview() { + if (!previewPopup) { + return; + } + previewPopup.classList.remove("show"); + } + + function updatePreviewPosition(anchor) { + if (!previewPopup || !anchor) { + return; + } + + const rect = anchor.getBoundingClientRect(); + const popupRect = previewPopup.getBoundingClientRect(); + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + + let left = rect.left; + let top = rect.top - popupRect.height - PREVIEW_OFFSET; + + if (left + popupRect.width > viewportWidth - 12) { + left = viewportWidth - popupRect.width - 12; + } + if (left < 12) { + left = 12; + } + if (top < 12) { + top = rect.bottom + PREVIEW_OFFSET; + } + if (top + popupRect.height > viewportHeight - 12) { + top = Math.max(12, viewportHeight - popupRect.height - 12); + } + + previewPopup.style.left = left + "px"; + previewPopup.style.top = top + "px"; + } + + function showPreview(anchor) { + if (!attachment) { + return; + } + + ensurePreviewPopup(); + previewImage.src = attachment.dataUrl; + previewPopup.classList.add("show"); + updatePreviewPosition(anchor); + } + + function emitChange() { + onAttachmentChange({ + hasAttachments: Boolean(attachment), + attachments: attachment ? [attachment] : [], + }); + } + + function clear() { + attachment = null; + toolsLine.innerHTML = ""; + toolsLine.classList.remove("has-attachment"); + hidePreview(); + emitChange(); + } + + function createAttachmentNode() { + const wrapper = createElement("div", "chat-attached-context-attachment show-file-icons"); + wrapper.tabIndex = 0; + wrapper.setAttribute("role", "button"); + wrapper.setAttribute("aria-label", ATTACHMENT_LABEL + " (删除)"); + wrapper.draggable = true; + + const removeButton = createElement("a", "monaco-button codicon codicon-close"); + removeButton.tabIndex = -1; + removeButton.setAttribute("role", "button"); + removeButton.setAttribute("aria-label", "从上下文中移除"); + removeButton.href = "#"; + removeButton.textContent = "×"; + removeButton.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + clear(); + }); + + const iconLabel = createElement("div", "monaco-icon-label"); + const iconLabelContainer = createElement("div", "monaco-icon-label-container"); + const iconNameContainer = createElement("span", "monaco-icon-name-container"); + iconLabelContainer.appendChild(iconNameContainer); + iconLabel.appendChild(iconLabelContainer); + + const pill = createElement("div", "chat-attached-context-pill"); + const image = createElement("img", "chat-attached-context-pill-image"); + image.src = attachment.dataUrl; + image.alt = ATTACHMENT_LABEL; + pill.appendChild(image); + + const text = createElement("span", "chat-attached-context-custom-text"); + text.textContent = ATTACHMENT_LABEL; + + wrapper.appendChild(removeButton); + wrapper.appendChild(iconLabel); + wrapper.appendChild(pill); + wrapper.appendChild(text); + + const show = () => showPreview(wrapper); + wrapper.addEventListener("mouseenter", show); + wrapper.addEventListener("focus", show); + wrapper.addEventListener("mouseleave", hidePreview); + wrapper.addEventListener("blur", hidePreview); + wrapper.addEventListener("dragstart", (event) => { + event.preventDefault(); + }); + wrapper.addEventListener("keydown", (event) => { + if (event.key === "Delete" || event.key === "Backspace") { + event.preventDefault(); + clear(); + } + }); + + return wrapper; + } + + function render() { + toolsLine.innerHTML = ""; + toolsLine.classList.toggle("has-attachment", Boolean(attachment)); + if (!attachment) { + hidePreview(); + return; + } + toolsLine.appendChild(createAttachmentNode()); + } + + function setAttachmentData(data) { + if (!data?.dataUrl) { + return false; + } + + attachment = { + name: data.name || ATTACHMENT_LABEL, + mimeType: data.mimeType || "image/png", + dataUrl: data.dataUrl, + label: ATTACHMENT_LABEL, + }; + render(); + emitChange(); + return true; + } + + async function setAttachmentFromFile(file) { + if (!isImageFile(file)) { + return false; + } + + const dataUrl = await readFileAsDataUrl(file); + return setAttachmentData({ + name: file.name || ATTACHMENT_LABEL, + mimeType: file.type || "image/png", + dataUrl, + label: ATTACHMENT_LABEL, + }); + } + + async function handlePaste(event) { + const file = pickImageFileFromClipboard(event); + if (!file) { + return; + } + + event.preventDefault(); + try { + await setAttachmentFromFile(file); + } catch (error) { + console.error("Failed to attach pasted image.", error); + } + } + + promptInput.addEventListener("paste", handlePaste); + + window.addEventListener("resize", () => { + const attachmentNode = toolsLine.querySelector(".chat-attached-context-attachment"); + if (previewPopup?.classList.contains("show") && attachmentNode) { + updatePreviewPosition(attachmentNode); + } + }); + + window.addEventListener( + "scroll", + () => { + const attachmentNode = toolsLine.querySelector(".chat-attached-context-attachment"); + if (previewPopup?.classList.contains("show") && attachmentNode) { + updatePreviewPosition(attachmentNode); + } + }, + true + ); + + return { + clear, + hasAttachments() { + return Boolean(attachment); + }, + getImageUrls() { + return attachment ? [attachment.dataUrl] : []; + }, + }; + } + + window.createPromptAttachmentManager = createPromptAttachmentManager; +})(); diff --git a/packages/vscode-ide-companion/resources/webview.css b/packages/vscode-ide-companion/resources/webview.css new file mode 100644 index 00000000..ea1d71a2 --- /dev/null +++ b/packages/vscode-ide-companion/resources/webview.css @@ -0,0 +1,1604 @@ +/* CSS Variables */ +:root { + --bg: var(--vscode-editor-background); + --panel: var(--vscode-sideBar-background); + --panel-2: var(--vscode-editor-inactiveSelectionBackground); + --muted: var(--vscode-descriptionForeground); + --accent: var(--vscode-focusBorder); + --accent-2: var(--vscode-button-background); + --danger: var(--vscode-errorForeground); + --shadow: rgba(0, 0, 0, 0.15); + --border-color: var(--vscode-panel-border); + --prompt-line-height: 18px; + --prompt-min-height: calc(var(--prompt-line-height) * 3 + 20px); + --prompt-max-height: calc(var(--prompt-line-height) * 10 + 20px); +} + +/* Global Styles */ +* { + box-sizing: border-box; +} + +body { + margin: 0; + padding: 0; + height: 100vh; + overflow-x: hidden; + background: var(--bg); + color: var(--vscode-foreground); + font-family: var(--vscode-font-family); + font-size: var(--vscode-font-size); +} + +/* App Container */ +.app { + height: 100vh; + display: flex; + flex-direction: column; + position: relative; + overflow-x: hidden; +} + +/* Header Container */ +.header-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + padding: 4px 16px; + background: var(--vscode-sideBar-background); + border-bottom: 1px solid var(--border-color); + flex-shrink: 0; + position: relative; +} + +.header-left { + position: relative; + min-width: 0; +} + +/* Session Selector */ +.session-selector { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 10px; + background: transparent; + border: none; + border-radius: 4px; + cursor: pointer; + transition: background 0.2s; + width: 100%; +} + +.session-selector:hover { + background: var(--vscode-toolbar-hoverBackground); +} + +.session-selector.open .session-selector-icon { + transform: rotate(180deg); +} + +.session-selector-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: var(--vscode-foreground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: left; +} + +.session-logo { + width: 16px; + height: 16px; + flex-shrink: 0; +} + +.session-title-text { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; +} + +.session-selector-icon { + width: 16px; + height: 16px; + fill: var(--vscode-foreground); + transition: transform 0.2s; + flex-shrink: 0; +} + +/* Header New Button */ +.header-new-btn { + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + transition: background 0.2s; + background: none; + display: flex; + align-items: center; + justify-content: center; + padding: 6px; + flex-shrink: 0; +} + +.header-new-btn:hover { + background: var(--vscode-toolbar-hoverBackground); +} + +.header-new-icon { + width: 16px; + height: 16px; + fill: var(--vscode-foreground); +} + +/* Session Dropdown */ +.session-dropdown { + position: absolute; + top: calc(100% + 8px); + left: 16px; + right: 16px; + background: var(--vscode-dropdown-background); + border: 1px solid var(--border-color); + border-radius: 4px; + max-height: 400px; + z-index: 10000; + display: none; + box-shadow: 0 4px 12px var(--shadow); + flex-direction: column; +} + +.session-dropdown.show { + display: flex; +} + +.session-search-box { + padding: 8px; + flex-shrink: 0; +} + +.session-search-input { + width: 100%; + padding: 6px 10px; + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + font-size: 13px; + outline: none; + font-family: var(--vscode-font-family); + outline: none; +} + +.session-search-input:focus { + border-color: var(--vscode-focusBorder); + outline: none; +} + +.session-search-input::placeholder { + color: var(--vscode-input-placeholderForeground); +} + +.session-dropdown-list { + flex: 1; + overflow-y: auto; + min-height: 0; + padding: 8px 12px 12px; +} + +.session-dropdown-group { + margin-bottom: 12px; +} + +.session-dropdown-group:last-child { + margin-bottom: 0; +} + +.session-dropdown-group-title { + font-size: 11px; + font-weight: 500; + color: var(--vscode-descriptionForeground); + letter-spacing: 0.5px; + padding: 6px 6px 8px; + margin-bottom: 2px; +} + +.session-dropdown-empty { + padding: 20px; + text-align: center; + color: var(--vscode-descriptionForeground); + font-size: 13px; +} + +.session-dropdown-item { + padding: 6px; + cursor: pointer; + transition: background 0.2s; + display: flex; + gap: 12px; + margin-bottom: 6px; + border-radius: 4px; + align-items: center; +} + +.session-dropdown-item:last-child { + margin-bottom: 0; +} + +.session-dropdown-item:hover { + background: var(--vscode-list-hoverBackground); +} + +.session-dropdown-item.active { + background: var(--vscode-list-activeSelectionBackground); +} + +.session-dropdown-item.active .session-dropdown-summary { + color: var(--vscode-list-activeSelectionForeground); +} + +.session-dropdown-item.active .session-dropdown-time { + color: var(--vscode-list-activeSelectionForeground); + opacity: 0.8; +} + +.session-dropdown-summary { + font-size: 13px; + color: var(--vscode-foreground); + margin-bottom: 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; + font-weight: 500; +} + +.session-dropdown-time { + font-size: 11px; + color: var(--vscode-descriptionForeground); +} + +.session-dropdown-summary mark { + background-color: var(--vscode-editor-findMatchHighlightBackground); + color: var(--vscode-editor-foreground); + padding: 0 2px; + border-radius: 2px; +} + +/* Chat Container */ +.chat-container { + display: flex; + flex-direction: column; + flex: 1; + overflow: hidden; + overflow-x: hidden; +} + +.chat-container.hidden { + display: none; +} + +/* Messages */ +.messages { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + padding: 16px; + display: flex; + flex-direction: column; + gap: 1px; + background: var(--vscode-sideBar-background); +} + +/* Message Bubbles */ +.bubble { + padding: 16px; + font-size: 13px; + width: 100%; + border: 1px solid transparent; + color: var(--vscode-foreground); + border-radius: 6px; + position: relative; + overflow-wrap: break-word; + word-break: break-word; +} + +/* Collapsible Bubble */ +.bubble-collapsible-header { + display: flex; + align-items: flex-start; + gap: 8px; + cursor: pointer; + user-select: none; + padding: 4px 0; + position: relative; +} + +.bubble-collapsible-header:hover .bubble-title-text { + opacity: 0.8; +} + +.bubble-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--vscode-descriptionForeground); + flex-shrink: 0; + margin-top: 6px; + position: relative; + z-index: 3; +} + +.bubble-dot.success { + background-color: var(--vscode-terminal-ansiGreen); +} + +.bubble-dot.error { + background-color: var(--vscode-terminal-ansiRed); +} + +/* 连接线:只在有 connect-to-prev class 时显示向上的连接线 */ +.bubble-dot.connect-to-prev::before { + content: ""; + position: absolute; + left: 3.5px; + bottom: 8px; + width: 1px; + height: var(--line-height, 0px); + background-color: var(--vscode-panel-border); + z-index: 0; +} + +.bubble-title { + flex: 1; + font-size: 13px; + color: var(--vscode-foreground); + display: flex; + align-items: center; + gap: 6px; + flex-wrap: nowrap; + min-width: 0; + overflow: visible; +} + +.bubble-title-text { + display: inline-flex; + align-items: center; + gap: 6px; + flex: 1; + min-width: 0; + overflow: visible; +} + +.bubble-title-text b { + text-transform: capitalize; + flex-shrink: 0; +} + +.bubble-title .tool-params { + color: var(--vscode-descriptionForeground); + font-weight: normal; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; + min-width: 0; + position: relative; + display: inline-block; +} + +/* Tooltip styles */ +.tooltip { + position: fixed; + padding: 4px 8px; + background: var(--vscode-editorHoverWidget-background); + color: var(--vscode-editorHoverWidget-foreground); + border: 1px solid var(--vscode-editorHoverWidget-border); + border-radius: 4px; + font-size: 12px; + white-space: normal; + word-break: break-word; + max-width: 400px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + z-index: 10000; + pointer-events: none; + opacity: 0; + visibility: hidden; + transition: + opacity 0.5s, + visibility 0.5s; +} + +.tooltip.show { + opacity: 1; + visibility: visible; +} + +.bubble-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + flex-shrink: 0; + color: var(--vscode-descriptionForeground); + font-size: 12px; +} + +.bubble-toggle svg { + width: 12px; + height: 12px; + fill: var(--vscode-descriptionForeground); + transition: transform 0.2s; +} + +.bubble-toggle.expanded svg { + transform: rotate(180deg); +} + +.bubble-collapsible-content { + margin-top: 8px; + margin-left: 24px; + padding: 8px 12px; + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--border-color); + border-radius: 4px; + overflow: auto; + max-width: calc(100% - 24px); + font-family: var(--vscode-editor-font-family); + font-size: 12px; + white-space: pre-wrap; + word-break: break-word; + max-height: 300px; +} + +.tool-result-details { + display: flex; + flex-direction: column; + gap: 10px; + font-family: var(--vscode-font-family); + white-space: normal; +} + +.tool-result-summary { + color: var(--vscode-foreground); + line-height: 1.5; +} + +.update-plan-result { + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + font-family: var(--vscode-font-family); + font-size: 13px; + line-height: 1.45; + padding: 10px; + white-space: normal; +} + +.update-plan-heading { + color: var(--vscode-foreground); + font-size: 13px; + font-weight: 650; + line-height: 1.35; + margin: 0 0 8px; +} + +.update-plan-heading:not(:first-child) { + margin-top: 12px; +} + +.update-plan-spacer { + height: 6px; +} + +.update-plan-paragraph { + margin: 4px 0; +} + +.update-plan-task, +.update-plan-bullet { + display: grid; + grid-template-columns: 18px 1fr; + gap: 8px; + align-items: flex-start; + margin: 5px 0; + padding-left: calc(var(--plan-indent, 0) * 18px); +} + +.update-plan-status { + width: 14px; + height: 14px; + margin-top: 2px; + border: 1px solid var(--vscode-descriptionForeground); + border-radius: 50%; + color: var(--vscode-editor-background); + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 700; + line-height: 1; +} + +.update-plan-task.status-done .update-plan-status { + background: var(--vscode-testing-iconPassed, #2ea043); + border-color: var(--vscode-testing-iconPassed, #2ea043); +} + +.update-plan-task.status-active .update-plan-status { + background: var(--vscode-charts-blue, #3794ff); + border-color: var(--vscode-charts-blue, #3794ff); +} + +.update-plan-task.status-attention .update-plan-status { + background: var(--vscode-testing-iconFailed, #f85149); + border-color: var(--vscode-testing-iconFailed, #f85149); +} + +.update-plan-task.status-todo .update-plan-status { + background: transparent; +} + +.update-plan-task.status-done .update-plan-task-text { + color: var(--vscode-descriptionForeground); + text-decoration: line-through; +} + +.update-plan-bullet-marker { + color: var(--vscode-descriptionForeground); + line-height: 1.45; + text-align: center; +} + +.update-plan-markdown code { + border-radius: 3px; + background: var(--vscode-textCodeBlock-background); + font-family: var(--vscode-editor-font-family); + font-size: 0.92em; + padding: 1px 4px; +} + +.tool-result-file-row { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.tool-result-label { + color: var(--vscode-descriptionForeground); + font-size: 11px; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.tool-result-filepath { + border: none; + background: none; + color: var(--vscode-textLink-foreground, var(--vscode-button-background)); + cursor: pointer; + font: inherit; + padding: 0; + text-decoration: underline; + text-underline-offset: 2px; + word-break: break-all; +} + +.tool-result-filepath:hover { + color: var(--vscode-textLink-activeForeground, var(--vscode-button-hoverBackground)); +} + +.tool-result-diff { + display: flex; + flex-direction: column; + gap: 6px; +} + +.diff-preview { + border: 1px solid var(--border-color); + border-radius: 6px; + overflow: hidden; + background: var(--vscode-editor-background); +} + +.diff-line { + display: grid; + grid-template-columns: 20px 1fr; + gap: 0; + font-family: var(--vscode-editor-font-family); + font-size: 12px; + line-height: 1.2; +} + +.diff-line-marker { + display: flex; + align-items: flex-start; + justify-content: center; + padding: 1px 0; + color: var(--vscode-descriptionForeground); + user-select: none; +} + +.diff-line-content { + display: block; + padding: 1px 10px 1px 0; + white-space: pre-wrap; + word-break: break-word; +} + +.diff-line.added { + background: color-mix( + in srgb, + var(--vscode-diffEditor-insertedLineBackground, rgba(46, 160, 67, 0.18)) 100%, + transparent + ); +} + +.diff-line.removed { + background: color-mix( + in srgb, + var(--vscode-diffEditor-removedLineBackground, rgba(248, 81, 73, 0.16)) 100%, + transparent + ); +} + +.diff-line.context { + background: var(--vscode-editor-background); +} + +/* assistant 角色的展开内容无边框 */ +.bubble.assistant .bubble-collapsible-content { + border: none; + background: transparent; + padding: 8px 0; +} + +.bubble-collapsible-content.collapsed { + display: none; +} + +/* 普通assistant气泡布局 */ +.bubble.assistant:has(.bubble-normal-content) { + display: flex; + align-items: flex-start; + gap: 8px; +} + +.bubble.assistant:has(.bubble-normal-content) > .bubble-dot { + margin-top: 6px; +} + +.bubble-normal-content { + flex: 1; + min-width: 0; +} + +/* 复制按钮 */ +.bubble-copy-btn { + display: none; + position: absolute; + top: 8px; + right: 8px; + width: 26px; + height: 26px; + border: 1px solid var(--border-color); + border-radius: 4px; + background: var(--vscode-editor-background); + color: var(--vscode-descriptionForeground); + cursor: pointer; + align-items: center; + justify-content: center; + transition: + opacity 0.15s, + background 0.15s; + z-index: 5; +} + +.bubble-copy-btn:hover { + background: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); +} + +.bubble-copy-btn.copied { + color: var(--vscode-testing-iconPassed, #2ea043); + border-color: var(--vscode-testing-iconPassed, #2ea043); +} + +.bubble-copy-btn svg { + width: 14px; + height: 14px; + fill: currentColor; + pointer-events: none; +} + +.bubble.assistant:hover .bubble-copy-btn { + display: flex; +} + +.bubble.user { + background: var(--vscode-editor-background); + border-color: var(--vscode-panel-border); + padding: 4px 6px; + margin: 12px 0 12px auto; + white-space: pre-wrap; + word-break: break-word; + width: fit-content; + max-width: 80%; +} + +.bubble.system { + background: transparent; + border-color: transparent; + padding: 4px 16px; +} + +.bubble.assistant { + background: transparent; + border-color: transparent; + padding: 4px 16px; +} + +.bubble.tool { + background: transparent; + border-color: transparent; + padding: 4px 16px; +} + +.bubble p { + margin: 8px 0; + overflow-wrap: break-word; + word-break: break-word; +} + +.bubble p:first-of-type { + margin-top: 0; +} + +.bubble p:last-of-type { + margin-bottom: 0; +} + +.bubble pre { + padding: 12px; + border-radius: 4px; + overflow-x: auto; + max-width: 100%; + color: var(--vscode-editor-foreground); + background: var(--vscode-textCodeBlock-background); + margin: 8px 0; + border: 1px solid var(--vscode-panel-border); + white-space: pre-wrap; + word-break: break-word; +} + +.bubble code { + font-family: var(--vscode-editor-font-family); + font-size: 12px; + color: var(--vscode-editor-foreground); + background-color: unset; + overflow-wrap: break-word; + word-break: break-word; +} + +.ask-user-question { + display: flex; + flex-direction: column; + gap: 12px; + font-family: var(--vscode-font-family); + font-size: 13px; + white-space: normal; +} + +.ask-user-question-intro { + color: var(--vscode-descriptionForeground); +} + +.ask-user-question-form { + display: flex; + flex-direction: column; + gap: 12px; +} + +.ask-user-question-content { + overflow: visible; + max-height: none; +} + +.ask-user-question-block { + border: 1px solid var(--border-color); + border-radius: 6px; + padding: 12px; + margin: 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.ask-user-question-title { + padding: 0 4px; + font-weight: 600; +} + +.ask-user-question-option { + display: flex; + align-items: flex-start; + gap: 8px; + cursor: pointer; +} + +.ask-user-question-option input { + margin: 2px 0 0; +} + +.ask-user-question-option-text { + display: flex; + flex-direction: column; + gap: 2px; +} + +.ask-user-question-option-description { + color: var(--vscode-descriptionForeground); + font-size: 12px; +} + +.ask-user-question-other { + display: flex; + flex-direction: column; + gap: 6px; +} + +.ask-user-question-other-label { + font-size: 12px; + color: var(--vscode-descriptionForeground); +} + +.ask-user-question-other textarea { + min-height: 56px; + max-height: 120px; + resize: none; + padding: 8px 10px; + border: 1px solid var(--border-color); + border-radius: 4px; + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); +} + +.ask-user-question-actions { + margin-top: 10px; +} + +.ask-user-question-error { + color: var(--vscode-errorForeground); + font-size: 12px; + display: none; + margin-bottom: 6px; +} + +.ask-user-question-error:not(:empty) { + display: block; +} + +.ask-user-question-submit { + align-self: flex-start; + border: 1px solid transparent; + border-radius: 4px; + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + padding: 6px 12px; + cursor: pointer; + font-size: 12px; +} + +.ask-user-question-submit:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.ask-user-question-empty { + color: var(--vscode-descriptionForeground); +} + +.permission-prompt-host { + margin-bottom: 10px; +} + +.permission-card { + border: 1px solid var(--vscode-panel-border); + border-left: 3px solid var(--vscode-notificationsWarningIcon-foreground, #f59e0b); + border-radius: 6px; + background: var(--vscode-input-background); + box-shadow: 0 4px 14px var(--shadow); + padding: 12px; +} + +.permission-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.permission-title { + color: var(--vscode-notificationsWarningIcon-foreground, #f59e0b); + font-weight: 700; +} + +.permission-progress { + margin-top: 2px; + color: var(--vscode-descriptionForeground); + font-size: 11px; +} + +.permission-close { + border: none; + border-radius: 4px; + background: transparent; + color: var(--vscode-descriptionForeground); + cursor: pointer; + font-size: 18px; + line-height: 1; + padding: 0 4px; +} + +.permission-close:hover { + background: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); +} + +.permission-tool { + margin-top: 10px; + font-weight: 700; +} + +.permission-command { + margin-top: 6px; + border-radius: 4px; + background: var(--vscode-textCodeBlock-background); + color: var(--vscode-editor-foreground); + font-family: var(--vscode-editor-font-family); + font-size: 12px; + line-height: 1.45; + padding: 8px; + white-space: pre-wrap; + word-break: break-word; +} + +.permission-description { + margin-top: 8px; + color: var(--vscode-descriptionForeground); + line-height: 1.45; +} + +.permission-scope { + display: inline-flex; + align-items: center; + margin-top: 10px; + border-radius: 999px; + font-size: 11px; + font-weight: 700; + padding: 3px 8px; +} + +.permission-scope.risk-low { + background: rgba(34, 197, 94, 0.14); + color: #22c55e; +} + +.permission-scope.risk-medium { + background: rgba(245, 158, 11, 0.14); + color: #f59e0b; +} + +.permission-scope.risk-high { + background: rgba(239, 68, 68, 0.14); + color: #ef4444; +} + +.permission-question { + margin-top: 10px; + font-weight: 600; +} + +.permission-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 10px; +} + +.permission-action { + border: 1px solid var(--vscode-button-border, transparent); + border-radius: 4px; + background: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + cursor: pointer; + font-size: 12px; + padding: 6px 10px; +} + +.permission-action:hover { + background: var(--vscode-button-secondaryHoverBackground); +} + +.permission-allow, +.permission-always { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +.permission-allow:hover, +.permission-always:hover { + background: var(--vscode-button-hoverBackground); +} + +.permission-deny { + border-color: var(--vscode-inputValidation-errorBorder, #ef4444); + color: var(--vscode-errorForeground, #ef4444); +} + +.permission-denied-card { + border-left-color: var(--vscode-errorForeground, #ef4444); +} + +.permission-denied-card .permission-title { + color: var(--vscode-errorForeground, #ef4444); +} + +/* Spinner dot for live thinking bubble */ +.bubble-dot.spinner-dot { + background: transparent !important; +} + +/* 旋转环用 ::after 实现,不影响 ::before 连线 */ +.bubble-dot.spinner-dot::after { + content: ""; + position: absolute; + top: -2px; + left: -2px; + width: calc(100% + 4px); + height: calc(100% + 4px); + border-radius: 50%; + border: 2px solid var(--vscode-progressBar-background); + border-top-color: var(--accent); + animation: spin 0.8s linear infinite; + box-sizing: border-box; + pointer-events: none; + z-index: 1; +} + +/* Thinking bubble: 标题和内容同行显示 */ +.bubble[data-thinking-live="true"] .thinking-status { + color: var(--vscode-descriptionForeground); + font-weight: normal; + font-size: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; + min-width: 0; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +/* Composer */ +.composer { + position: relative; + padding: 12px 16px 16px; + background: var(--vscode-sideBar-background); + flex-shrink: 0; +} + +.input-wrap { + position: relative; + display: flex; + flex-direction: column; + min-height: calc(var(--prompt-min-height) + 42px); + border-radius: 4px; + border: 1px solid var(--border-color); + background: var(--vscode-input-background); + transition: + border-color 0.15s ease, + outline-color 0.15s ease, + background-color 0.15s ease; +} + +.input-wrap:focus-within { + border-color: var(--vscode-focusBorder); + outline: 1px solid var(--vscode-focusBorder); +} + +.tools-line { + display: none; + align-items: center; + gap: 8px; + min-height: 0; + padding: 0 12px; +} + +.tools-line.has-attachment { + display: flex; + min-height: 34px; + padding: 10px 12px 0; +} + +.composer-footer { + display: flex; + height: 42px; + width: 100%; + align-items: center; + justify-content: space-between; + gap: 8px; + padding: 6px 12px; + position: relative; +} + +/* Textarea */ +textarea { + width: 100%; + min-height: var(--prompt-min-height); + max-height: var(--prompt-max-height); + resize: none; + overflow-y: hidden; + border: none; + border-radius: 4px; + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); + padding: 10px 12px; + font-size: 13px; + line-height: var(--prompt-line-height); + outline: none; + font-family: var(--vscode-font-family); +} + +textarea:focus { + outline: none; +} + +textarea::placeholder { + color: var(--vscode-input-placeholderForeground); +} + +.chat-attached-context-attachment { + display: inline-flex; + align-items: center; + gap: 6px; + min-width: 0; + max-width: 100%; + padding: 4px; + border: 1px solid var(--vscode-editorWidget-background, var(--vscode-input-background)); + border-radius: 6px; + color: var(--vscode-foreground); +} + +.chat-attached-context-attachment:hover { + border-color: var(--vscode-focusBorder); +} + +.chat-attached-context-attachment .monaco-button.codicon-close { + display: inline-flex; + justify-content: center; + width: 18px; + height: 18px; + border-radius: 50%; + color: var(--vscode-descriptionForeground); + text-decoration: none; + flex-shrink: 0; +} + +.chat-attached-context-attachment .monaco-button.codicon-close:hover { + background: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); +} + +.monaco-icon-label, +.monaco-icon-label-container, +.monaco-icon-name-container { + display: none; +} + +.chat-attached-context-pill { + width: 13px; + height: 13px; + border-radius: 4px; + overflow: hidden; + flex-shrink: 0; + background: var(--vscode-editor-background); +} + +.chat-attached-context-pill-image { + display: block; + width: 13px; + height: 13px; + margin: 1.5px; + object-fit: cover; + border-radius: 2px; +} + +.chat-attached-context-custom-text { + font-size: 12px; + line-height: 1.2; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.chat-attached-context-preview { + position: fixed; + display: none; + padding: 10px; + border: 1px solid var(--border-color); + border-radius: 12px; + background: var(--vscode-editorHoverWidget-background, var(--vscode-editorWidget-background)); + box-shadow: 0 8px 24px var(--shadow); + z-index: 10001; + pointer-events: none; +} + +.chat-attached-context-preview.show { + display: block; +} + +.chat-attached-context-preview-image { + display: block; + max-width: min(520px, 70vw); + max-height: min(420px, 65vh); + border-radius: 6px; + object-fit: contain; +} + +/* Send Button */ +.send-button { + width: 30px; + height: 30px; + border-radius: 50%; + border: none; + cursor: pointer; + display: grid; + place-items: center; + background: transparent; +} + +.context-meter { + position: relative; + width: 18px; + height: 18px; + display: grid; + place-items: center; + flex-shrink: 0; + z-index: 3; +} + +.context-meter-ring { + --context-percent: 0%; + width: 14px; + height: 14px; + border-radius: 50%; + background: + radial-gradient(circle at center, var(--vscode-input-background) 36%, transparent 38%), + conic-gradient( + var(--vscode-descriptionForeground) 0 var(--context-percent), + var(--vscode-editorWidget-border, var(--vscode-panel-border)) var(--context-percent) 100% + ); +} + +.context-meter:hover .context-meter-ring { + filter: brightness(1.1); +} + +.context-meter-tooltip { + position: fixed; + left: 16px; + bottom: calc(100% + 10px); + display: none; + width: min(360px, calc(100vw - 32px)); + max-height: min(420px, 70vh); + overflow: auto; + padding: 12px 14px; + border: 1px solid var(--vscode-editorHoverWidget-border, var(--border-color)); + border-radius: 12px; + background: var(--vscode-editorHoverWidget-background, var(--vscode-editorWidget-background)); + color: var(--vscode-editorHoverWidget-foreground, var(--vscode-foreground)); + box-shadow: 0 8px 24px var(--shadow); + font-size: 12px; + line-height: 1.4; + pointer-events: none; + z-index: 10002; +} + +.context-meter:hover .context-meter-tooltip { + display: block; +} + +.context-tooltip-title { + text-align: center; + color: var(--vscode-descriptionForeground); + font-size: 13px; + margin-bottom: 4px; +} + +.context-tooltip-summary { + text-align: center; + font-size: 16px; + font-weight: 600; + margin-bottom: 10px; +} +.context-tooltip-section { + margin-top: 10px; + padding-top: 8px; + border-top: 1px solid var(--border-color); + color: var(--vscode-descriptionForeground); + font-weight: 600; +} + +.context-tooltip-row { + display: flex; + justify-content: space-between; + gap: 12px; + margin-top: 4px; +} + +.context-tooltip-label { + min-width: 0; + color: var(--vscode-descriptionForeground); + overflow-wrap: anywhere; +} + +.context-tooltip-value { + max-width: 55%; + text-align: right; + font-family: var(--vscode-editor-font-family); + overflow-wrap: anywhere; +} + +.send-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.send-icon { + width: 26px; + height: 26px; + fill: currentColor; + color: var(--vscode-foreground); + transition: opacity 0.2s; +} + +#sendIcon { + color: var(--vscode-descriptionForeground); +} + +#stopIcon { + display: none; + color: var(--vscode-foreground); +} + +.send-icon.empty { + opacity: 0.6; +} + +/* Skills Button */ +.skills-button { + height: 22px; + border-radius: 4px; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + background: transparent; + padding: 0; + transition: opacity 0.2s; + flex-shrink: 0; + color: var(--vscode-foreground); +} + +.skills-button span { + margin-top: 4px; +} + +.skills-button:hover { + opacity: 0.8; +} + +.skills-button svg { + width: 16px; + height: 16px; + fill: var(--vscode-foreground); +} + +/* Skills Popup */ +.skills-popup { + position: absolute; + bottom: calc(100% + 8px); + left: 16px; + right: 16px; + background: var(--vscode-dropdown-background); + border: 1px solid var(--border-color); + border-radius: 4px; + max-height: 300px; + overflow-y: auto; + z-index: 10000; + display: none; + box-shadow: 0 4px 12px var(--shadow); +} + +.skills-popup.show { + display: block; +} + +.skills-popup-header { + padding: 8px 12px; + font-size: 12px; + font-weight: 500; + color: var(--vscode-descriptionForeground); + border-bottom: 1px solid var(--border-color); +} + +.skills-popup-list { + padding: 8px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.skills-popup-empty { + padding: 12px; + text-align: center; + color: var(--vscode-descriptionForeground); + font-size: 13px; +} + +.skills-popup-item { + display: flex; + align-items: center; + padding: 6px 10px; + cursor: pointer; + border-radius: 4px; + font-size: 13px; + transition: background 0.2s; + gap: 8px; +} + +.skills-popup-item:hover { + background: var(--vscode-list-hoverBackground); +} + +.skills-popup-item.selected { + background: var(--vscode-list-activeSelectionBackground); + color: var(--vscode-list-activeSelectionForeground); +} + +.skills-popup-item-name { + flex: 0 0 120px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.skills-popup-item-path { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--vscode-descriptionForeground); + font-size: 12px; +} + +.skills-popup-item:hover .skills-popup-item-path, +.skills-popup-item.selected .skills-popup-item-path { + color: inherit; +} + +.skills-popup-item-loaded { + color: var(--vscode-testing-icon-success); + font-weight: bold; + font-size: 14px; + margin-left: 4px; +} + +/* Skills Bar (contains button and tags) */ +.skills-bar { + display: flex; + align-items: center; + gap: 8px; + width: calc(100% - 60px); +} + +/* Skills Tags */ +.skills-tags { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px; + flex: 1; + min-width: 0; +} + +.skills-tags-inner { + width: 100%; + overflow: auto; + white-space: nowrap; + scrollbar-width: none; + -ms-overflow-style: none; +} + +.skills-tags-inner::-webkit-scrollbar { + width: 0; + height: 0; +} + +.skill-tag { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 6px; + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border-radius: 4px; + font-size: 12px; + margin-right: 4px; +} + +.skill-tag-name { + max-width: 120px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.skill-tag-remove { + cursor: pointer; + font-size: 14px; + line-height: 1; + opacity: 0.7; + transition: opacity 0.2s; +} + +.skill-tag-remove:hover { + opacity: 1; +} + +/* Prevent horizontal overflow for all markdown content */ +.bubble table { + display: block; + overflow-x: auto; + max-width: 100%; +} + +.bubble img { + max-width: 100%; + height: auto; +} + +.bubble ul, +.bubble ol { + padding-left: 1.5em; + overflow-wrap: break-word; +} + +.bubble li { + overflow-wrap: break-word; + word-break: break-word; +} + +.bubble blockquote { + overflow-wrap: break-word; + word-break: break-word; +} + +.bubble a { + overflow-wrap: break-word; + word-break: break-all; +} diff --git a/packages/vscode-ide-companion/resources/webview.html b/packages/vscode-ide-companion/resources/webview.html new file mode 100644 index 00000000..1290f8d6 --- /dev/null +++ b/packages/vscode-ide-companion/resources/webview.html @@ -0,0 +1,2354 @@ + + + + + + + Deep Code + + + +
+
+
+
+
+ + Deep Code +
+ +
+
+ +
+
+ + +
+
+
+ +
+
Select Skills
+
+
+ +
+
+ + +
+
+
+
+ + + + + diff --git a/packages/vscode-ide-companion/src/extension.ts b/packages/vscode-ide-companion/src/extension.ts new file mode 100644 index 00000000..44542e79 --- /dev/null +++ b/packages/vscode-ide-companion/src/extension.ts @@ -0,0 +1,562 @@ +import * as vscode from "vscode"; +import * as fs from "fs"; +import * as path from "path"; +import * as os from "os"; +import OpenAI from "openai"; +import MarkdownIt from "markdown-it"; +import type { SessionMessage } from "@vegamo/deepcode-core"; +import { + SessionManager, + getCompactPromptTokenThreshold, + type LlmStreamProgress, + type PermissionScope, + type SessionEntry, + type SkillInfo, + type UserPromptContent, + type UserToolPermission, + resolveSettingsSources, + type DeepcodingSettings, + type ReasoningEffort, + type ResolvedDeepcodingSettings, + setShellIfWindows, +} from "@vegamo/deepcode-core"; +import { getNonce } from "./utils.js"; +import { handleWebviewMessage } from "./provider.js"; + +const DEFAULT_MODEL = "deepseek-v4-pro"; +const DEFAULT_BASE_URL = "https://api.deepseek.com"; + +type ReasoningMessageParams = { + reasoning_content?: string; +}; + +export class DeepCodeViewProvider implements vscode.WebviewViewProvider { + public static readonly viewType = "deepcode.chatView"; + + private readonly context: vscode.ExtensionContext; + private webviewView: vscode.WebviewView | undefined; + private readonly md: MarkdownIt; + private readonly sessionManager: SessionManager; + + constructor(context: vscode.ExtensionContext) { + this.context = context; + this.md = new MarkdownIt({ + html: false, + linkify: false, + breaks: true, + }); + this.sessionManager = new SessionManager({ + projectRoot: this.getWorkspaceRoot(), + createOpenAIClient: () => this.createOpenAIClient(), + getResolvedSettings: () => this.resolveCurrentSettings(), + renderMarkdown: (text) => this.md.render(text), + onAssistantMessage: (message: SessionMessage, shouldConnect: boolean) => { + if (!this.webviewView) { + return; + } + if (message.visible === false) { + return; + } + if (message.role !== "tool") { + const reasoningContent = (message.messageParams as ReasoningMessageParams | null)?.reasoning_content; + message.html = this.md.render(message.content || reasoningContent || ""); + } + this.webviewView.webview.postMessage({ type: "appendMessage", message, shouldConnect }); + }, + onSessionEntryUpdated: (entry) => { + if (!this.webviewView) { + return; + } + this.webviewView.webview.postMessage({ + type: "sessionStatus", + sessionId: entry.id, + status: entry.status, + askPermissions: entry.askPermissions, + processes: this.serializeProcesses(entry.processes), + tokenTelemetry: this.buildTokenTelemetry(entry), + }); + }, + onLlmStreamProgress: (progress: LlmStreamProgress) => { + if (!this.webviewView) { + return; + } + this.webviewView.webview.postMessage({ + type: "llmStreamProgress", + progress, + }); + }, + }); + void this.initializeMcpServers(); + } + + dispose(): void { + this.sessionManager.dispose(); + } + + resolveWebviewView(webviewView: vscode.WebviewView): void { + this.webviewView = webviewView; + + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [this.context.extensionUri], + }; + + webviewView.webview.html = this.getWebviewHtml(webviewView.webview); + + webviewView.webview.onDidReceiveMessage(async (message) => { + const msg = message as Record | undefined; + + // openFile requires vscode API, handle here directly + if (msg?.type === "openFile") { + const filePath = String(msg.filePath || "").trim(); + const line = Number(msg.line || 1); + if (filePath) { + await this.openFileInEditor(filePath, line); + } + return; + } + + const handled = await handleWebviewMessage(message, { + sessionManager: this.sessionManager, + postMessage: (m) => this.webviewView?.webview.postMessage(m), + renderMarkdown: (text) => this.md.render(text), + copyToClipboard: (text) => void vscode.env.clipboard.writeText(text), + }); + + if (!handled) { + // unrecognized message type — no-op + } + }); + } + + private async loadInitialSession(): Promise { + const sessions = this.sessionManager.listSessions(); + const sessionsList = sessions.map((s) => ({ + id: s.id, + summary: s.summary || "Untitled", + createTime: s.createTime, + updateTime: s.updateTime, + status: s.status, + })); + + if (sessions.length === 0) { + // 没有历史会话,显示新对话界面 + this.sendMessage({ + type: "initializeEmpty", + sessions: sessionsList, + status: null, + tokenTelemetry: this.buildTokenTelemetry(null), + }); + return; + } + + // 显示最新的对话 + const latestSession = sessions[0]; + this.loadSession(latestSession.id); + } + + private loadSession(sessionId: string): void { + const session = this.sessionManager.getSession(sessionId); + if (!session) { + return; + } + + // 设置为活动会话 + this.sessionManager.setActiveSessionId(sessionId); + + const messages = this.sessionManager.listSessionMessages(sessionId); + + // 获取所有会话列表 + const sessions = this.sessionManager.listSessions(); + const sessionsList = sessions.map((s) => ({ + id: s.id, + summary: s.summary || "Untitled", + createTime: s.createTime, + updateTime: s.updateTime, + status: s.status, + })); + + // 发送对话信息到 webview + this.sendMessage({ + type: "loadSession", + sessionId, + summary: session.summary || "Untitled", + status: session.status, + askPermissions: session.askPermissions, + processes: this.serializeProcesses(session.processes), + tokenTelemetry: this.buildTokenTelemetry(session), + sessions: sessionsList, + messages: messages + .filter((m) => m.visible) + .map((m) => ({ + role: m.role, + content: m.content, + html: + m.role !== "tool" + ? this.md.render(m.content || (m.messageParams as ReasoningMessageParams | null)?.reasoning_content || "") + : undefined, + meta: m.meta, + })), + }); + } + + private showSessionsList(): void { + const sessions = this.sessionManager.listSessions(); + this.sendMessage({ + type: "showSessionsList", + sessions: sessions.map((s) => ({ + id: s.id, + summary: s.summary || "Untitled", + createTime: s.createTime, + updateTime: s.updateTime, + status: s.status, + })), + }); + } + + private async createNewSession(): Promise { + // 清除当前活动会话 + this.sessionManager.setActiveSessionId(null); + + // 获取所有会话列表 + const sessions = this.sessionManager.listSessions(); + const sessionsList = sessions.map((s) => ({ + id: s.id, + summary: s.summary || "Untitled", + createTime: s.createTime, + updateTime: s.updateTime, + status: s.status, + })); + + this.sendMessage({ + type: "initializeEmpty", + sessions: sessionsList, + status: null, + tokenTelemetry: this.buildTokenTelemetry(null), + }); + await this.sendSkillsList(); + } + + private sendMessage(message: unknown): void { + if (!this.webviewView) { + return; + } + this.webviewView.webview.postMessage(message); + } + + private async sendSkillsList(sessionId?: string): Promise { + if (!this.webviewView) { + return; + } + const skills = await this.sessionManager.listSkills( + sessionId ?? this.sessionManager.getActiveSessionId() ?? undefined + ); + this.sendMessage({ type: "skillsList", skills }); + } + + private async handlePrompt( + prompt: string, + skills?: SkillInfo[], + imageUrls?: string[], + options: { permissions?: UserToolPermission[]; alwaysAllows?: PermissionScope[] } = {} + ): Promise { + if (!this.webviewView) { + return; + } + + const webview = this.webviewView.webview; + const normalizedImages = Array.isArray(imageUrls) ? imageUrls.filter(Boolean) : []; + const displayPrompt = prompt || (normalizedImages.length > 0 ? "粘贴的图像" : ""); + const isPermissionContinue = + prompt === "/continue" && + normalizedImages.length === 0 && + ((options.permissions?.length ?? 0) > 0 || (options.alwaysAllows?.length ?? 0) > 0); + + // 先显示用户消息(原始文本,不做 HTML 格式化) + if (displayPrompt && !isPermissionContinue) { + webview.postMessage({ type: "userMessage", content: displayPrompt }); + } + + webview.postMessage({ type: "loading", value: true }); + + try { + const userPrompt: UserPromptContent = { + text: prompt, + skills, + imageUrls: normalizedImages, + permissions: options.permissions, + alwaysAllows: options.alwaysAllows, + }; + await this.sessionManager.handleUserPrompt(userPrompt); + await this.sendSkillsList(); + + const activeSessionId = this.sessionManager.getActiveSessionId(); + const activeSession = activeSessionId ? this.sessionManager.getSession(activeSessionId) : null; + if (activeSessionId && activeSession) { + webview.postMessage({ + type: "sessionStatus", + sessionId: activeSessionId, + status: activeSession.status, + askPermissions: activeSession.askPermissions, + processes: this.serializeProcesses(activeSession.processes), + tokenTelemetry: this.buildTokenTelemetry(activeSession), + }); + } + + // 发送更新后的会话列表(可能创建了新会话) + const sessions = this.sessionManager.listSessions(); + const sessionsList = sessions.map((s) => ({ + id: s.id, + summary: s.summary || "Untitled", + createTime: s.createTime, + updateTime: s.updateTime, + status: s.status, + })); + webview.postMessage({ + type: "showSessionsList", + sessions: sessionsList, + }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + webview.postMessage({ + type: "assistant", + html: this.md.render(`Request failed: ${message}`), + }); + } finally { + webview.postMessage({ type: "loading", value: false }); + } + } + + private handlePermissionDenied(sessionId: string): void { + this.sessionManager.denySessionPermission(sessionId); + const session = this.sessionManager.getSession(sessionId); + if (session) { + this.sendMessage({ + type: "sessionStatus", + sessionId, + status: session.status, + askPermissions: session.askPermissions, + processes: this.serializeProcesses(session.processes), + tokenTelemetry: this.buildTokenTelemetry(session), + }); + } + this.showSessionsList(); + } + + private createOpenAIClient(): { + client: OpenAI | null; + model: string; + baseURL: string; + thinkingEnabled: boolean; + reasoningEffort: ReasoningEffort; + debugLogEnabled: boolean; + notify?: string; + webSearchTool?: string; + env?: Record; + machineId?: string; + } { + const settings = this.resolveCurrentSettings(); + + const { apiKey, baseURL, model, thinkingEnabled, reasoningEffort, debugLogEnabled, notify, webSearchTool, env } = + settings; + const machineId = vscode.env.machineId; + + if (!apiKey) { + return { + client: null, + model, + baseURL, + thinkingEnabled, + reasoningEffort, + debugLogEnabled, + notify, + webSearchTool, + env, + machineId, + }; + } + + const client = new OpenAI({ + apiKey, + baseURL: baseURL || undefined, + }); + + return { + client, + model, + baseURL, + thinkingEnabled, + reasoningEffort, + debugLogEnabled, + notify, + webSearchTool, + env, + machineId, + }; + } + + private buildTokenTelemetry(session: SessionEntry | null): { + model: string; + thinkingEnabled: boolean; + reasoningEffort: ReasoningEffort; + activeTokens: number; + compactPromptTokenThreshold: number; + usage: unknown | null; + } { + const settings = this.resolveCurrentSettings(); + return { + model: settings.model, + thinkingEnabled: settings.thinkingEnabled, + reasoningEffort: settings.reasoningEffort, + activeTokens: session?.activeTokens ?? 0, + compactPromptTokenThreshold: getCompactPromptTokenThreshold(settings.model), + usage: session?.usage ?? null, + }; + } + + private async initializeMcpServers(): Promise { + try { + await this.sessionManager.initMcpServers(this.resolveCurrentSettings().mcpServers); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + void vscode.window.showErrorMessage(`Failed to initialize MCP servers: ${message}`); + } + } + + private resolveCurrentSettings(): ResolvedDeepcodingSettings { + return resolveSettingsSources( + this.readUserSettings(), + this.readProjectSettings(), + { + model: DEFAULT_MODEL, + baseURL: DEFAULT_BASE_URL, + }, + process.env + ); + } + + private readUserSettings(): DeepcodingSettings | null { + try { + const settingsPath = path.join(os.homedir(), ".deepcode", "settings.json"); + if (!fs.existsSync(settingsPath)) { + return null; + } + + const raw = fs.readFileSync(settingsPath, "utf8"); + return JSON.parse(raw) as DeepcodingSettings; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to read ~/.deepcode/settings.json: ${message}`); + return null; + } + } + + private readProjectSettings(): DeepcodingSettings | null { + const workspaceRoot = this.getWorkspaceRoot(); + try { + const settingsPath = path.join(workspaceRoot, ".deepcode", "settings.json"); + if (!fs.existsSync(settingsPath)) { + return null; + } + + const raw = fs.readFileSync(settingsPath, "utf8"); + return JSON.parse(raw) as DeepcodingSettings; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage( + `Failed to read ${path.join(workspaceRoot, ".deepcode", "settings.json")}: ${message}` + ); + return null; + } + } + + private getWorkspaceRoot(): string { + const workspace = vscode.workspace.workspaceFolders?.[0]; + if (workspace) { + return workspace.uri.fsPath; + } + return process.cwd(); + } + + private serializeProcesses( + processes: Map | null + ): Record | null { + if (!processes || processes.size === 0) { + return null; + } + + const serialized: Record = {}; + for (const [pid, entry] of processes.entries()) { + serialized[pid] = entry; + } + return serialized; + } + + private getWebviewHtml(webview: vscode.Webview): string { + const nonce = getNonce(); + const csp = webview.cspSource; + + // 读取 HTML 模板文件 + const htmlPath = vscode.Uri.joinPath(this.context.extensionUri, "resources", "webview.html"); + let html = fs.readFileSync(htmlPath.fsPath, "utf8"); + + // 获取 CSS 文件 URI + const cssPath = vscode.Uri.joinPath(this.context.extensionUri, "resources", "webview.css"); + const cssUri = webview.asWebviewUri(cssPath); + const attachmentsJsPath = vscode.Uri.joinPath(this.context.extensionUri, "resources", "prompt-attachments.js"); + const attachmentsJsUri = webview.asWebviewUri(attachmentsJsPath); + + // 获取 Logo 文件 URI + const iconPath = vscode.Uri.joinPath(this.context.extensionUri, "resources", "deepcoding_icon.png"); + const iconUri = webview.asWebviewUri(iconPath); + + // 替换占位符 + html = html.replace(/\{\{nonce\}\}/g, nonce); + html = html.replace(/\{\{cspSource\}\}/g, csp); + html = html.replace(/\{\{cssUri\}\}/g, cssUri.toString()); + html = html.replace(/\{\{attachmentsJsUri\}\}/g, attachmentsJsUri.toString()); + html = html.replace(/\{\{iconUri\}\}/g, iconUri.toString()); + html = html.replace(/\{\{workspaceRoot\}\}/g, JSON.stringify(this.getWorkspaceRoot())); + + return html; + } + + private async openFileInEditor(filePath: string, line: number): Promise { + const document = await vscode.workspace.openTextDocument(vscode.Uri.file(filePath)); + const editor = await vscode.window.showTextDocument(document, { + preview: false, + preserveFocus: false, + }); + + const targetLine = Number.isFinite(line) && line > 0 ? Math.floor(line) - 1 : 0; + const safeLine = Math.min(Math.max(0, targetLine), Math.max(0, document.lineCount - 1)); + const position = new vscode.Position(safeLine, 0); + const selection = new vscode.Selection(position, position); + editor.selection = selection; + editor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.InCenter); + } +} + +export function activate(context: vscode.ExtensionContext): void { + process.env.NoDefaultCurrentDirectoryInExePath = "1"; + try { + setShellIfWindows(); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + void vscode.window.showErrorMessage(message); + } + + const provider = new DeepCodeViewProvider(context); + context.subscriptions.push(provider); + context.subscriptions.push(vscode.window.registerWebviewViewProvider(DeepCodeViewProvider.viewType, provider)); + context.subscriptions.push( + vscode.commands.registerCommand("deepcode.openView", async () => { + await vscode.commands.executeCommand("workbench.view.extension.deepcode"); + await vscode.commands.executeCommand("deepcode.chatView.focus"); + }) + ); +} + +export function deactivate(): void { + // no-op +} diff --git a/packages/vscode-ide-companion/src/provider.ts b/packages/vscode-ide-companion/src/provider.ts new file mode 100644 index 00000000..91aee0e4 --- /dev/null +++ b/packages/vscode-ide-companion/src/provider.ts @@ -0,0 +1,319 @@ +/** + * Message handling logic for the Deepcoding webview provider. + * Extracted from extension.ts for testability — no direct vscode dependency. + */ +import type { SessionManager } from "@vegamo/deepcode-core"; +import type { PermissionScope, SkillInfo, UserToolPermission } from "@vegamo/deepcode-core"; +import { parseUserToolPermissions, parsePermissionScopes } from "./utils.js"; + +export interface PostMessageFn { + (message: unknown): void; +} + +export interface ProviderDeps { + sessionManager: Pick< + SessionManager, + | "listSessions" + | "getSession" + | "getActiveSessionId" + | "setActiveSessionId" + | "listSessionMessages" + | "handleUserPrompt" + | "interruptActiveSession" + | "denySessionPermission" + | "listSkills" + >; + postMessage: PostMessageFn; + renderMarkdown: (text: string) => string; + copyToClipboard: (text: string) => void; +} + +export interface SessionSummary { + id: string; + summary: string; + createTime: string; + updateTime: string; + status: string; +} + +function toSessionList( + sessions: Array<{ id: string; summary?: string | null; createTime: string; updateTime: string; status: string }> +): SessionSummary[] { + return sessions.map((s) => ({ + id: s.id, + summary: s.summary || "Untitled", + createTime: s.createTime, + updateTime: s.updateTime, + status: s.status, + })); +} + +/** + * Routes incoming webview messages to the appropriate handler. + * Returns true if the message was handled. + */ +export async function handleWebviewMessage(message: unknown, deps: ProviderDeps): Promise { + const { sessionManager, postMessage, renderMarkdown, copyToClipboard } = deps; + + if (!message || typeof message !== "object") { + return false; + } + + const msg = message as Record; + + if (msg.type === "ready") { + loadInitialSession(sessionManager, postMessage); + await sendSkillsList(sessionManager, postMessage); + return true; + } + + if (msg.type === "requestSkills") { + await sendSkillsList(sessionManager, postMessage); + return true; + } + + if (msg.type === "userPrompt") { + const prompt = String(msg.prompt || "").trim(); + const images = Array.isArray(msg.images) + ? (msg.images as unknown[]).filter((image): image is string => typeof image === "string" && image.length > 0) + : []; + const permissions = parseUserToolPermissions(msg.permissions); + const alwaysAllows = parsePermissionScopes(msg.alwaysAllows); + if (!prompt && images.length === 0 && permissions.length === 0 && alwaysAllows.length === 0) { + return true; + } + const skills = (msg.skills as SkillInfo[]) || []; + await handlePrompt(prompt, skills, images, sessionManager, postMessage, renderMarkdown, { + permissions: permissions.length > 0 ? permissions : undefined, + alwaysAllows: alwaysAllows.length > 0 ? alwaysAllows : undefined, + }); + return true; + } + + if (msg.type === "interrupt") { + sessionManager.interruptActiveSession(); + return true; + } + + if (msg.type === "denyPermission") { + const sessionId = String(msg.sessionId || sessionManager.getActiveSessionId() || "").trim(); + if (sessionId) { + handlePermissionDenied(sessionId, sessionManager, postMessage); + } + return true; + } + + if (msg.type === "createNewSession") { + await createNewSession(sessionManager, postMessage); + return true; + } + + if (msg.type === "selectSession") { + const sessionId = String(msg.sessionId || "").trim(); + if (sessionId) { + loadSession(sessionId, sessionManager, postMessage, renderMarkdown); + await sendSkillsList(sessionManager, postMessage, sessionId); + } + return true; + } + + if (msg.type === "backToList") { + showSessionsList(sessionManager, postMessage); + return true; + } + + if (msg.type === "openFile") { + // openFile requires vscode API — handled by the caller + return false; + } + + if (msg.type === "copyText") { + const text = String(msg.text || ""); + if (text) { + copyToClipboard(text); + } + return true; + } + + return false; +} + +function loadInitialSession(sessionManager: ProviderDeps["sessionManager"], postMessage: PostMessageFn): void { + const sessions = sessionManager.listSessions(); + const sessionsList = toSessionList(sessions); + + if (sessions.length === 0) { + postMessage({ + type: "initializeEmpty", + sessions: sessionsList, + status: null, + }); + return; + } + + const latestSession = sessions[0]; + loadSession(latestSession.id, sessionManager, postMessage, (t) => t); +} + +export function loadSession( + sessionId: string, + sessionManager: ProviderDeps["sessionManager"], + postMessage: PostMessageFn, + renderMarkdown: (text: string) => string +): void { + const session = sessionManager.getSession(sessionId); + if (!session) { + return; + } + + sessionManager.setActiveSessionId(sessionId); + const messages = sessionManager.listSessionMessages(sessionId); + const sessions = sessionManager.listSessions(); + + postMessage({ + type: "loadSession", + sessionId, + summary: session.summary || "Untitled", + status: session.status, + askPermissions: session.askPermissions, + processes: serializeProcesses(session.processes), + sessions: toSessionList(sessions), + messages: messages + .filter((m) => m.visible) + .map((m) => ({ + role: m.role, + content: m.content, + html: + m.role !== "tool" + ? renderMarkdown( + m.content || (m.messageParams as { reasoning_content?: string } | null)?.reasoning_content || "" + ) + : undefined, + meta: m.meta, + })), + }); +} + +function showSessionsList(sessionManager: ProviderDeps["sessionManager"], postMessage: PostMessageFn): void { + const sessions = sessionManager.listSessions(); + postMessage({ + type: "showSessionsList", + sessions: toSessionList(sessions), + }); +} + +async function createNewSession( + sessionManager: ProviderDeps["sessionManager"], + postMessage: PostMessageFn +): Promise { + sessionManager.setActiveSessionId(null); + const sessions = sessionManager.listSessions(); + + postMessage({ + type: "initializeEmpty", + sessions: toSessionList(sessions), + status: null, + }); + await sendSkillsList(sessionManager, postMessage); +} + +async function sendSkillsList( + sessionManager: ProviderDeps["sessionManager"], + postMessage: PostMessageFn, + sessionId?: string +): Promise { + const skills = await sessionManager.listSkills(sessionId ?? sessionManager.getActiveSessionId() ?? undefined); + postMessage({ type: "skillsList", skills }); +} + +async function handlePrompt( + prompt: string, + skills: SkillInfo[], + imageUrls: string[], + sessionManager: ProviderDeps["sessionManager"], + postMessage: PostMessageFn, + renderMarkdown: (text: string) => string, + options: { permissions?: UserToolPermission[]; alwaysAllows?: PermissionScope[] } = {} +): Promise { + const normalizedImages = imageUrls.filter(Boolean); + const displayPrompt = prompt || (normalizedImages.length > 0 ? "粘贴的图像" : ""); + const isPermissionContinue = + prompt === "/continue" && + normalizedImages.length === 0 && + ((options.permissions?.length ?? 0) > 0 || (options.alwaysAllows?.length ?? 0) > 0); + + if (displayPrompt && !isPermissionContinue) { + postMessage({ type: "userMessage", content: displayPrompt }); + } + + postMessage({ type: "loading", value: true }); + + try { + await sessionManager.handleUserPrompt({ + text: prompt, + skills, + imageUrls: normalizedImages, + permissions: options.permissions, + alwaysAllows: options.alwaysAllows, + }); + await sendSkillsList(sessionManager, postMessage); + + const activeSessionId = sessionManager.getActiveSessionId(); + const activeSession = activeSessionId ? sessionManager.getSession(activeSessionId) : null; + if (activeSessionId && activeSession) { + postMessage({ + type: "sessionStatus", + sessionId: activeSessionId, + status: activeSession.status, + askPermissions: activeSession.askPermissions, + processes: serializeProcesses(activeSession.processes), + }); + } + + const sessions = sessionManager.listSessions(); + postMessage({ + type: "showSessionsList", + sessions: toSessionList(sessions), + }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + postMessage({ + type: "assistant", + html: renderMarkdown(`Request failed: ${message}`), + }); + } finally { + postMessage({ type: "loading", value: false }); + } +} + +function handlePermissionDenied( + sessionId: string, + sessionManager: ProviderDeps["sessionManager"], + postMessage: PostMessageFn +): void { + sessionManager.denySessionPermission(sessionId); + const session = sessionManager.getSession(sessionId); + if (session) { + postMessage({ + type: "sessionStatus", + sessionId, + status: session.status, + askPermissions: session.askPermissions, + processes: serializeProcesses(session.processes), + }); + } + showSessionsList(sessionManager, postMessage); +} + +function serializeProcesses( + processes: Map | null +): Record | null { + if (!processes || processes.size === 0) { + return null; + } + const serialized: Record = {}; + for (const [pid, entry] of processes.entries()) { + serialized[pid] = entry; + } + return serialized; +} diff --git a/packages/vscode-ide-companion/src/tests/extension-utils.test.ts b/packages/vscode-ide-companion/src/tests/extension-utils.test.ts new file mode 100644 index 00000000..8dea36de --- /dev/null +++ b/packages/vscode-ide-companion/src/tests/extension-utils.test.ts @@ -0,0 +1,132 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { VALID_PERMISSION_SCOPES, parseUserToolPermissions, parsePermissionScopes, getNonce } from "../utils.js"; + +// --- VALID_PERMISSION_SCOPES --- + +test("VALID_PERMISSION_SCOPES contains all expected scopes", () => { + const expected = [ + "read-in-cwd", + "read-out-cwd", + "write-in-cwd", + "write-out-cwd", + "delete-in-cwd", + "delete-out-cwd", + "query-git-log", + "mutate-git-log", + "network", + "mcp", + ]; + assert.equal(VALID_PERMISSION_SCOPES.size, expected.length); + for (const scope of expected) { + assert.ok(VALID_PERMISSION_SCOPES.has(scope as any), `missing scope: ${scope}`); + } +}); + +// --- parseUserToolPermissions --- + +test("parseUserToolPermissions returns empty array for non-array input", () => { + assert.deepEqual(parseUserToolPermissions(undefined), []); + assert.deepEqual(parseUserToolPermissions(null), []); + assert.deepEqual(parseUserToolPermissions("string"), []); + assert.deepEqual(parseUserToolPermissions(123), []); + assert.deepEqual(parseUserToolPermissions({}), []); +}); + +test("parseUserToolPermissions returns empty array for empty array", () => { + assert.deepEqual(parseUserToolPermissions([]), []); +}); + +test("parseUserToolPermissions parses valid permissions", () => { + const input = [ + { toolCallId: "call-1", permission: "allow" }, + { toolCallId: "call-2", permission: "deny" }, + ]; + const result = parseUserToolPermissions(input); + assert.equal(result.length, 2); + assert.deepEqual(result[0], { toolCallId: "call-1", permission: "allow" }); + assert.deepEqual(result[1], { toolCallId: "call-2", permission: "deny" }); +}); + +test("parseUserToolPermissions filters out invalid items", () => { + const input = [ + null, + 123, + "string", + {}, + { toolCallId: "", permission: "allow" }, // empty toolCallId + { toolCallId: " ", permission: "allow" }, // whitespace-only toolCallId + { toolCallId: "call-1" }, // missing permission + { toolCallId: "call-2", permission: "invalid" }, // invalid permission value + { permission: "allow" }, // missing toolCallId + { toolCallId: "call-3", permission: "allow" }, // valid + ]; + const result = parseUserToolPermissions(input); + assert.equal(result.length, 1); + assert.deepEqual(result[0], { toolCallId: "call-3", permission: "allow" }); +}); + +test("parseUserToolPermissions preserves toolCallId with leading/trailing spaces", () => { + const input = [{ toolCallId: " call-1 ", permission: "allow" }]; + const result = parseUserToolPermissions(input); + // trimmed toolCallId " " fails the .trim() check, so this item is filtered + // Wait, " call-1 ".trim() = "call-1" which is truthy, so it passes + assert.equal(result.length, 1); + assert.equal(result[0].toolCallId, " call-1 "); +}); + +// --- parsePermissionScopes --- + +test("parsePermissionScopes returns empty array for non-array input", () => { + assert.deepEqual(parsePermissionScopes(undefined), []); + assert.deepEqual(parsePermissionScopes(null), []); + assert.deepEqual(parsePermissionScopes("string"), []); + assert.deepEqual(parsePermissionScopes(123), []); + assert.deepEqual(parsePermissionScopes({}), []); +}); + +test("parsePermissionScopes returns empty array for empty array", () => { + assert.deepEqual(parsePermissionScopes([]), []); +}); + +test("parsePermissionScopes parses valid scopes", () => { + const input = ["read-in-cwd", "write-in-cwd", "network"]; + const result = parsePermissionScopes(input); + assert.equal(result.length, 3); + assert.deepEqual(result, ["read-in-cwd", "write-in-cwd", "network"]); +}); + +test("parsePermissionScopes filters out invalid values", () => { + const input = ["read-in-cwd", "invalid-scope", 123, null, undefined, {}, "mcp"]; + const result = parsePermissionScopes(input); + assert.equal(result.length, 2); + assert.deepEqual(result, ["read-in-cwd", "mcp"]); +}); + +test("parsePermissionScopes deduplicates scopes", () => { + const input = ["read-in-cwd", "write-in-cwd", "read-in-cwd", "network", "network"]; + const result = parsePermissionScopes(input); + assert.equal(result.length, 3); + assert.deepEqual(result, ["read-in-cwd", "write-in-cwd", "network"]); +}); + +// --- getNonce --- + +test("getNonce returns a 32-character string", () => { + const nonce = getNonce(); + assert.equal(nonce.length, 32); +}); + +test("getNonce only contains alphanumeric characters", () => { + const nonce = getNonce(); + assert.ok(/^[A-Za-z0-9]+$/.test(nonce), `nonce contains non-alphanumeric chars: ${nonce}`); +}); + +test("getNonce returns different values on successive calls", () => { + const nonces = new Set(); + for (let i = 0; i < 100; i++) { + nonces.add(getNonce()); + } + // With 62^32 possible values, 100 calls should almost certainly be unique + assert.ok(nonces.size > 90, `Expected mostly unique nonces, got ${nonces.size} unique out of 100`); +}); diff --git a/packages/vscode-ide-companion/src/tests/extension.test.ts b/packages/vscode-ide-companion/src/tests/extension.test.ts new file mode 100644 index 00000000..4f8d6e03 --- /dev/null +++ b/packages/vscode-ide-companion/src/tests/extension.test.ts @@ -0,0 +1,445 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { handleWebviewMessage, loadSession, type ProviderDeps } from "../provider.js"; + +// --- Helpers --- + +function createMockSessionManager(options?: { sessions?: any[]; messages?: any[]; skills?: any[] }) { + const sessions = options?.sessions ?? [ + { + id: "session-1", + summary: "Test Session", + status: "idle", + askPermissions: null, + processes: null, + activeTokens: 100, + usage: null, + createTime: "2025-01-01T00:00:00Z", + updateTime: "2025-01-01T00:00:00Z", + }, + ]; + const messages = options?.messages ?? []; + const skills = options?.skills ?? []; + let activeSessionId: string | null = sessions[0]?.id ?? null; + + return { + dispose: () => {}, + listSessions: () => sessions, + getSession: (id: string) => sessions.find((s: any) => s.id === id) ?? null, + getActiveSessionId: () => activeSessionId, + setActiveSessionId: (id: string | null) => { + activeSessionId = id; + }, + listSessionMessages: (_sessionId: string) => messages, + handleUserPrompt: () => Promise.resolve(), + interruptActiveSession: () => {}, + denySessionPermission: (_sessionId: string) => {}, + listSkills: () => Promise.resolve(skills), + initMcpServers: () => Promise.resolve(), + }; +} + +function createDeps(options?: Parameters[0]): ProviderDeps & { messages: unknown[] } { + const messages: unknown[] = []; + return { + sessionManager: createMockSessionManager(options), + postMessage: (msg: unknown) => { + messages.push(msg); + }, + renderMarkdown: (text: string) => `

${text}

`, + copyToClipboard: () => {}, + messages, + }; +} + +// --- handleWebviewMessage routing --- + +test("handleWebviewMessage returns false for null message", async () => { + const deps = createDeps(); + const result = await handleWebviewMessage(null, deps); + assert.equal(result, false); +}); + +test("handleWebviewMessage returns false for non-object message", async () => { + const deps = createDeps(); + assert.equal(await handleWebviewMessage("string", deps), false); + assert.equal(await handleWebviewMessage(123, deps), false); +}); + +test("handleWebviewMessage returns false for unknown message type", async () => { + const deps = createDeps(); + assert.equal(await handleWebviewMessage({ type: "unknownType" }, deps), false); +}); + +test("ready message triggers loadInitialSession and sendSkillsList", async () => { + const deps = createDeps(); + const handled = await handleWebviewMessage({ type: "ready" }, deps); + + assert.equal(handled, true); + const types = deps.messages.map((m: any) => m.type); + // With sessions present, should send loadSession + skillsList + assert.ok(types.includes("loadSession"), `Expected loadSession, got: ${types.join(", ")}`); + assert.ok(types.includes("skillsList"), `Expected skillsList, got: ${types.join(", ")}`); +}); + +test("ready with no sessions sends initializeEmpty", async () => { + const deps = createDeps({ sessions: [] }); + await handleWebviewMessage({ type: "ready" }, deps); + + const types = deps.messages.map((m: any) => m.type); + assert.ok(types.includes("initializeEmpty"), `Expected initializeEmpty, got: ${types.join(", ")}`); +}); + +test("requestSkills sends skillsList", async () => { + const deps = createDeps({ skills: [{ name: "test-skill" }] }); + await handleWebviewMessage({ type: "requestSkills" }, deps); + + const skillsMsg = deps.messages.find((m: any) => m.type === "skillsList"); + assert.ok(skillsMsg, "Should send skillsList"); + assert.deepEqual((skillsMsg as any).skills, [{ name: "test-skill" }]); +}); + +test("interrupt calls interruptActiveSession", async () => { + const deps = createDeps(); + let interrupted = false; + (deps.sessionManager as any).interruptActiveSession = () => { + interrupted = true; + }; + + const handled = await handleWebviewMessage({ type: "interrupt" }, deps); + assert.equal(handled, true); + assert.ok(interrupted, "interruptActiveSession should be called"); +}); + +test("createNewSession clears active session and sends initializeEmpty", async () => { + const deps = createDeps(); + let cleared = false; + (deps.sessionManager as any).setActiveSessionId = (id: string | null) => { + if (id === null) cleared = true; + }; + + await handleWebviewMessage({ type: "createNewSession" }, deps); + + assert.ok(cleared, "setActiveSessionId(null) should be called"); + const types = deps.messages.map((m: any) => m.type); + assert.ok(types.includes("initializeEmpty"), `Expected initializeEmpty, got: ${types.join(", ")}`); + assert.ok(types.includes("skillsList"), `Expected skillsList, got: ${types.join(", ")}`); +}); + +test("selectSession loads session and sends skillsList", async () => { + const deps = createDeps(); + let loadedId: string | null = null; + (deps.sessionManager as any).setActiveSessionId = (id: string) => { + loadedId = id; + }; + + await handleWebviewMessage({ type: "selectSession", sessionId: "session-1" }, deps); + + assert.equal(loadedId, "session-1"); + const types = deps.messages.map((m: any) => m.type); + assert.ok(types.includes("loadSession"), `Expected loadSession, got: ${types.join(", ")}`); + assert.ok(types.includes("skillsList"), `Expected skillsList, got: ${types.join(", ")}`); +}); + +test("selectSession with empty sessionId does nothing", async () => { + const deps = createDeps(); + await handleWebviewMessage({ type: "selectSession", sessionId: "" }, deps); + assert.equal(deps.messages.length, 0, "No messages for empty sessionId"); +}); + +test("selectSession with non-existent session does not send loadSession", async () => { + const deps = createDeps(); + (deps.sessionManager as any).getSession = () => null; + + await handleWebviewMessage({ type: "selectSession", sessionId: "non-existent" }, deps); + + const types = deps.messages.map((m: any) => m.type); + assert.ok(!types.includes("loadSession"), "Should not send loadSession for non-existent session"); +}); + +test("backToList sends showSessionsList", async () => { + const deps = createDeps(); + await handleWebviewMessage({ type: "backToList" }, deps); + + const msg = deps.messages.find((m: any) => m.type === "showSessionsList"); + assert.ok(msg, "Should send showSessionsList"); + assert.ok(Array.isArray((msg as any).sessions), "sessions should be an array"); +}); + +test("denyPermission calls denySessionPermission and sends sessionStatus", async () => { + const deps = createDeps(); + let deniedId: string | null = null; + (deps.sessionManager as any).denySessionPermission = (id: string) => { + deniedId = id; + }; + + await handleWebviewMessage({ type: "denyPermission", sessionId: "session-1" }, deps); + + assert.equal(deniedId, "session-1"); + const types = deps.messages.map((m: any) => m.type); + assert.ok(types.includes("sessionStatus"), `Expected sessionStatus, got: ${types.join(", ")}`); + assert.ok(types.includes("showSessionsList"), `Expected showSessionsList, got: ${types.join(", ")}`); +}); + +test("denyPermission with empty sessionId does nothing", async () => { + const deps = createDeps(); + (deps.sessionManager as any).getActiveSessionId = () => null; + + await handleWebviewMessage({ type: "denyPermission", sessionId: "" }, deps); + + // No sessionStatus should be sent + const types = deps.messages.map((m: any) => m.type); + assert.ok(!types.includes("sessionStatus"), "Should not send sessionStatus for empty sessionId"); +}); + +test("copyText calls copyToClipboard", async () => { + const deps = createDeps(); + let copiedText: string | null = null; + deps.copyToClipboard = (text: string) => { + copiedText = text; + }; + + const handled = await handleWebviewMessage({ type: "copyText", text: "hello" }, deps); + assert.equal(handled, true); + assert.equal(copiedText, "hello"); +}); + +test("copyText with empty text does not call copyToClipboard", async () => { + const deps = createDeps(); + let copied = false; + deps.copyToClipboard = () => { + copied = true; + }; + + await handleWebviewMessage({ type: "copyText", text: "" }, deps); + assert.ok(!copied, "Should not copy empty text"); +}); + +test("openFile returns false (handled by caller)", async () => { + const deps = createDeps(); + const result = await handleWebviewMessage({ type: "openFile", filePath: "/some/file.ts" }, deps); + assert.equal(result, false); +}); + +// --- userPrompt --- + +test("userPrompt with empty prompt and no images/permissions is handled without messages", async () => { + const deps = createDeps(); + const handled = await handleWebviewMessage( + { type: "userPrompt", prompt: "", images: [], permissions: [], alwaysAllows: [] }, + deps + ); + assert.equal(handled, true); + assert.equal(deps.messages.length, 0, "No messages for empty prompt"); +}); + +test("userPrompt with text sends userMessage and loading states", async () => { + const deps = createDeps(); + await handleWebviewMessage({ type: "userPrompt", prompt: "hello" }, deps); + + const types = deps.messages.map((m: any) => m.type); + assert.ok(types.includes("userMessage"), `Expected userMessage, got: ${types.join(", ")}`); + assert.ok(types.includes("loading"), `Expected loading, got: ${types.join(", ")}`); + + // Should end with loading: false + const lastLoading = [...deps.messages].reverse().find((m: any) => m.type === "loading"); + assert.deepEqual(lastLoading, { type: "loading", value: false }); +}); + +test("userPrompt with images sends userMessage with image placeholder", async () => { + const deps = createDeps(); + await handleWebviewMessage({ type: "userPrompt", prompt: "", images: ["data:image/png;base64,abc"] }, deps); + + const userMsg = deps.messages.find((m: any) => m.type === "userMessage"); + assert.ok(userMsg, "Should send userMessage for images"); + assert.equal((userMsg as any).content, "粘贴的图像"); +}); + +test("userPrompt with permissions (continue) does not send userMessage", async () => { + const deps = createDeps(); + await handleWebviewMessage( + { + type: "userPrompt", + prompt: "/continue", + images: [], + permissions: [{ toolCallId: "call-1", permission: "allow" }], + }, + deps + ); + + const userMsg = deps.messages.find((m: any) => m.type === "userMessage"); + assert.ok(!userMsg, "Should not send userMessage for /continue with permissions"); +}); + +test("userPrompt sends sessionStatus after handling", async () => { + const deps = createDeps(); + await handleWebviewMessage({ type: "userPrompt", prompt: "hello" }, deps); + + const types = deps.messages.map((m: any) => m.type); + assert.ok(types.includes("sessionStatus"), `Expected sessionStatus, got: ${types.join(", ")}`); +}); + +test("userPrompt sends showSessionsList after handling", async () => { + const deps = createDeps(); + await handleWebviewMessage({ type: "userPrompt", prompt: "hello" }, deps); + + const sessionsMsg = deps.messages.find((m: any) => m.type === "showSessionsList"); + assert.ok(sessionsMsg, "Should send showSessionsList"); + assert.ok(Array.isArray((sessionsMsg as any).sessions), "sessions should be an array"); +}); + +test("userPrompt on error sends assistant error message", async () => { + const deps = createDeps(); + (deps.sessionManager as any).handleUserPrompt = () => Promise.reject(new Error("API failed")); + + await handleWebviewMessage({ type: "userPrompt", prompt: "hello" }, deps); + + const assistantMsg = deps.messages.find((m: any) => m.type === "assistant"); + assert.ok(assistantMsg, "Should send assistant error message"); + assert.ok((assistantMsg as any).html.includes("API failed"), "Error message should contain the error text"); +}); + +test("userPrompt always sends loading: false even on error", async () => { + const deps = createDeps(); + (deps.sessionManager as any).handleUserPrompt = () => Promise.reject(new Error("fail")); + + await handleWebviewMessage({ type: "userPrompt", prompt: "hello" }, deps); + + const lastLoading = [...deps.messages].reverse().find((m: any) => m.type === "loading"); + assert.deepEqual(lastLoading, { type: "loading", value: false }); +}); + +// --- loadSession --- + +test("loadSession sends loadSession with correct fields", () => { + const sessionManager = createMockSessionManager(); + const messages: unknown[] = []; + const postMessage = (msg: unknown) => { + messages.push(msg); + }; + + loadSession("session-1", sessionManager, postMessage, (t) => t); + + const msg = messages.find((m: any) => m.type === "loadSession") as any; + assert.ok(msg, "Should send loadSession"); + assert.equal(msg.sessionId, "session-1"); + assert.equal(msg.summary, "Test Session"); + assert.equal(msg.status, "idle"); + assert.ok(Array.isArray(msg.sessions), "sessions should be an array"); + assert.ok(Array.isArray(msg.messages), "messages should be an array"); +}); + +test("loadSession with non-existent session does nothing", () => { + const sessionManager = createMockSessionManager(); + const messages: unknown[] = []; + const postMessage = (msg: unknown) => { + messages.push(msg); + }; + + (sessionManager as any).getSession = () => null; + loadSession("non-existent", sessionManager, postMessage, (t) => t); + + assert.equal(messages.length, 0, "No messages for non-existent session"); +}); + +test("loadSession sets active session id", () => { + const sessionManager = createMockSessionManager(); + const messages: unknown[] = []; + let setTo: string | null = null; + (sessionManager as any).setActiveSessionId = (id: string) => { + setTo = id; + }; + + loadSession( + "session-1", + sessionManager, + (msg) => messages.push(msg), + (t) => t + ); + + assert.equal(setTo, "session-1"); +}); + +test("loadSession filters out invisible messages", () => { + const sessionManager = createMockSessionManager({ + messages: [ + { role: "user", content: "visible", visible: true }, + { role: "assistant", content: "hidden", visible: false }, + { role: "user", content: "also visible", visible: true }, + ], + }); + const messages: unknown[] = []; + loadSession( + "session-1", + sessionManager, + (msg) => messages.push(msg), + (t) => t + ); + + const loadMsg = messages.find((m: any) => m.type === "loadSession") as any; + assert.equal(loadMsg.messages.length, 2, "Should filter out invisible messages"); +}); + +// --- serializeProcesses --- + +test("loadSession serializes processes map to object", () => { + const sessionManager = createMockSessionManager({ + sessions: [ + { + id: "session-1", + summary: "Test", + status: "idle", + askPermissions: null, + processes: new Map([ + ["123", { startTime: "2025-01-01", command: "ls" }], + ["456", { startTime: "2025-01-02", command: "cat" }], + ]), + activeTokens: 0, + usage: null, + createTime: "2025-01-01", + updateTime: "2025-01-01", + }, + ], + }); + const messages: unknown[] = []; + loadSession( + "session-1", + sessionManager, + (msg) => messages.push(msg), + (t) => t + ); + + const loadMsg = messages.find((m: any) => m.type === "loadSession") as any; + assert.deepEqual(loadMsg.processes, { + "123": { startTime: "2025-01-01", command: "ls" }, + "456": { startTime: "2025-01-02", command: "cat" }, + }); +}); + +test("loadSession returns null for empty processes", () => { + const sessionManager = createMockSessionManager({ + sessions: [ + { + id: "session-1", + summary: "Test", + status: "idle", + askPermissions: null, + processes: null, + activeTokens: 0, + usage: null, + createTime: "2025-01-01", + updateTime: "2025-01-01", + }, + ], + }); + const messages: unknown[] = []; + loadSession( + "session-1", + sessionManager, + (msg) => messages.push(msg), + (t) => t + ); + + const loadMsg = messages.find((m: any) => m.type === "loadSession") as any; + assert.equal(loadMsg.processes, null); +}); diff --git a/packages/vscode-ide-companion/src/tests/run-tests.mjs b/packages/vscode-ide-companion/src/tests/run-tests.mjs new file mode 100644 index 00000000..73034d8a --- /dev/null +++ b/packages/vscode-ide-companion/src/tests/run-tests.mjs @@ -0,0 +1,15 @@ +// Test runner for @vegamo/deepcode-vscode +import { globSync } from "glob"; +import { spawnSync } from "child_process"; +import { fileURLToPath } from "url"; +import * as path from "path"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const testFiles = globSync("*.test.ts", { cwd: __dirname }); + +const result = spawnSync(process.execPath, ["--import", "tsx", "--test", ...testFiles], { + stdio: "inherit", + cwd: __dirname, +}); + +process.exit(result.status ?? 1); diff --git a/packages/vscode-ide-companion/src/utils.ts b/packages/vscode-ide-companion/src/utils.ts new file mode 100644 index 00000000..7fc126e8 --- /dev/null +++ b/packages/vscode-ide-companion/src/utils.ts @@ -0,0 +1,61 @@ +import type { PermissionScope, UserToolPermission } from "@vegamo/deepcode-core"; + +export const VALID_PERMISSION_SCOPES = new Set([ + "read-in-cwd", + "read-out-cwd", + "write-in-cwd", + "write-out-cwd", + "delete-in-cwd", + "delete-out-cwd", + "query-git-log", + "mutate-git-log", + "network", + "mcp", +]); + +export function parseUserToolPermissions(value: unknown): UserToolPermission[] { + if (!Array.isArray(value)) { + return []; + } + const result: UserToolPermission[] = []; + for (const item of value) { + if (!item || typeof item !== "object") { + continue; + } + const record = item as { toolCallId?: unknown; permission?: unknown }; + if (typeof record.toolCallId !== "string" || !record.toolCallId.trim()) { + continue; + } + if (record.permission !== "allow" && record.permission !== "deny") { + continue; + } + result.push({ toolCallId: record.toolCallId, permission: record.permission }); + } + return result; +} + +export function parsePermissionScopes(value: unknown): PermissionScope[] { + if (!Array.isArray(value)) { + return []; + } + const result: PermissionScope[] = []; + for (const item of value) { + if (typeof item !== "string" || !VALID_PERMISSION_SCOPES.has(item as PermissionScope)) { + continue; + } + const scope = item as PermissionScope; + if (!result.includes(scope)) { + result.push(scope); + } + } + return result; +} + +export function getNonce(): string { + let text = ""; + const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i += 1) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +} diff --git a/packages/vscode-ide-companion/tsconfig.build.json b/packages/vscode-ide-companion/tsconfig.build.json new file mode 100644 index 00000000..8601700a --- /dev/null +++ b/packages/vscode-ide-companion/tsconfig.build.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "ignoreDeprecations": "6.0", + "lib": ["ES2022"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "composite": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node", "vscode"] + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/vscode-ide-companion/tsconfig.json b/packages/vscode-ide-companion/tsconfig.json new file mode 100644 index 00000000..c0d84433 --- /dev/null +++ b/packages/vscode-ide-companion/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "ignoreDeprecations": "6.0", + "lib": ["ES2022"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "noEmit": true, + "types": ["node", "vscode"], + "baseUrl": ".", + "paths": { + "@vegamo/deepcode-core": ["../core/src/index.ts"], + "@vegamo/deepcode-core/*": ["../core/src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", ".vscode-test", "out"] +} diff --git a/scripts/build-vscode-companion.js b/scripts/build-vscode-companion.js new file mode 100644 index 00000000..7fbb1c2a --- /dev/null +++ b/scripts/build-vscode-companion.js @@ -0,0 +1,38 @@ +import { spawnSync } from "node:child_process"; +import { cpSync, existsSync, rmSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = join(dirname(fileURLToPath(import.meta.url)), ".."); + +function run(command, args, label) { + console.log(`\n[${label}] ${command} ${args.join(" ")}`); + const result = spawnSync(command, args, { stdio: "inherit", cwd: root, shell: true }); + if (result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +console.log("========================================="); +console.log(" Deep Code — Build VSCode Companion"); +console.log("========================================="); + +run("npm", ["run", "build", "--workspace=@vegamo/deepcode-core"], "1/4 Build core"); +run("node", ["scripts/esbuild-vscode.config.js"], "2/4 Bundle extension"); + +// Copy templates from core so the extension can read them at runtime via fs +const templatesSrc = join(root, "packages", "core", "templates"); +const templatesDest = join(root, "packages", "vscode-ide-companion", "templates"); + +if (!existsSync(templatesSrc)) { + console.error(`\n❌ Templates not found at ${templatesSrc}`); + process.exit(1); +} + +rmSync(templatesDest, { recursive: true, force: true }); +cpSync(templatesSrc, templatesDest, { recursive: true, dereference: true }); +console.log("\n[3/4] Copied templates from core → vscode-ide-companion/templates/"); + +run("npm", ["run", "package", "--workspace=deepcode-vscode"], "4/4 Package .vsix"); + +console.log("\n✅ VSCode companion build complete.\n\n"); diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 00000000..080e2e54 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,23 @@ +import { spawnSync } from "node:child_process"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); + +function run(command, args, label) { + process.stdout.write(`\n[${label}] ${command} ${args.join(" ")}\n`); + const result = spawnSync(command, args, { stdio: "inherit", cwd: root, shell: true }); + if (result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +console.log("========================================="); +console.log(" Deep Code CLI — Build"); +console.log("========================================="); + +run("npm", ["run", "build", "--workspace=@vegamo/deepcode-core"], "1/2"); +run("npm", ["run", "bundle"], "2/2"); + +console.log("\n✅ Build complete.\n\n"); diff --git a/scripts/clean.js b/scripts/clean.js new file mode 100644 index 00000000..4fd4c7e6 --- /dev/null +++ b/scripts/clean.js @@ -0,0 +1,47 @@ +import { rmSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { globSync } from "glob"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); +const RMRF = { recursive: true, force: true }; + +console.log("Cleaning build artifacts...\n"); + +// Root node_modules +rmSync(join(root, "node_modules"), RMRF); +console.log(" rm node_modules/"); + +// Per-package node_modules, dist, generated, tsbuildinfo +const packageDirs = globSync("packages/*", { cwd: root, absolute: true }); +for (const pkgDir of packageDirs) { + const short = pkgDir.replace(root + "/", ""); + + rmSync(join(pkgDir, "node_modules"), RMRF); + console.log(` rm ${short}/node_modules/`); + + rmSync(join(pkgDir, "dist"), RMRF); + console.log(` rm ${short}/dist/`); + + rmSync(join(pkgDir, "src", "generated"), RMRF); + console.log(` rm ${short}/src/generated/`); + + rmSync(join(pkgDir, "tsconfig.tsbuildinfo"), { force: true }); +} + +// VSCode companion specific artifacts +const vscodeDir = join(root, "packages", "vscode-ide-companion"); +rmSync(join(vscodeDir, "out"), RMRF); +console.log(" rm packages/vscode-ide-companion/out/"); + +rmSync(join(vscodeDir, "templates"), RMRF); +console.log(" rm packages/vscode-ide-companion/templates/"); + +const vsixFiles = globSync("*.vsix", { cwd: vscodeDir }); +for (const vsixFile of vsixFiles) { + rmSync(join(vscodeDir, vsixFile), RMRF); + console.log(` rm packages/vscode-ide-companion/${vsixFile}`); +} + +console.log("\n✅ Clean complete.\n\n"); diff --git a/scripts/copy_bundle_assets.js b/scripts/copy-bundle-assets.js similarity index 62% rename from scripts/copy_bundle_assets.js rename to scripts/copy-bundle-assets.js index 0e1dd948..88315484 100644 --- a/scripts/copy_bundle_assets.js +++ b/scripts/copy-bundle-assets.js @@ -2,12 +2,11 @@ import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -/* global console, process */ - const __dirname = dirname(fileURLToPath(import.meta.url)); const root = join(__dirname, ".."); -const distDir = join(root, "dist"); -const bundledSkillsSrc = join(root, "templates", "skills", "bundled"); +const cliRoot = join(root, "packages", "cli"); +const distDir = join(cliRoot, "dist"); +const bundledSkillsSrc = join(root, "packages", "core", "templates", "skills", "bundled"); const bundledSkillsDest = join(distDir, "bundled"); if (!existsSync(distDir)) { @@ -15,8 +14,8 @@ if (!existsSync(distDir)) { } if (!existsSync(bundledSkillsSrc)) { - console.warn(`Bundled skills directory not found at ${bundledSkillsSrc}`); - process.exit(0); + console.error(`Bundled skills directory not found at ${bundledSkillsSrc}`); + process.exit(1); } rmSync(bundledSkillsDest, { recursive: true, force: true }); @@ -24,4 +23,5 @@ cpSync(bundledSkillsSrc, bundledSkillsDest, { recursive: true, dereference: true, }); -console.log("Copied bundled built-in skills to dist/bundled/"); + +console.log("\n✅ All bundle assets copied to dist/bundled/"); diff --git a/scripts/esbuild-vscode.config.js b/scripts/esbuild-vscode.config.js new file mode 100644 index 00000000..25cd2bc2 --- /dev/null +++ b/scripts/esbuild-vscode.config.js @@ -0,0 +1,29 @@ +import { build } from "esbuild"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); + +const vscodeRoot = join(root, "packages", "vscode-ide-companion"); +const entry = join(vscodeRoot, "src", "extension.ts"); +const outfile = join(vscodeRoot, "out", "extension.js"); + +await build({ + entryPoints: [entry], + bundle: true, + platform: "node", + format: "cjs", + target: "node18", + outfile, + external: ["vscode"], + sourcemap: true, + footer: { + js: "module.exports = { activate, deactivate };", + }, + logOverride: { + "empty-import-meta": "silent", + }, +}); + +console.log(`\n✅ ${outfile} built successfully\n\n`); diff --git a/scripts/esbuild.config.js b/scripts/esbuild.config.js new file mode 100644 index 00000000..bf814a32 --- /dev/null +++ b/scripts/esbuild.config.js @@ -0,0 +1,28 @@ +import { build } from "esbuild"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); + +const cliRoot = join(root, "packages", "cli"); +const entry = join(cliRoot, "src", "cli.tsx"); +const outfile = join(cliRoot, "dist", "cli.js"); + +await build({ + entryPoints: [entry], + bundle: true, + platform: "node", + format: "esm", + target: "node22", + outfile, + banner: { js: "#!/usr/bin/env node" }, + jsx: "automatic", + jsxImportSource: "react", + packages: "external", + logOverride: { + "empty-import-meta": "silent", + }, +}); + +console.log(`\n✅ ${outfile} built successfully\n\n`); diff --git a/scripts/generate-git-commit-info.js b/scripts/generate-git-commit-info.js new file mode 100644 index 00000000..ac029533 --- /dev/null +++ b/scripts/generate-git-commit-info.js @@ -0,0 +1,46 @@ +import { execSync } from "node:child_process"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { dirname, join, relative } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); +const scriptPath = relative(root, fileURLToPath(import.meta.url)); + +const generatedCliDir = join(root, "packages", "cli", "src", "generated"); +const cliGitCommitFile = join(generatedCliDir, "git-commit.ts"); + +let gitCommitInfo = "N/A"; +let cliVersion = "UNKNOWN"; + +if (!existsSync(generatedCliDir)) { + mkdirSync(generatedCliDir, { recursive: true }); +} + +try { + const gitHash = execSync("git rev-parse --short HEAD", { encoding: "utf-8" }).trim(); + if (gitHash) { + gitCommitInfo = gitHash; + } + + const pkg = JSON.parse(readFileSync(join(root, "packages", "cli", "package.json"), "utf-8")); + cliVersion = pkg.version ?? "UNKNOWN"; +} catch { + // ignore +} + +const fileContent = [ + "/**", + " * @license", + ` * Copyright ${new Date().getFullYear()} @vegamo deepcode`, + " */", + "", + `// Auto-generated by ${scriptPath}. Do not edit.`, + `export const GIT_COMMIT_INFO = "${gitCommitInfo}";`, + `export const CLI_VERSION = "${cliVersion}";`, + "", +].join("\n"); + +writeFileSync(cliGitCommitFile, fileContent); + +console.log(`Generated version info: ${cliVersion} (${gitCommitInfo})`); diff --git a/scripts/prepare-package.js b/scripts/prepare-package.js new file mode 100644 index 00000000..6049f082 --- /dev/null +++ b/scripts/prepare-package.js @@ -0,0 +1,302 @@ +import { spawnSync } from "node:child_process"; +import { readFileSync, writeFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); + +// ── Helpers ────────────────────────────────────────────────────────────────── + +function log(msg) { + console.log(msg); +} + +function step(n, total, msg) { + console.log(`\n[${n}/${total}] ${msg}`); +} + +function fail(msg) { + console.error(`\n❌ ${msg}`); + process.exit(1); +} + +function ok(msg) { + console.log(`✅ ${msg}`); +} + +function run(cmd, args, opts = {}) { + const label = opts.label ?? `${cmd} ${args.join(" ")}`; + if (opts.dryRun) { + log(` (dry-run) ${label}`); + return { status: 0, stdout: "" }; + } + const result = spawnSync(cmd, args, { + stdio: opts.stdio ?? "inherit", + cwd: opts.cwd ?? root, + shell: true, + env: { ...process.env, ...opts.env }, + }); + if (result.status !== 0) { + fail(`Command failed: ${label}`); + } + return result; +} + +function readJson(filePath) { + return JSON.parse(readFileSync(filePath, "utf-8")); +} + +function writeJson(filePath, data) { + writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8"); +} + +function isValidSemver(v) { + return /^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(v); +} + +// ── Parse args ─────────────────────────────────────────────────────────────── + +const args = process.argv.slice(2); +let version = null; +let tag = "latest"; +let dryRun = false; +let force = false; + +for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg === "--dry-run") { + dryRun = true; + } else if (arg === "--force") { + force = true; + } else if (arg === "--tag") { + tag = args[++i]; + if (!tag) fail("--tag requires a value"); + } else if (!version) { + version = arg; + } else { + fail(`Unknown argument: ${arg}`); + } +} + +if (!version) { + log(` +Usage: node scripts/publish.js [options] + +Arguments: + Semver version to publish (e.g. 0.1.32, 0.2.0-beta.1) + +Options: + --tag npm dist-tag (default: "latest") + --dry-run Preview all steps without executing + --force Skip branch check (publish from non-main branch) + +Examples: + node scripts/publish.js 0.1.32 + node scripts/publish.js 0.1.32-beta.1 --tag beta + node scripts/publish.js 0.1.32 --dry-run +`); + process.exit(1); +} + +if (!isValidSemver(version)) { + fail(`Invalid semver version: ${version}`); +} + +const TOTAL_STEPS = 9; + +// ── Banner ─────────────────────────────────────────────────────────────────── + +log("========================================="); +log(` Deep Code CLI — Publish v${version}`); +log(` tag=${tag} dryRun=${dryRun} force=${force}`); +log("========================================="); + +// ── 1. Git checks ──────────────────────────────────────────────────────────── + +step(1, TOTAL_STEPS, "Checking git state..."); + +const gitStatus = spawnSync("git", ["status", "--porcelain"], { + cwd: root, + encoding: "utf-8", + shell: true, +}); +if (gitStatus.stdout.trim()) { + fail("Working tree is not clean. Commit or stash changes first."); +} +ok("Working tree is clean"); + +if (!force) { + const gitBranch = spawnSync("git", ["branch", "--show-current"], { + cwd: root, + encoding: "utf-8", + shell: true, + }); + const branch = gitBranch.stdout.trim(); + if (branch !== "main") { + fail(`Not on main branch (current: ${branch}). Use --force to publish from another branch.`); + } + ok("On main branch"); +} + +// ── 2. npm auth ────────────────────────────────────────────────────────────── + +step(2, TOTAL_STEPS, "Checking npm authentication..."); + +if (!dryRun) { + const whoami = spawnSync("npm", ["whoami"], { + cwd: root, + encoding: "utf-8", + shell: true, + }); + if (whoami.status !== 0) { + fail("Not logged in to npm. Run `npm login` first."); + } + ok(`Logged in as: ${whoami.stdout.trim()}`); +} else { + log(" (dry-run) skipping npm whoami"); +} + +// ── 3. Version bump ────────────────────────────────────────────────────────── + +step(3, TOTAL_STEPS, "Updating package versions..."); + +const corePkgPath = join(root, "packages", "core", "package.json"); +const cliPkgPath = join(root, "packages", "cli", "package.json"); + +const corePkg = readJson(corePkgPath); +const cliPkg = readJson(cliPkgPath); + +const oldVersion = corePkg.version; + +// Save originals for restore +const origCliPkg = JSON.stringify(cliPkg, null, 2) + "\n"; + +corePkg.version = version; +cliPkg.version = version; + +if (!dryRun) { + writeJson(corePkgPath, corePkg); + writeJson(cliPkgPath, cliPkg); + ok(`Updated packages/core: ${oldVersion} → ${version}`); + ok(`Updated packages/cli: ${oldVersion} → ${version}`); +} else { + log(` (dry-run) packages/core: ${oldVersion} → ${version}`); + log(` (dry-run) packages/cli: ${oldVersion} → ${version}`); +} + +// ── 4. Quality checks ──────────────────────────────────────────────────────── + +step(4, TOTAL_STEPS, "Running quality checks (typecheck + lint + format)..."); + +run("npm", ["run", "check"], { dryRun }); +ok("All checks passed"); + +step(5, TOTAL_STEPS, "Running tests..."); + +run("npm", ["run", "test", "--workspaces"], { dryRun }); +ok("All tests passed"); + +// ── 6. Build ───────────────────────────────────────────────────────────────── + +step(6, TOTAL_STEPS, "Building packages..."); + +run("npm", ["run", "build"], { dryRun }); +ok("Build complete"); + +// ── 7. Publish core ────────────────────────────────────────────────────────── + +step(7, TOTAL_STEPS, "Publishing @vegamo/deepcode-core..."); + +const corePublishArgs = [ + "publish", + "--workspace=@vegamo/deepcode-core", + "--access", + "public", + "--tag", + tag, + "--registry", + "https://registry.npmjs.org", +]; +if (dryRun) corePublishArgs.push("--dry-run"); + +run("npm", corePublishArgs, { dryRun, label: `npm ${corePublishArgs.join(" ")}` }); +ok(`Published @vegamo/deepcode-core@${version}`); + +// ── 8. Patch CLI deps & publish ────────────────────────────────────────────── + +step(8, TOTAL_STEPS, "Patching CLI dependencies and publishing @vegamo/deepcode-cli..."); + +// Replace file:../core with ^version for npm +const patchedCliPkg = readJson(cliPkgPath); +const coreDep = patchedCliPkg.dependencies["@vegamo/deepcode-core"]; +if (coreDep && coreDep.startsWith("file:")) { + patchedCliPkg.dependencies["@vegamo/deepcode-core"] = `^${version}`; + if (!dryRun) { + writeJson(cliPkgPath, patchedCliPkg); + } + log(` Patched @vegamo/deepcode-core dep: "${coreDep}" → "^${version}"`); +} + +const cliPublishArgs = [ + "publish", + "--workspace=@vegamo/deepcode-cli", + "--access", + "public", + "--tag", + tag, + "--registry", + "https://registry.npmjs.org", +]; +if (dryRun) cliPublishArgs.push("--dry-run"); + +run("npm", cliPublishArgs, { dryRun, label: `npm ${cliPublishArgs.join(" ")}` }); +ok(`Published @vegamo/deepcode-cli@${version}`); + +// Restore file:../core for local development +if (!dryRun) { + writeJson(cliPkgPath, JSON.parse(origCliPkg)); + // But keep the new version + const restoredCli = readJson(cliPkgPath); + restoredCli.version = version; + writeJson(cliPkgPath, restoredCli); + log(" Restored @vegamo/deepcode-core dep to file:../core"); +} + +// ── 9. Git commit + tag ────────────────────────────────────────────────────── + +step(9, TOTAL_STEPS, "Creating git commit and tag..."); + +if (!dryRun) { + run("git", ["add", "packages/core/package.json", "packages/cli/package.json"], { + label: "git add packages/*/package.json", + }); + run("git", ["commit", "-m", `chore(release): v${version}`], { + label: `git commit -m "chore(release): v${version}"`, + }); + run("git", ["tag", `v${version}`], { + label: `git tag v${version}`, + }); + ok(`Created commit and tag v${version}`); +} else { + log(` (dry-run) git add + commit "chore(release): v${version}"`); + log(` (dry-run) git tag v${version}`); +} + +// ── Done ───────────────────────────────────────────────────────────────────── + +console.log("\n========================================="); +console.log(` 🎉 Published v${version} successfully!`); +console.log("========================================="); +console.log(` + Packages published: + • @vegamo/deepcode-core@${version} + • @vegamo/deepcode-cli@${version} + + Verify: + npm view @vegamo/deepcode-cli version + npx @vegamo/deepcode-cli --version + + Push to remote: + git push && git push --tags +`); diff --git a/scripts/start.js b/scripts/start.js new file mode 100644 index 00000000..b3d83be1 --- /dev/null +++ b/scripts/start.js @@ -0,0 +1,22 @@ +import { existsSync } from "node:fs"; +import { spawn } from "node:child_process"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); +const cliDist = join(root, "packages", "cli", "dist", "cli.js"); + +if (!existsSync(cliDist)) { + console.error(`Error: ${cliDist} not found. Run 'npm run build' first.`); + process.exit(1); +} + +console.log("Starting Deep Code CLI...\n"); + +const child = spawn("node", [cliDist, ...process.argv.slice(2)], { + stdio: "inherit", + cwd: root, +}); + +child.on("exit", (code) => process.exit(code ?? 1)); diff --git a/scripts/version.js b/scripts/version.js new file mode 100644 index 00000000..5d2fa4f1 --- /dev/null +++ b/scripts/version.js @@ -0,0 +1,296 @@ +import { spawnSync } from "node:child_process"; +import { readFileSync, writeFileSync, unlinkSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { globSync } from "glob"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); + +const BUMP_TYPES = ["major", "minor", "patch", "premajor", "preminor", "prepatch", "prerelease", "from-git"]; + +// ── Helpers ────────────────────────────────────────────────────────────────── + +function log(msg) { + console.log(msg); +} + +function fail(msg) { + console.error(`\n❌ ${msg}`); + process.exit(1); +} + +function ok(msg) { + console.log(`✅ ${msg}`); +} + +function readJson(filePath) { + return JSON.parse(readFileSync(filePath, "utf-8")); +} + +function writeJson(filePath, data) { + writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8"); +} + +function isValidSemver(v) { + return /^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(v); +} + +function isBumpType(v) { + return BUMP_TYPES.includes(v); +} + +function run(cmd, args, opts = {}) { + const result = spawnSync(cmd, args, { + stdio: opts.stdio ?? "inherit", + cwd: opts.cwd ?? root, + shell: true, + }); + if (result.status !== 0) { + fail(`Command failed: ${cmd} ${args.join(" ")}`); + } + return result; +} + +function runSilent(cmd, args) { + const result = spawnSync(cmd, args, { + cwd: root, + encoding: "utf-8", + shell: true, + }); + if (result.status !== 0) { + return null; + } + return result.stdout.trim(); +} + +// ── Version bump logic ─────────────────────────────────────────────────────── + +function parseVersion(v) { + const match = v.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/); + if (!match) fail(`Cannot parse version: ${v}`); + return { + major: Number(match[1]), + minor: Number(match[2]), + patch: Number(match[3]), + prerelease: match[4] ?? null, + }; +} + +function formatVersion({ major, minor, patch, prerelease }) { + let v = `${major}.${minor}.${patch}`; + if (prerelease) v += `-${prerelease}`; + return v; +} + +function bumpVersion(current, type, preid) { + const v = parseVersion(current); + + switch (type) { + case "major": + return formatVersion({ major: v.major + 1, minor: 0, patch: 0, prerelease: null }); + + case "minor": + return formatVersion({ major: v.major, minor: v.minor + 1, patch: 0, prerelease: null }); + + case "patch": + if (v.prerelease) { + // 0.1.32-beta.1 → 0.1.32 (drop prerelease) + return formatVersion({ ...v, prerelease: null }); + } + return formatVersion({ ...v, patch: v.patch + 1 }); + + case "premajor": + return formatVersion({ + major: v.major + 1, + minor: 0, + patch: 0, + prerelease: `${preid}.0`, + }); + + case "preminor": + return formatVersion({ + major: v.major, + minor: v.minor + 1, + patch: 0, + prerelease: `${preid}.0`, + }); + + case "prepatch": + if (v.prerelease) { + // Already a prerelease — increment the prerelease number + const num = Number(v.prerelease.split(".").pop()); + const base = v.prerelease.split(".").slice(0, -1).join("."); + if (!isNaN(num)) { + return formatVersion({ ...v, prerelease: `${base}.${num + 1}` }); + } + } + return formatVersion({ + ...v, + patch: v.patch + 1, + prerelease: `${preid}.0`, + }); + + case "prerelease": + if (v.prerelease) { + // 0.1.32-beta.0 → 0.1.32-beta.1 + const num = Number(v.prerelease.split(".").pop()); + const base = v.prerelease.split(".").slice(0, -1).join("."); + if (!isNaN(num)) { + const newPre = base ? `${base}.${num + 1}` : `${num + 1}`; + return formatVersion({ ...v, prerelease: newPre }); + } + // Can't parse number, append .0 + return formatVersion({ ...v, prerelease: `${v.prerelease}.0` }); + } + // No prerelease yet — go to next patch prerelease + return formatVersion({ + ...v, + patch: v.patch + 1, + prerelease: `${preid}.0`, + }); + + default: + fail(`Unknown bump type: ${type}`); + } +} + +function resolveVersionFromGit() { + // Get latest tag matching v* + const tag = runSilent("git", ["describe", "--tags", "--abbrev=0"]); + if (!tag) { + fail("No git tags found. Cannot use 'from-git'."); + } + const v = tag.replace(/^v/, ""); + if (!isValidSemver(v)) { + fail(`Latest git tag is not a valid semver: ${tag}`); + } + return v; +} + +// ── Parse args ─────────────────────────────────────────────────────────────── + +const args = process.argv.slice(2); +let bumpArg = null; +let preid = "0"; + +for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg === "--help" || arg === "-h") { + log(` +Usage: npm run release:version -- [--preid ] + +Bumps all workspace package.json files and regenerates package-lock.json. +Works like npm version but for the entire monorepo. + +Bump types: + major 0.1.31 → 1.0.0 + minor 0.1.31 → 0.2.0 + patch 0.1.31 → 0.1.32 + premajor 0.1.31 → 1.0.0-0 + preminor 0.1.31 → 0.2.0-0 + prepatch 0.1.31 → 0.1.32-0 + prerelease 0.1.31 → 0.1.32-0 0.1.32-0 → 0.1.32-1 + from-git Use version from latest git tag + +Options: + --preid Prerelease identifier (default: "0", e.g. "beta", "alpha") + +Examples: + npm run release:version -- patch + npm run release:version -- minor + npm run release:version -- 0.2.0 + npm run release:version -- prerelease --preid beta + npm run release:version -- from-git +`); + process.exit(0); + } else if (arg === "--preid") { + preid = args[++i]; + if (!preid) fail("--preid requires a value"); + } else if (!bumpArg) { + bumpArg = arg; + } else { + fail(`Unknown argument: ${arg}`); + } +} + +if (!bumpArg) { + log(` +Usage: npm run release:version -- [--preid ] + Run with --help for details. +`); + process.exit(1); +} + +// ── Resolve target version ─────────────────────────────────────────────────── + +const corePkgPath = join(root, "packages", "core", "package.json"); +const currentVersion = readJson(corePkgPath).version; + +let version; + +if (bumpArg === "from-git") { + version = resolveVersionFromGit(); + log(`Resolved from git tag: v${version}`); +} else if (isBumpType(bumpArg)) { + version = bumpVersion(currentVersion, bumpArg, preid); +} else if (isValidSemver(bumpArg)) { + version = bumpArg; +} else { + fail(`Invalid argument: "${bumpArg}". Expected a bump type (${BUMP_TYPES.join(", ")}) or a semver version.`); +} + +// ── Banner ─────────────────────────────────────────────────────────────────── + +log("========================================="); +log(` Deep Code — Bump Version`); +log(` ${currentVersion} → ${version}`); +log("=========================================\n"); + +// ── Find all workspace package.json ────────────────────────────────────────── + +const pkgPaths = globSync("packages/*/package.json", { cwd: root, absolute: true }); + +if (pkgPaths.length === 0) { + fail("No workspace packages found under packages/"); +} + +// ── Update versions ────────────────────────────────────────────────────────── + +log("Updating package.json files:\n"); + +for (const pkgPath of pkgPaths) { + const pkg = readJson(pkgPath); + const oldVersion = pkg.version; + pkg.version = version; + writeJson(pkgPath, pkg); + const short = pkgPath.replace(root + "/", ""); + log(` ${short}: ${oldVersion} → ${version}`); +} + +// ── Regenerate lockfile ────────────────────────────────────────────────────── + +log("\nRegenerating package-lock.json...\n"); + +const lockPath = join(root, "package-lock.json"); +try { + unlinkSync(lockPath); + log(" Removed old package-lock.json"); +} catch { + // lockfile may not exist, that's fine +} + +run("npm", ["install", "--package-lock-only"]); +ok("package-lock.json regenerated"); + +// ── Done ───────────────────────────────────────────────────────────────────── + +console.log("\n========================================="); +log(` 🎉 Version bumped to v${version}`); +console.log("========================================="); +console.log(` + Updated ${pkgPaths.length} packages. Next steps: + git add -A && git commit -m "chore(release): v${version}" + git tag v${version} + git push && git push --tags +`); diff --git a/src/tests/run-tests.mjs b/src/tests/run-tests.mjs deleted file mode 100644 index 4d09f5b5..00000000 --- a/src/tests/run-tests.mjs +++ /dev/null @@ -1,13 +0,0 @@ -// Cross-platform test runner: finds all *.test.ts files and runs them via tsx. -// Uses the glob package for reliable cross-platform pattern expansion (Node 20+). -/* eslint-disable */ - -import { globSync } from "glob"; -import { spawnSync } from "child_process"; - -const cwd = new URL("../..", import.meta.url); -const testFiles = globSync("src/tests/*.test.ts", { cwd }); - -const result = spawnSync(process.execPath, ["--import", "tsx", "--test", ...testFiles], { stdio: "inherit", cwd }); - -process.exit(result.status ?? 1); diff --git a/tsconfig.json b/tsconfig.json index 24a6a1d1..9076eecf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,38 @@ { "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "ignoreDeprecations": "6.0", - "lib": ["ES2022"], - "jsx": "react-jsx", "strict": true, "esModuleInterop": true, "skipLibCheck": true, + "noImplicitAny": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noImplicitThis": true, "forceConsistentCasingInFileNames": true, + "noPropertyAccessFromIndexSignature": true, + "noUnusedLocals": true, + "strictBindCallApply": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, "resolveJsonModule": true, - "noEmit": true, - "isolatedModules": true, + "sourceMap": true, + "composite": true, + "incremental": true, + "declaration": true, "allowSyntheticDefaultImports": true, - "types": ["node"] + "verbatimModuleSyntax": true, + "lib": ["ES2023"], + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ES2022", + "types": ["node"], + "jsx": "react-jsx" }, - "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist"] + "include": [], + "exclude": ["node_modules", "dist"], + "references": [ + { "path": "./packages/core" }, + { "path": "./packages/cli" }, + { "path": "./packages/vscode-ide-companion" } + ] }