From e91cd4be79344f3c20795b63b9b1d4626ca72b36 Mon Sep 17 00:00:00 2001 From: ThePlenkov Date: Tue, 29 Sep 2026 23:11:12 +0000 Subject: [PATCH 1/2] chore(tools): remove dead local Nx plugins superseded by @nx-devkit/typescript MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the #221 migration, all build/test inference comes from @nx-devkit/typescript (tsdown.config.ts -> build, vitest.config.ts -> test, tsc -> typecheck). The local plugin implementations were no longer registered in nx.json and are deleted: - tools/nx-tsdown, tools/nx-vitest, tools/nx-typecheck, tools/nx-sync tools/nx-npm-trust stays — its npm-trust-check target is still wired into publish.yml preflight, and @nx-devkit/prepare-for-release does not cover the read-only trust/pack checks. Also: - bump @nx-devkit/typescript 0.2.8 -> 0.2.17 - drop stale tsconfig project references and the dead tools/eslint-rules lint input (directory does not exist) - update README, ts-xsd AGENTS, and nx-monorepo-setup rule to name the inference plugin actually in use Verified: nx show projects (46), nx build+test @abapify/adt-lint. Closes bead ac-fvl. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .agents/rules/nx/nx-monorepo-setup.md | 10 +- README.md | 2 +- bun.lock | 161 ++++------ nx.json | 7 +- package.json | 2 +- packages/ts-xsd/AGENTS.md | 2 +- tools/nx-sync/README.md | 9 - tools/nx-sync/generators.json | 11 - tools/nx-sync/package.json | 19 -- tools/nx-sync/project.json | 19 -- .../src/generators/nested-sync/generator.ts | 277 ------------------ .../src/generators/nested-sync/schema.d.ts | 2 - .../src/generators/nested-sync/schema.json | 7 - tools/nx-sync/src/index.ts | 1 - tools/nx-sync/tsconfig.json | 11 - tools/nx-sync/tsconfig.lib.json | 12 - tools/nx-tsdown/README.md | 7 - tools/nx-tsdown/package.json | 18 -- tools/nx-tsdown/project.json | 19 -- tools/nx-tsdown/scripts/build.sh | 8 - tools/nx-tsdown/src/index.ts | 1 - tools/nx-tsdown/src/plugin.ts | 84 ------ tools/nx-tsdown/tsconfig.json | 11 - tools/nx-tsdown/tsconfig.lib.json | 12 - tools/nx-typecheck/README.md | 6 - tools/nx-typecheck/package.json | 18 -- tools/nx-typecheck/project.json | 19 -- tools/nx-typecheck/src/index.ts | 1 - tools/nx-typecheck/src/plugin.ts | 131 --------- tools/nx-typecheck/tsconfig.json | 11 - tools/nx-typecheck/tsconfig.lib.json | 12 - tools/nx-vitest/README.md | 14 - tools/nx-vitest/package.json | 21 -- tools/nx-vitest/project.json | 19 -- tools/nx-vitest/src/index.ts | 1 - tools/nx-vitest/src/plugin.ts | 231 --------------- tools/nx-vitest/tsconfig.json | 11 - tools/nx-vitest/tsconfig.lib.json | 12 - tsconfig.json | 12 - 39 files changed, 68 insertions(+), 1163 deletions(-) delete mode 100644 tools/nx-sync/README.md delete mode 100644 tools/nx-sync/generators.json delete mode 100644 tools/nx-sync/package.json delete mode 100644 tools/nx-sync/project.json delete mode 100644 tools/nx-sync/src/generators/nested-sync/generator.ts delete mode 100644 tools/nx-sync/src/generators/nested-sync/schema.d.ts delete mode 100644 tools/nx-sync/src/generators/nested-sync/schema.json delete mode 100644 tools/nx-sync/src/index.ts delete mode 100644 tools/nx-sync/tsconfig.json delete mode 100644 tools/nx-sync/tsconfig.lib.json delete mode 100644 tools/nx-tsdown/README.md delete mode 100644 tools/nx-tsdown/package.json delete mode 100644 tools/nx-tsdown/project.json delete mode 100755 tools/nx-tsdown/scripts/build.sh delete mode 100644 tools/nx-tsdown/src/index.ts delete mode 100644 tools/nx-tsdown/src/plugin.ts delete mode 100644 tools/nx-tsdown/tsconfig.json delete mode 100644 tools/nx-tsdown/tsconfig.lib.json delete mode 100644 tools/nx-typecheck/README.md delete mode 100644 tools/nx-typecheck/package.json delete mode 100644 tools/nx-typecheck/project.json delete mode 100644 tools/nx-typecheck/src/index.ts delete mode 100644 tools/nx-typecheck/src/plugin.ts delete mode 100644 tools/nx-typecheck/tsconfig.json delete mode 100644 tools/nx-typecheck/tsconfig.lib.json delete mode 100644 tools/nx-vitest/README.md delete mode 100644 tools/nx-vitest/package.json delete mode 100644 tools/nx-vitest/project.json delete mode 100644 tools/nx-vitest/src/index.ts delete mode 100644 tools/nx-vitest/src/plugin.ts delete mode 100644 tools/nx-vitest/tsconfig.json delete mode 100644 tools/nx-vitest/tsconfig.lib.json diff --git a/.agents/rules/nx/nx-monorepo-setup.md b/.agents/rules/nx/nx-monorepo-setup.md index 45cdf75dc..08707fd1a 100644 --- a/.agents/rules/nx/nx-monorepo-setup.md +++ b/.agents/rules/nx/nx-monorepo-setup.md @@ -41,8 +41,8 @@ packages/[name]/ │ └── index.ts ├── package.json ├── tsconfig.json -├── tsdown.config.ts # ← nx-tsdown plugin detects → creates 'build' target -└── vitest.config.ts # ← nx-vitest plugin detects → creates 'test' targets +├── tsdown.config.ts # ← @nx-devkit/typescript detects → creates 'build' target +└── vitest.config.ts # ← @nx-devkit/typescript detects → creates 'test' targets ``` **Step 3: Minimal project.json** @@ -105,8 +105,8 @@ export default defineConfig({ ## Technology Stack - **Language**: TypeScript (ES2015+, strict mode) -- **Build**: tsdown (via nx-tsdown plugin inference) -- **Testing**: Vitest (via nx-vitest plugin inference) +- **Build**: tsdown (via @nx-devkit/typescript inference) +- **Testing**: Vitest (via @nx-devkit/typescript inference) - **Linting**: ESLint (via @nx/eslint plugin) - **Package Manager**: bun @@ -142,7 +142,7 @@ Then add `tsdown.config.ts` and `vitest.config.ts` - targets will be inferred au ### ✅ DO: Let plugins infer targets -Just create `tsdown.config.ts` and the nx-tsdown plugin will automatically create the `build` target. +Just create `tsdown.config.ts` and the @nx-devkit/typescript plugin will automatically create the `build` target. ### Verification diff --git a/README.md b/README.md index 7ee3bae93..956674ec9 100644 --- a/README.md +++ b/README.md @@ -214,7 +214,7 @@ bunx nx run adt-cli:test # single-package adt-cli/ ├── packages/ # Every @abapify/* package lives here ├── samples/ # Example consumer projects -├── tools/ # Internal Nx plugins (nx-tsdown, nx-vitest, nx-npm-trust, …) +├── tools/ # Internal tooling (nx-npm-trust plugin, p2-cli, release helpers) ├── docs/ # Maintainer docs (not rendered on the site) ├── website/ # Docusaurus site (→ adt-cli.netlify.app) ├── openspec/ # Specs + proposals for in-flight changes diff --git a/bun.lock b/bun.lock index 8925f1b15..70b34fa54 100644 --- a/bun.lock +++ b/bun.lock @@ -31,7 +31,7 @@ "@abapify/adt-playwright": "workspace:*", "@eslint/js": "^10.0.1", "@nx-devkit/nx-cloud": "0.0.2", - "@nx-devkit/typescript": "0.2.8", + "@nx-devkit/typescript": "0.2.17", "@nx/eslint": "23.2.0", "@nx/eslint-plugin": "23.2.0", "@nx/jest": "23.2.0", @@ -86,25 +86,25 @@ }, "packages/abap-ast": { "name": "@abapify/abap-ast", - "version": "0.4.11", + "version": "0.4.15", }, "packages/acds": { "name": "@abapify/acds", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "chevrotain": "^13.0.0", }, }, "packages/aclass": { "name": "@abapify/aclass", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "chevrotain": "^13.0.0", }, }, "packages/adk": { "name": "@abapify/adk", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-client": "0.4.9", "@abapify/adt-contracts": "0.4.9", @@ -114,7 +114,7 @@ }, "packages/adt": { "name": "@abapify/adt", - "version": "0.4.11", + "version": "0.4.15", "bin": { "adt": "./dist/adt.mjs", }, @@ -128,7 +128,7 @@ }, "packages/adt-atc": { "name": "@abapify/adt-atc", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-plugin": "0.4.9", "chalk": "^5.3.0", @@ -136,7 +136,7 @@ }, "packages/adt-aunit": { "name": "@abapify/adt-aunit", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-contracts": "0.4.9", "@abapify/adt-plugin": "0.4.9", @@ -146,7 +146,7 @@ }, "packages/adt-auth": { "name": "@abapify/adt-auth", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/logger": "0.4.9", "proxy-agent": "^6.4.0", @@ -154,7 +154,7 @@ }, "packages/adt-cli": { "name": "@abapify/adt-cli", - "version": "0.4.11", + "version": "0.4.15", "bin": { "adt": "./dist/bin/adt.mjs", }, @@ -201,7 +201,7 @@ }, "packages/adt-client": { "name": "@abapify/adt-client", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-contracts": "0.4.9", "@abapify/adt-schemas": "0.4.9", @@ -211,7 +211,7 @@ }, "packages/adt-codegen": { "name": "@abapify/adt-codegen", - "version": "0.4.11", + "version": "0.4.15", "bin": { "adt-codegen": "./dist/cli.mjs", }, @@ -225,11 +225,11 @@ }, "packages/adt-config": { "name": "@abapify/adt-config", - "version": "0.4.11", + "version": "0.4.15", }, "packages/adt-contracts": { "name": "@abapify/adt-contracts", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-schemas": "0.4.9", "@abapify/speci": "0.4.9", @@ -240,7 +240,7 @@ }, "packages/adt-diff": { "name": "@abapify/adt-diff", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adk": "0.4.9", "@abapify/adt-contracts": "0.4.9", @@ -256,7 +256,7 @@ }, "packages/adt-export": { "name": "@abapify/adt-export", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adk": "0.4.9", "@abapify/adt-locks": "0.4.9", @@ -269,11 +269,11 @@ }, "packages/adt-fixtures": { "name": "@abapify/adt-fixtures", - "version": "0.4.11", + "version": "0.4.15", }, "packages/adt-flow": { "name": "@abapify/adt-flow", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adk": "0.4.9", "@abapify/adt-client": "0.4.9", @@ -284,21 +284,21 @@ }, "packages/adt-lint": { "name": "@abapify/adt-lint", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abaplint/core": "^2.119.15", }, }, "packages/adt-locks": { "name": "@abapify/adt-locks", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-client": "0.4.9", }, }, "packages/adt-mcp": { "name": "@abapify/adt-mcp", - "version": "0.4.11", + "version": "0.4.15", "bin": { "adt-mcp": "./dist/bin/adt-mcp.mjs", "adt-mcp-http": "./dist/bin/adt-mcp-http.mjs", @@ -329,7 +329,7 @@ }, "packages/adt-pilot": { "name": "@abapify/adt-pilot", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@mastra/core": "^1.28.0", "@modelcontextprotocol/sdk": "^1.27.0", @@ -344,7 +344,7 @@ }, "packages/adt-playwright": { "name": "@abapify/adt-playwright", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-auth": "0.4.9", "@abapify/adt-config": "0.4.9", @@ -357,14 +357,14 @@ }, "packages/adt-plugin": { "name": "@abapify/adt-plugin", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adk": "0.4.9", }, }, "packages/adt-plugin-abapgit": { "name": "@abapify/adt-plugin-abapgit", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/acds": "0.4.9", "@abapify/adk": "0.4.9", @@ -376,7 +376,7 @@ }, "packages/adt-plugin-gcts": { "name": "@abapify/adt-plugin-gcts", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adk": "0.4.9", "@abapify/adt-plugin": "0.4.9", @@ -387,7 +387,7 @@ }, "packages/adt-plugin-gcts-cli": { "name": "@abapify/adt-plugin-gcts-cli", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-contracts": "0.4.9", "@abapify/adt-plugin": "0.4.9", @@ -396,7 +396,7 @@ }, "packages/adt-proxy": { "name": "@abapify/adt-proxy", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-contracts": "0.4.9", "@abapify/speci": "0.4.9", @@ -404,7 +404,7 @@ }, "packages/adt-puppeteer": { "name": "@abapify/adt-puppeteer", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-auth": "0.4.9", "@abapify/adt-config": "0.4.9", @@ -417,11 +417,11 @@ }, "packages/adt-rfc": { "name": "@abapify/adt-rfc", - "version": "0.4.11", + "version": "0.4.15", }, "packages/adt-schemas": { "name": "@abapify/adt-schemas", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/ts-xsd": "0.4.9", "zod": "^3.24.0 || ^4.0.0", @@ -432,7 +432,7 @@ }, "packages/adt-server": { "name": "@abapify/adt-server", - "version": "0.4.11", + "version": "0.4.15", "bin": { "adt-server": "./dist/bin/adt-server.mjs", }, @@ -449,11 +449,11 @@ }, "packages/adt-server-client": { "name": "@abapify/adt-server-client", - "version": "0.4.11", + "version": "0.4.15", }, "packages/adt-services": { "name": "@abapify/adt-services", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adk": "0.4.9", "@abapify/adt-auth": "0.4.9", @@ -471,7 +471,7 @@ }, "packages/adt-tui": { "name": "@abapify/adt-tui", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-contracts": "0.4.9", "fast-xml-parser": "^5.3.1", @@ -490,14 +490,14 @@ }, "packages/asjson-parser": { "name": "@abapify/asjson-parser", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "jsonc-eslint-parser": "^2.1.0", }, }, "packages/browser-auth": { "name": "@abapify/browser-auth", - "version": "0.4.11", + "version": "0.4.15", "dependencies": { "@abapify/adt-config": "0.4.9", }, @@ -507,11 +507,11 @@ }, "packages/logger": { "name": "@abapify/logger", - "version": "0.4.11", + "version": "0.4.15", }, "packages/openai-codegen": { "name": "@abapify/openai-codegen", - "version": "0.4.11", + "version": "0.4.15", "bin": { "openai-codegen": "./dist/cli.mjs", }, @@ -529,11 +529,11 @@ }, "packages/speci": { "name": "@abapify/speci", - "version": "0.4.11", + "version": "0.4.15", }, "packages/ts-xsd": { "name": "@abapify/ts-xsd", - "version": "0.4.11", + "version": "0.4.15", "bin": { "ts-xsd": "./dist/codegen/cli.mjs", }, @@ -561,28 +561,9 @@ "name": "@abapify/nx-npm-trust", "version": "0.0.1", }, - "tools/nx-sync": { - "name": "@abapify/nx-sync", - "version": "0.0.1", - }, - "tools/nx-tsdown": { - "name": "@abapify/nx-tsdown", - "version": "0.0.1", - }, - "tools/nx-typecheck": { - "name": "@abapify/nx-typecheck", - "version": "0.0.1", - }, - "tools/nx-vitest": { - "name": "@abapify/nx-vitest", - "version": "0.0.1", - "dependencies": { - "glob": "^10.0.0", - }, - }, "tools/p2-cli": { "name": "@abapify/p2-cli", - "version": "0.4.11", + "version": "0.4.15", "bin": { "p2": "./dist/cli.mjs", }, @@ -688,14 +669,6 @@ "@abapify/nx-npm-trust": ["@abapify/nx-npm-trust@workspace:tools/nx-npm-trust"], - "@abapify/nx-sync": ["@abapify/nx-sync@workspace:tools/nx-sync"], - - "@abapify/nx-tsdown": ["@abapify/nx-tsdown@workspace:tools/nx-tsdown"], - - "@abapify/nx-typecheck": ["@abapify/nx-typecheck@workspace:tools/nx-typecheck"], - - "@abapify/nx-vitest": ["@abapify/nx-vitest@workspace:tools/nx-vitest"], - "@abapify/openai-codegen": ["@abapify/openai-codegen@workspace:packages/openai-codegen"], "@abapify/p2-cli": ["@abapify/p2-cli@workspace:tools/p2-cli"], @@ -1568,7 +1541,7 @@ "@nx-devkit/nx-cloud": ["@nx-devkit/nx-cloud@0.0.2", "", { "dependencies": { "jsonc-parser": "^3.3.1" }, "peerDependencies": { "@nx/devkit": "^22.0.0 || ^23.0.0" } }, "sha512-AhbsQ9s5H9PYTkU5c2Fqp+WtoueWt5t8dVbjMGdwrxDdn9als5rOi+7XQBtINj07AGuFYzT+stmHQA1JrPXY5w=="], - "@nx-devkit/typescript": ["@nx-devkit/typescript@0.2.8", "", { "dependencies": { "@nx/devkit": "^22.0.0 || ^23.0.0" }, "peerDependencies": { "@biomejs/biome": "^2.0.0", "eslint": "^9.0.0", "oxlint": "^1.0.0", "tsdown": "^0.22.0", "typescript": "^6.0.0", "vitest": "^4.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "oxlint", "tsdown", "vitest"], "bin": { "nx-devkit-typescript": "dist/bin/init.mjs" } }, "sha512-sFJ9xAA0YSen5hMeiaH9pnyPvwVqz3PnilqbTOctzB3ZkzGqB0F7YcPt+iXFBM7Xtm+Z5ZQUUtkHgilhPTCi+g=="], + "@nx-devkit/typescript": ["@nx-devkit/typescript@0.2.17", "", { "dependencies": { "@nx/devkit": "^22.0.0 || ^23.0.0" }, "peerDependencies": { "@biomejs/biome": "^2.0.0", "eslint": "^9.0.0", "oxlint": "^1.0.0", "tsdown": "^0.22.0", "typescript": "^6.0.0", "vitest": "^4.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "oxlint", "tsdown", "vitest"], "bin": { "nx-devkit-typescript": "dist/bin/init.mjs" } }, "sha512-JTrOpVVmuuP0VxsN6s5nMZwD4x4Hmbl/AOxiYDDcpkvg6X/X9MmAikefa0c4jWkJjq14fziwRK4Abg+ZF/Qaqg=="], "@nx/devkit": ["@nx/devkit@23.2.0", "", { "dependencies": { "ejs": "5.0.1", "minimatch": "10.2.5", "semver": "^7.6.3", "tslib": "^2.3.0", "yargs-parser": "21.1.1" }, "peerDependencies": { "nx": ">= 22 <= 24 || ^23.0.0-0" } }, "sha512-srj04UsYqq2nG7Z9DxM00D8XpSpmSM7XQafCkD4FIOE2NPMCu0QvypJLe8S7a1/YAW9rqlnYrdadaQte687eAw=="], @@ -3206,7 +3179,7 @@ "github-slugger": ["github-slugger@1.5.0", "", {}, "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw=="], - "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -4038,7 +4011,7 @@ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], "path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], @@ -5222,8 +5195,6 @@ "@jest/reporters/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@jest/reporters/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "@jest/snapshot-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "@jest/transform/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -5508,7 +5479,7 @@ "get-proto/es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], - "glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + "glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -5566,8 +5537,6 @@ "jest-config/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "jest-config/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "jest-config/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "jest-diff/@jest/diff-sequences": ["@jest/diff-sequences@30.5.0", "", {}, "sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg=="], @@ -5590,8 +5559,6 @@ "jest-runtime/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "jest-runtime/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], "jest-snapshot/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], @@ -5802,7 +5769,7 @@ "parse-json/lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "path-scurry/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], "pino/pino-abstract-transport": ["pino-abstract-transport@1.2.0", "", { "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q=="], @@ -5932,6 +5899,8 @@ "terser-webpack-plugin/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + "test-exclude/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + "test-exclude/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], "through2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], @@ -6250,10 +6219,6 @@ "@jest/core/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], - "@jest/reporters/glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], - - "@jest/reporters/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/base64": ["@jsonjoy.com/base64@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw=="], "@jsonjoy.com/fs-snapshot/@jsonjoy.com/json-pack/@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@17.67.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q=="], @@ -6458,8 +6423,6 @@ "find-workspaces/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], - "glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], - "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "hpack.js/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], @@ -6492,14 +6455,6 @@ "jest-changed-files/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "jest-config/glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], - - "jest-config/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - - "jest-runtime/glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], - - "jest-runtime/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - "jest-snapshot/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "jest-snapshot/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], @@ -6586,6 +6541,10 @@ "terser/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "test-exclude/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "test-exclude/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "through2/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "through2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], @@ -6702,8 +6661,6 @@ "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - "@jest/reporters/glob/path-scurry/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], - "@mastra/deployer/@babel/core/@babel/code-frame/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], "@mastra/deployer/@babel/core/@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.4.0-beta.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w=="], @@ -6770,8 +6727,6 @@ "find-cache-dir/pkg-dir/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], - "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "ink/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], "ink/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], @@ -6780,10 +6735,6 @@ "istanbul-lib-instrument/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "jest-config/glob/path-scurry/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], - - "jest-runtime/glob/path-scurry/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], - "null-loader/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "nx/open/default-browser/default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], @@ -6802,6 +6753,10 @@ "serve-handler/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "test-exclude/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], + + "test-exclude/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "update-notifier/boxen/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "update-notifier/boxen/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], @@ -6886,6 +6841,8 @@ "renderkid/css-select/domutils/dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + "test-exclude/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "update-notifier/boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], "update-notifier/boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], diff --git a/nx.json b/nx.json index 471543125..68ccb7697 100644 --- a/nx.json +++ b/nx.json @@ -120,12 +120,7 @@ "inputs": ["default", "^default"] }, "lint": { - "inputs": [ - "default", - "^default", - "{workspaceRoot}/eslint.config.mjs", - "{workspaceRoot}/tools/eslint-rules/**/*" - ] + "inputs": ["default", "^default", "{workspaceRoot}/eslint.config.mjs"] }, "test": { "dependsOn": ["^build"] diff --git a/package.json b/package.json index 1408d17bf..1a1f23486 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@abapify/adt-playwright": "workspace:*", "@eslint/js": "^10.0.1", "@nx-devkit/nx-cloud": "0.0.2", - "@nx-devkit/typescript": "0.2.8", + "@nx-devkit/typescript": "0.2.17", "@nx/eslint": "23.2.0", "@nx/eslint-plugin": "23.2.0", "@nx/jest": "23.2.0", diff --git a/packages/ts-xsd/AGENTS.md b/packages/ts-xsd/AGENTS.md index 47f4bf670..423cd4c61 100644 --- a/packages/ts-xsd/AGENTS.md +++ b/packages/ts-xsd/AGENTS.md @@ -91,7 +91,7 @@ const classes = { - ❌ No `devDependencies` in package.json - ❌ No `scripts` in package.json - ✅ Use `project.json` for Nx targets -- ✅ Build target inferred by nx-tsdown plugin +- ✅ Build target inferred by @nx-devkit/typescript plugin ## Architecture diff --git a/tools/nx-sync/README.md b/tools/nx-sync/README.md deleted file mode 100644 index c16cb6f1b..000000000 --- a/tools/nx-sync/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# nx-sync plugin - -Custom Nx plugin that keeps nested Nx workspaces in sync whenever the root -workspace executes `nx sync`. - -The `nested` sync generator looks for nested `nx.json` files that are not -ignored by `.nxignore`. If any of those workspaces are out of sync, the -generator reports them during `nx sync --check` and automatically runs -`nx sync` inside each nested workspace when the root workspace is synced. diff --git a/tools/nx-sync/generators.json b/tools/nx-sync/generators.json deleted file mode 100644 index 0dc382943..000000000 --- a/tools/nx-sync/generators.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "version": 2, - "generators": { - "nested": { - "implementation": "./src/generators/nested-sync/generator", - "schema": "./src/generators/nested-sync/schema.json", - "description": "Detect nested Nx workspaces and keep them in sync." - } - } -} diff --git a/tools/nx-sync/package.json b/tools/nx-sync/package.json deleted file mode 100644 index e4a1b24bc..000000000 --- a/tools/nx-sync/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@abapify/nx-sync", - "version": "0.0.1", - "license": "MIT", - "private": true, - "type": "module", - "main": "./src/index.ts", - "module": "./src/index.ts", - "types": "./src/index.ts", - "generators": "./generators.json", - "exports": { - "./package.json": "./package.json", - ".": { - "types": "./src/index.ts", - "import": "./src/index.ts", - "default": "./src/index.ts" - } - } -} diff --git a/tools/nx-sync/project.json b/tools/nx-sync/project.json deleted file mode 100644 index e12e21d29..000000000 --- a/tools/nx-sync/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "nx-sync", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "tools/nx-sync/src", - "projectType": "library", - "targets": { - "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], - "options": { - "outputPath": "dist/tools/nx-sync", - "main": "tools/nx-sync/src/index.ts", - "tsConfig": "tools/nx-sync/tsconfig.lib.json", - "assets": ["tools/nx-sync/*.md", "tools/nx-sync/generators.json"] - } - } - }, - "tags": [] -} diff --git a/tools/nx-sync/src/generators/nested-sync/generator.ts b/tools/nx-sync/src/generators/nested-sync/generator.ts deleted file mode 100644 index 4cab4c7fb..000000000 --- a/tools/nx-sync/src/generators/nested-sync/generator.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { Tree, logger, workspaceRoot } from '@nx/devkit'; -import { existsSync, readdirSync } from 'node:fs'; -import { promises as fs } from 'node:fs'; -import { join, relative } from 'node:path'; -import { spawnSync } from 'node:child_process'; -import type { SpawnSyncReturns } from 'node:child_process'; -import { getIgnoreObject } from 'nx/src/utils/ignore'; -import { SyncError } from 'nx/src/utils/sync-generators'; - -import type { NxNestedSyncGeneratorSchema } from './schema'; - -interface WorkspaceInfo { - absolutePath: string; - relativePath: string; -} - -interface PendingWorkspace extends WorkspaceInfo { - details: string[]; -} - -interface WorkspaceCheckResult { - needsSync: boolean; - details: string[]; -} - -const MARKER_FILE = '.nx/nested-sync/pending.json'; -const MAX_OUTPUT_LINES = 20; -const SKIPPED_DIRECTORIES = new Set([ - '.git', - '.nx', - 'coverage', - 'dist', - 'node_modules', - 'tmp', -]); - -export default async function nestedSyncGenerator( - tree: Tree, - _schema: NxNestedSyncGeneratorSchema, -) { - const nestedWorkspaces = findNestedWorkspaces(); - - if (!nestedWorkspaces.length) { - return { - outOfSyncMessage: 'No nested Nx workspaces detected.', - outOfSyncDetails: [], - }; - } - - const pending: PendingWorkspace[] = []; - - for (const workspace of nestedWorkspaces) { - const result = checkWorkspace(workspace); - if (result.needsSync) { - pending.push({ - ...workspace, - details: result.details, - }); - } - } - - if (!pending.length) { - return { - outOfSyncMessage: `Checked ${nestedWorkspaces.length} nested Nx workspace${ - nestedWorkspaces.length === 1 ? '' : 's' - } – all are in sync.`, - outOfSyncDetails: [], - }; - } - - tree.write( - MARKER_FILE, - JSON.stringify( - { - workspaces: pending.map((workspace) => workspace.relativePath), - }, - null, - 2, - ), - ); - - return { - outOfSyncMessage: `Detected ${pending.length} nested Nx workspace${ - pending.length === 1 ? '' : 's' - } requiring sync.`, - outOfSyncDetails: pending.flatMap((workspace) => - formatOutOfSyncDetail(workspace), - ), - callback: async () => { - for (const workspace of pending) { - await runNestedSync(workspace); - } - - await cleanupMarkerFile(); - }, - }; -} - -function findNestedWorkspaces(): WorkspaceInfo[] { - const ignore = getIgnoreObject(); - const discovered: WorkspaceInfo[] = []; - const queue: string[] = [workspaceRoot]; - - while (queue.length > 0) { - const current = queue.pop()!; - let entries; - - try { - entries = readdirSync(current, { withFileTypes: true }); - } catch { - continue; - } - - for (const entry of entries) { - if (!entry.isDirectory() || entry.isSymbolicLink()) { - continue; - } - - if (SKIPPED_DIRECTORIES.has(entry.name)) { - continue; - } - - const absolutePath = join(current, entry.name); - const relativePath = normalizeRelativePath( - relative(workspaceRoot, absolutePath), - ); - - if (!relativePath || relativePath.startsWith('..')) { - continue; - } - - if (ignore.ignores(relativePath) || ignore.ignores(`${relativePath}/`)) { - continue; - } - - const nestedNxJsonPath = join(absolutePath, 'nx.json'); - - if (existsSync(nestedNxJsonPath)) { - discovered.push({ - absolutePath, - relativePath, - }); - // Avoid descending deeper once we've found a nested workspace root. - continue; - } - - queue.push(absolutePath); - } - } - - return discovered; -} - -function normalizeRelativePath(path: string): string { - return path.replaceAll(/\\/g, '/'); -} - -function checkWorkspace(workspace: WorkspaceInfo): WorkspaceCheckResult { - const result = runNxSyncCommand(workspace, ['--check']); - - if (result.status === 0) { - return { needsSync: false, details: [] }; - } - - if (result.status === 1) { - const details = collectOutputLines(result); - return { - needsSync: true, - details: - details.length > 0 - ? details - : ['nx sync --check reported out-of-sync files.'], - }; - } - - throw new SyncError( - `Failed to verify nested workspace "${workspace.relativePath}"`, - collectOutputLines(result), - ); -} - -async function runNestedSync(workspace: PendingWorkspace) { - logger.info(`[nx-sync] Running nx sync inside ${workspace.relativePath}`); - const result = runNxSyncCommand(workspace, []); - - if (result.status !== 0) { - throw new SyncError( - `Failed to sync nested workspace "${workspace.relativePath}"`, - collectOutputLines(result), - ); - } -} - -function runNxSyncCommand( - workspace: WorkspaceInfo, - extraArgs: string[], -): SpawnSyncReturns { - const nxBin = resolveNxBinary(workspace); - const result = spawnSync(process.execPath, [nxBin, 'sync', ...extraArgs], { - cwd: workspace.absolutePath, - encoding: 'utf-8', - stdio: 'pipe', - }) as SpawnSyncReturns; - - if (result.error) { - throw new SyncError( - `Failed to execute Nx inside "${workspace.relativePath}"`, - [result.error.message], - ); - } - - if (result.status === null) { - throw new SyncError( - `Nx exited unexpectedly while processing "${workspace.relativePath}"`, - collectOutputLines(result), - ); - } - - return result; -} - -const nxBinaryCache = new Map(); - -function resolveNxBinary(workspace: WorkspaceInfo): string { - const cached = nxBinaryCache.get(workspace.absolutePath); - - if (cached) { - return cached; - } - - try { - const nxPath = require.resolve('nx/bin/nx.js', { - paths: [workspace.absolutePath], - }); - nxBinaryCache.set(workspace.absolutePath, nxPath); - return nxPath; - } catch { - throw new SyncError( - `Unable to locate Nx CLI for "${workspace.relativePath}"`, - [ - 'Install dependencies for that workspace or ensure it is a valid Nx project.', - ], - ); - } -} - -function collectOutputLines(result: SpawnSyncReturns): string[] { - const output = `${result.stdout ?? ''}${result.stderr ?? ''}`.trim(); - - if (!output) { - return []; - } - - const lines = output.split(/\r?\n/).map((line) => line.trimEnd()); - return lines.slice(-MAX_OUTPUT_LINES); -} - -function formatOutOfSyncDetail(workspace: PendingWorkspace): string[] { - if (!workspace.details.length) { - return [`- ${workspace.relativePath}`]; - } - - return [ - `- ${workspace.relativePath}`, - ...workspace.details.map((line) => ` ${line}`), - ]; -} - -async function cleanupMarkerFile() { - const absoluteMarkerPath = join(workspaceRoot, MARKER_FILE); - - try { - await fs.rm(absoluteMarkerPath, { force: true }); - } catch { - // Ignore cleanup errors; the file lives in .nx and is not committed. - } -} diff --git a/tools/nx-sync/src/generators/nested-sync/schema.d.ts b/tools/nx-sync/src/generators/nested-sync/schema.d.ts deleted file mode 100644 index 41adb645d..000000000 --- a/tools/nx-sync/src/generators/nested-sync/schema.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-empty-interface -export interface NxNestedSyncGeneratorSchema {} diff --git a/tools/nx-sync/src/generators/nested-sync/schema.json b/tools/nx-sync/src/generators/nested-sync/schema.json deleted file mode 100644 index d8afd11f6..000000000 --- a/tools/nx-sync/src/generators/nested-sync/schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Nested Nx sync generator", - "type": "object", - "properties": {}, - "additionalProperties": false -} diff --git a/tools/nx-sync/src/index.ts b/tools/nx-sync/src/index.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/tools/nx-sync/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/tools/nx-sync/tsconfig.json b/tools/nx-sync/tsconfig.json deleted file mode 100644 index 599279c6f..000000000 --- a/tools/nx-sync/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ], - "compilerOptions": {} -} diff --git a/tools/nx-sync/tsconfig.lib.json b/tools/nx-sync/tsconfig.lib.json deleted file mode 100644 index 459e40191..000000000 --- a/tools/nx-sync/tsconfig.lib.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "dist", - "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", - "emitDeclarationOnly": false, - "types": ["node"] - }, - "include": ["src/**/*.ts"], - "references": [] -} diff --git a/tools/nx-tsdown/README.md b/tools/nx-tsdown/README.md deleted file mode 100644 index 1a90c6120..000000000 --- a/tools/nx-tsdown/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# nx-tsdown - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build nx-tsdown` to build the library. diff --git a/tools/nx-tsdown/package.json b/tools/nx-tsdown/package.json deleted file mode 100644 index ab8e9667b..000000000 --- a/tools/nx-tsdown/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@abapify/nx-tsdown", - "version": "0.0.1", - "license": "MIT", - "private": true, - "type": "module", - "main": "./src/index.ts", - "module": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "types": "./src/index.ts", - "import": "./src/index.ts", - "default": "./src/index.ts" - } - } -} diff --git a/tools/nx-tsdown/project.json b/tools/nx-tsdown/project.json deleted file mode 100644 index 6f0090e34..000000000 --- a/tools/nx-tsdown/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "nx-tsdown", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "tools/nx-tsdown/src", - "projectType": "library", - "targets": { - "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], - "options": { - "outputPath": "dist/tools/nx-tsdown", - "main": "tools/nx-tsdown/src/index.ts", - "tsConfig": "tools/nx-tsdown/tsconfig.lib.json", - "assets": ["tools/nx-tsdown/*.md"] - } - } - }, - "tags": [] -} diff --git a/tools/nx-tsdown/scripts/build.sh b/tools/nx-tsdown/scripts/build.sh deleted file mode 100755 index 1e153742f..000000000 --- a/tools/nx-tsdown/scripts/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -# Change to the project directory -cd "$1" - -# Run tsdown -npx tsdown diff --git a/tools/nx-tsdown/src/index.ts b/tools/nx-tsdown/src/index.ts deleted file mode 100644 index df4a6b590..000000000 --- a/tools/nx-tsdown/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { createNodesV2 } from './plugin'; diff --git a/tools/nx-tsdown/src/plugin.ts b/tools/nx-tsdown/src/plugin.ts deleted file mode 100644 index 44d0fd5c1..000000000 --- a/tools/nx-tsdown/src/plugin.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { type CreateNodes, logger, workspaceRoot } from '@nx/devkit'; -import { dirname, join } from 'node:path'; -import { existsSync, readFileSync } from 'node:fs'; - -function isVerbose(): boolean { - // Check for --verbose flag in process arguments - if (process.argv.includes('--verbose')) { - return true; - } - - // Check NX_VERBOSE_LOGGING environment variable - if (process.env.NX_VERBOSE_LOGGING === 'true') { - return true; - } - - // Check for .env file with NX_VERBOSE_LOGGING - try { - const envPath = join(workspaceRoot, '.env'); - if (existsSync(envPath)) { - const envContent = readFileSync(envPath, 'utf-8'); - return envContent.includes('NX_VERBOSE_LOGGING=true'); - } - } catch (_e) { - // Ignore errors - } - - return false; -} - -function logDebug(message: string) { - if (isVerbose()) { - logger.info(`[nx-tsdown] ${message}`); - } -} - -export const createNodesV2: CreateNodes = [ - '**/tsdown.config.ts', - (configFiles, _options, _context) => { - const verbose = isVerbose(); - - if (verbose) { - logger.info( - `[nx-tsdown] Processing ${configFiles.length} tsdown config files`, - ); - } - - return configFiles - .filter((configFile) => dirname(configFile) !== '.') - .map((configFile) => { - const projectRoot = dirname(configFile); - logDebug(`Found tsdown.config.ts in ${projectRoot}`); - - const buildTarget = { - executor: 'nx:run-commands', - options: { - command: 'npx tsdown', - cwd: projectRoot, - }, - outputs: [`{projectRoot}/dist`], - cache: true, - inputs: [ - `{projectRoot}/src/**/*.ts`, - `{projectRoot}/tsconfig.lib.json`, - `{projectRoot}/tsdown.config.ts`, - `{projectRoot}/package.json`, - ], - dependsOn: ['^build'], - }; - - return [ - configFile, - { - projects: { - [projectRoot]: { - targets: { - build: buildTarget, - }, - }, - }, - }, - ]; - }); - }, -]; diff --git a/tools/nx-tsdown/tsconfig.json b/tools/nx-tsdown/tsconfig.json deleted file mode 100644 index 599279c6f..000000000 --- a/tools/nx-tsdown/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ], - "compilerOptions": {} -} diff --git a/tools/nx-tsdown/tsconfig.lib.json b/tools/nx-tsdown/tsconfig.lib.json deleted file mode 100644 index 459e40191..000000000 --- a/tools/nx-tsdown/tsconfig.lib.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "dist", - "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", - "emitDeclarationOnly": false, - "types": ["node"] - }, - "include": ["src/**/*.ts"], - "references": [] -} diff --git a/tools/nx-typecheck/README.md b/tools/nx-typecheck/README.md deleted file mode 100644 index 3e864c451..000000000 --- a/tools/nx-typecheck/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# nx-typecheck plugin - -Adds an automatic `typecheck` target to projects that contain a matching -TypeScript config file. The command defaults to `npx tsc -p tsconfig.json`, but -can be switched to `tsgo` or pointed at a different config file via the plugin -options in `nx.json`. diff --git a/tools/nx-typecheck/package.json b/tools/nx-typecheck/package.json deleted file mode 100644 index ff1da2f1a..000000000 --- a/tools/nx-typecheck/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@abapify/nx-typecheck", - "version": "0.0.1", - "license": "MIT", - "private": true, - "type": "module", - "main": "./src/index.ts", - "module": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "types": "./src/index.ts", - "import": "./src/index.ts", - "default": "./src/index.ts" - } - } -} diff --git a/tools/nx-typecheck/project.json b/tools/nx-typecheck/project.json deleted file mode 100644 index fb94f75ff..000000000 --- a/tools/nx-typecheck/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "nx-typecheck", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "tools/nx-typecheck/src", - "projectType": "library", - "targets": { - "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], - "options": { - "outputPath": "dist/tools/nx-typecheck", - "main": "tools/nx-typecheck/src/index.ts", - "tsConfig": "tools/nx-typecheck/tsconfig.lib.json", - "assets": ["tools/nx-typecheck/*.md"] - } - } - }, - "tags": [] -} diff --git a/tools/nx-typecheck/src/index.ts b/tools/nx-typecheck/src/index.ts deleted file mode 100644 index df4a6b590..000000000 --- a/tools/nx-typecheck/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { createNodesV2 } from './plugin'; diff --git a/tools/nx-typecheck/src/plugin.ts b/tools/nx-typecheck/src/plugin.ts deleted file mode 100644 index 13ae17a20..000000000 --- a/tools/nx-typecheck/src/plugin.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { - type CreateNodes, - type CreateNodesResult, - logger, - workspaceRoot, -} from '@nx/devkit'; -import { dirname, relative, basename, join } from 'node:path'; -import { existsSync, readFileSync } from 'node:fs'; - -interface NxTypecheckPluginOptions { - tsgo?: boolean; - configFile?: string; - clean?: boolean; -} - -function isVerbose(): boolean { - if (process.argv.includes('--verbose')) { - return true; - } - - if (process.env.NX_VERBOSE_LOGGING === 'true') { - return true; - } - - try { - const envPath = join(workspaceRoot, '.env'); - if (existsSync(envPath)) { - const envContent = readFileSync(envPath, 'utf-8'); - return envContent.includes('NX_VERBOSE_LOGGING=true'); - } - } catch { - // ignore - } - - return false; -} - -function logDebug(message: string) { - if (isVerbose()) { - logger.info(`[nx-typecheck] ${message}`); - } -} - -function shouldSkipPath(projectRoot: string): boolean { - if (projectRoot === workspaceRoot) { - return true; - } - - const rel = relative(workspaceRoot, projectRoot); - if (!rel || rel.startsWith('..')) { - return true; - } - - if (rel.includes('node_modules')) { - return true; - } - - return false; -} - -export const createNodesV2: CreateNodes = [ - '**/tsconfig*.json', - (configFiles, options = {}) => { - const configFileName = options.configFile ?? 'tsconfig.json'; - const useTsgo = options.tsgo ?? false; - const executorCommand = useTsgo ? 'npx tsgo' : 'npx tsc'; - const externalDependency = useTsgo - ? '@typescript/native-preview' - : 'typescript'; - const cleanEnabled = options.clean ?? false; - - const filteredConfigFiles = configFiles.filter( - (configFile) => basename(configFile) === configFileName, - ); - - logDebug( - `Detected ${filteredConfigFiles.length} ${configFileName} files for typecheck targets`, - ); - - return filteredConfigFiles - .map((configFile) => { - const projectRoot = dirname(configFile); - - if (shouldSkipPath(projectRoot)) { - logDebug(`Skipping ${projectRoot} (outside workspace or ignored)`); - return null; - } - - const relativeRoot = relative(workspaceRoot, projectRoot) || '.'; - logDebug(`Registering typecheck target for ${relativeRoot}`); - - const buildCommand = `${executorCommand} --build ${configFileName}`; - const command = cleanEnabled - ? `${executorCommand} --build --clean ${configFileName} && ${buildCommand}` - : buildCommand; - - const typecheckTarget = { - executor: 'nx:run-commands', - options: { - command, - cwd: projectRoot, - }, - cache: true, - inputs: [ - `{projectRoot}/src/**/*.ts`, - `{projectRoot}/${configFileName}`, - `{projectRoot}/package.json`, - `{workspaceRoot}/tsconfig.base.json`, - { externalDependencies: [externalDependency] }, - ], - }; - - const result: [string, CreateNodesResult] = [ - configFile, - { - projects: { - [projectRoot]: { - targets: { - typecheck: typecheckTarget, - }, - }, - }, - }, - ]; - return result; - }) - .filter( - (result): result is [string, CreateNodesResult] => result !== null, - ); - }, -]; diff --git a/tools/nx-typecheck/tsconfig.json b/tools/nx-typecheck/tsconfig.json deleted file mode 100644 index 599279c6f..000000000 --- a/tools/nx-typecheck/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ], - "compilerOptions": {} -} diff --git a/tools/nx-typecheck/tsconfig.lib.json b/tools/nx-typecheck/tsconfig.lib.json deleted file mode 100644 index 459e40191..000000000 --- a/tools/nx-typecheck/tsconfig.lib.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "dist", - "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", - "emitDeclarationOnly": false, - "types": ["node"] - }, - "include": ["src/**/*.ts"], - "references": [] -} diff --git a/tools/nx-vitest/README.md b/tools/nx-vitest/README.md deleted file mode 100644 index 815c86f94..000000000 --- a/tools/nx-vitest/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# nx-vitest - -NX plugin that automatically adds test targets to packages with vitest.config.ts files. - -## Features - -- Automatically detects `vitest.config.ts` files in packages -- Adds `test` target using `npx vitest run --reporter=default` -- Configures proper caching and dependencies -- Follows the same pattern as nx-tsdown plugin - -## Usage - -The plugin is automatically registered in nx.json and will detect any package with a vitest.config.ts file. diff --git a/tools/nx-vitest/package.json b/tools/nx-vitest/package.json deleted file mode 100644 index b8cbd0f59..000000000 --- a/tools/nx-vitest/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@abapify/nx-vitest", - "version": "0.0.1", - "license": "MIT", - "private": true, - "type": "module", - "main": "./src/index.ts", - "module": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "types": "./src/index.ts", - "import": "./src/index.ts", - "default": "./src/index.ts" - } - }, - "dependencies": { - "glob": "^10.0.0" - } -} diff --git a/tools/nx-vitest/project.json b/tools/nx-vitest/project.json deleted file mode 100644 index 1fed0d37d..000000000 --- a/tools/nx-vitest/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "nx-vitest", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "tools/nx-vitest/src", - "projectType": "library", - "targets": { - "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], - "options": { - "outputPath": "dist/tools/nx-vitest", - "main": "tools/nx-vitest/src/index.ts", - "tsConfig": "tools/nx-vitest/tsconfig.lib.json", - "assets": ["tools/nx-vitest/*.md"] - } - } - }, - "tags": [] -} diff --git a/tools/nx-vitest/src/index.ts b/tools/nx-vitest/src/index.ts deleted file mode 100644 index df4a6b590..000000000 --- a/tools/nx-vitest/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { createNodesV2 } from './plugin'; diff --git a/tools/nx-vitest/src/plugin.ts b/tools/nx-vitest/src/plugin.ts deleted file mode 100644 index 48e1f2049..000000000 --- a/tools/nx-vitest/src/plugin.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { type CreateNodes, logger, workspaceRoot } from '@nx/devkit'; -import { dirname, join, relative } from 'node:path'; -import { existsSync, readFileSync } from 'node:fs'; -import { glob } from 'glob'; - -function isVerbose(): boolean { - // Check for --verbose flag in process arguments - if (process.argv.includes('--verbose')) { - return true; - } - - // Check NX_VERBOSE_LOGGING environment variable - if (process.env.NX_VERBOSE_LOGGING === 'true') { - return true; - } - - // Check for .env file with NX_VERBOSE_LOGGING - try { - const envPath = join(workspaceRoot, '.env'); - if (existsSync(envPath)) { - const envContent = readFileSync(envPath, 'utf-8'); - return envContent.includes('NX_VERBOSE_LOGGING=true'); - } - } catch (_e) { - // Ignore errors - } - - return false; -} - -function logDebug(message: string) { - if (isVerbose()) { - logger.info(`[nx-vitest] ${message}`); - } -} - -function getRootVitestProjects(): string[] { - // Try different possible root config file names - const possibleConfigs = [ - 'vitest.config.ts', - 'vitest.config.js', - 'vitest.config.mts', - 'vitest.config.mjs', - 'vitest.config.cts', - 'vitest.config.cjs', - ]; - - let rootConfigPath: string | null = null; - for (const configName of possibleConfigs) { - const path = join(workspaceRoot, configName); - if (existsSync(path)) { - rootConfigPath = path; - break; - } - } - - if (!rootConfigPath) { - logDebug('No root vitest config found'); - return []; - } - - try { - const configContent = readFileSync(rootConfigPath, 'utf-8'); - - // Extract projects array from the config file - // Look for projects: [...] pattern - const projectsMatch = configContent.match(/projects:\s*\[([\s\S]*?)\]/); - - if (!projectsMatch) { - logDebug('No projects array found in root vitest.config.ts'); - return []; - } - - // Extract individual project patterns from the array - const projectsContent = projectsMatch[1]; - - // Find all string literals in the content, handling multiline and comments - const stringMatches = projectsContent.match(/['"`]([^'"`]+)['"`]/g); - const projectPatterns = stringMatches - ? stringMatches.map((match) => { - // Remove the quotes from each match - const cleaned = match.replace(/^['"`]/, '').replace(/['"`]$/, ''); - return cleaned; - }) - : []; - - logDebug(`Raw projects content: ${projectsContent}`); - logDebug(`String matches: ${JSON.stringify(stringMatches)}`); - logDebug(`Extracted patterns: ${JSON.stringify(projectPatterns)}`); - - logDebug(`Found project patterns: ${projectPatterns.join(', ')}`); - return projectPatterns; - } catch (error) { - logger.warn(`[nx-vitest] Failed to parse root vitest.config.ts: ${error}`); - return []; - } -} - -function isProjectInVitestConfig( - projectPath: string, - vitestProjects: string[], -): boolean { - const relativePath = relative(workspaceRoot, projectPath); - - for (const pattern of vitestProjects) { - try { - // Use glob to find all files matching the pattern - const matches = glob.sync(pattern, { cwd: workspaceRoot }); - - // Check if any of the matched files are in this project directory - const projectMatches = matches.filter((match) => { - const matchDir = dirname(match); - return matchDir === relativePath; - }); - - if (projectMatches.length > 0) { - logDebug( - `Project ${relativePath} matches pattern ${pattern} - found files: ${projectMatches.join( - ', ', - )}`, - ); - return true; - } - } catch (error) { - logDebug(`Error matching pattern ${pattern}: ${error}`); - } - } - - logDebug( - `Project ${relativePath} does not match any vitest project patterns`, - ); - return false; -} - -export const createNodesV2: CreateNodes = [ - '**/vitest.config.{ts,js,mts,mjs,cts,cjs}', - (configFiles, _options, _context) => { - const verbose = isVerbose(); - - if (verbose) { - logger.info( - `[nx-vitest] Processing ${configFiles.length} vitest config files`, - ); - } - - // Get the project patterns from root vitest config - const vitestProjects = getRootVitestProjects(); - - if (vitestProjects.length === 0) { - logDebug('No vitest projects configured, skipping test target creation'); - return []; - } - - return configFiles - .map((configFile) => { - const projectRoot = dirname(configFile); - logDebug(`Found vitest.config.ts in ${projectRoot}`); - - // Skip the root vitest.config.ts file itself - if (projectRoot === workspaceRoot) { - logDebug('Skipping root vitest.config.ts'); - return null; - } - - // Check if this project is included in the root vitest config - if (!isProjectInVitestConfig(projectRoot, vitestProjects)) { - logDebug(`Skipping ${projectRoot} - not in root vitest projects`); - return null; - } - - const baseInputs = [ - `{projectRoot}/src/**/*.ts`, - `{projectRoot}/tests/**/*`, - `{projectRoot}/vitest.config.ts`, - `{projectRoot}/package.json`, - `{workspaceRoot}/vitest.config.ts`, - ]; - - const testTarget = { - executor: 'nx:run-commands', - options: { - command: 'npx vitest run --reporter=default', - cwd: projectRoot, - }, - outputs: [`{projectRoot}/coverage`], - cache: true, - inputs: baseInputs, - dependsOn: ['^build'], - }; - - const testWatchTarget = { - executor: 'nx:run-commands', - options: { - command: 'npx vitest --reporter=default', - cwd: projectRoot, - }, - cache: false, // Watch mode shouldn't be cached - inputs: baseInputs, - dependsOn: ['^build'], - }; - - const testCoverageTarget = { - executor: 'nx:run-commands', - options: { - command: 'npx vitest run --coverage --reporter=default', - cwd: projectRoot, - }, - outputs: [`{projectRoot}/coverage`], - cache: true, - inputs: baseInputs, - dependsOn: ['^build'], - }; - - return [ - configFile, - { - projects: { - [projectRoot]: { - targets: { - test: testTarget, - 'test:watch': testWatchTarget, - 'test:coverage': testCoverageTarget, - }, - }, - }, - }, - ]; - }) - .filter(Boolean) as Array<[string, any]>; - }, -]; diff --git a/tools/nx-vitest/tsconfig.json b/tools/nx-vitest/tsconfig.json deleted file mode 100644 index 599279c6f..000000000 --- a/tools/nx-vitest/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ], - "compilerOptions": {} -} diff --git a/tools/nx-vitest/tsconfig.lib.json b/tools/nx-vitest/tsconfig.lib.json deleted file mode 100644 index 459e40191..000000000 --- a/tools/nx-vitest/tsconfig.lib.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "dist", - "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", - "emitDeclarationOnly": false, - "types": ["node"] - }, - "include": ["src/**/*.ts"], - "references": [] -} diff --git a/tsconfig.json b/tsconfig.json index b7dd6c12a..ebce04f00 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -39,30 +39,18 @@ { "path": "./packages/adt-flow" }, - { - "path": "./tools/nx-typecheck" - }, { "path": "./packages/adt-auth" }, { "path": "./packages/logger" }, - { - "path": "./tools/nx-tsdown" - }, - { - "path": "./tools/nx-vitest" - }, { "path": "./packages/ts-xsd" }, { "path": "./packages/speci" }, - { - "path": "./tools/nx-sync" - }, { "path": "./packages/adk" }, From dfa200cd53e690332a243d1d9f7b464c1506c259 Mon Sep 17 00:00:00 2001 From: ThePlenkov Date: Tue, 29 Sep 2026 23:31:55 +0000 Subject: [PATCH 2/2] chore(repo): drop stale discrepancy audit, ignore gate lock file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit discrepancy_report.md was a one-off May audit (Jules). Its findings are now either resolved by the spec reconciliation work (#227) or tracked as live beads: thin-adapter violation in sap_connect (ac-b5o) and the adt-cli dependency leak in adt-mcp (ac-c07). Also gitignore .beads.gate.lock — runtime artifact of the bead gate. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .gitignore | 1 + discrepancy_report.md | 80 ------------------------------------------- 2 files changed, 1 insertion(+), 80 deletions(-) delete mode 100644 discrepancy_report.md diff --git a/.gitignore b/.gitignore index bf159e176..9aa3ab9c7 100644 --- a/.gitignore +++ b/.gitignore @@ -176,6 +176,7 @@ __pycache__/ # Gas City .beads/* !.beads/identity.toml +.beads.gate.lock gascity/AGENTS.md # Dev TLS material — private keys must never be committed. diff --git a/discrepancy_report.md b/discrepancy_report.md deleted file mode 100644 index 576bd8b40..000000000 --- a/discrepancy_report.md +++ /dev/null @@ -1,80 +0,0 @@ -# Triangular Consistency Review: Discrepancy Report - -**Date**: Omitted to avoid stale report metadata. -**Auditor**: Jules, Senior Solutions Architect -**Project**: abapify / adt-cli -**Scope**: `adt-mcp` (HTTP transport), `adt-client`, and core service dependencies. - ---- - -## UPDATE SPEC - -_Features or constraints in the code that are superior to the original design but were never formalized._ - -### 1. Contract-Driven Client Architecture - -- **Location**: `packages/adt-client/src/client.ts` vs. `openspec/specs/adt-client/spec.md` -- **The Conflict**: The spec defines a high-level, hand-crafted API (`getObject`, `updateObject`). The code implements a "Contract-Based" architecture where `client.adt` exposes raw ADT endpoints derived automatically from XSDs via `speci`. -- **Root Cause Suggestion**: Design evolution. The team realized that maintaining a high-level API for 100+ ADT endpoints was unsustainable and shifted to a generator-driven approach to ensure 100% coverage and type safety. -- **Recommended Fix**: **UPDATE SPEC**. Redefine the `adt-client` specification to center on the Contract-Driven model. Move high-level "business" operations to the ADK (ABAP Development Kit) section of the spec. - -### 2. Local-Auth Bridge for MCP - -- **Location**: `packages/adt-mcp/src/lib/tools/sap-connect.ts` vs. `openspec/changes/add-mcp-http-transport/specs/adt-mcp/spec.md` -- **The Conflict**: The implementation of `sap_connect` supports resolving system credentials from the `~/.adt` session store (Priority C). The spec already allows inline connection credentials and `{ systemId }`, but it does not appear to formalize this additional local auth-store resolution path. -- **Root Cause Suggestion**: "Superior" shortcut. Developers added support for local session reuse to make the MCP server easier to use in local dev environments (e.g., Cursor/VS Code) without re-entering passwords. -- **Recommended Fix**: **UPDATE SPEC**. Formalize the `~/.adt` session store as an additional valid resolution path for the `sap_connect` tool. - ---- - -## UPDATE DOCUMENTATION - -_Logic that exists in the code but is missing or incorrectly described in the manuals._ - -### 1. HTTP Transport "Stealth" Mode - -- **Location**: `packages/adt-mcp/src/lib/http/server.ts` vs. `website/docs/mcp/overview.md` -- **The Conflict**: User documentation explicitly states: "The transport is always stdio — no HTTP port, no daemon." However, the code contains a full `StreamableHTTPServerTransport` implementation with session management, OAuth, and CORS. -- **Root Cause Suggestion**: Documentation lag. The HTTP transport was implemented as part of a "Wave" that is code-complete but hasn't had its docs promoted to the public site yet. -- **Recommended Fix**: **UPDATE DOCUMENTATION**. Publish the "Streamable HTTP" guide. Explain the `Mcp-Session-Id` requirement and the `sap_connect` lifecycle. - -### 2. 3-Step CSRF Handshake Invisibility - -- **Location**: `packages/adt-client/src/adapter.ts` vs. `website/docs/architecture/overview.md` -- **The Conflict**: `website/docs/architecture/overview.md` mentions CSRF tokens but does not explain the mandatory 3-step security session handshake (Create Session -> Fetch Token -> Delete Session) required by SAP for lock binding. The flow is implemented correctly in `SessionManager` and described elsewhere in the repo, but the architecture overview omits it. -- **Root Cause Suggestion**: Documentation structure gap. The SAP handshake was documented in more specialized pages, but the high-level architecture overview was not updated to summarize it or link readers to the deeper explanations. -- **Recommended Fix**: **UPDATE DOCUMENTATION**. Add a brief "Security Session Protocol" section to `website/docs/architecture/overview.md` and cross-link to the existing detailed docs (for example `website/docs/sdk/contracts/core-http.md` and `website/docs/architecture/mock-server.md`) to aid future transport implementers (e.g., if adding Python/Go clients). - -### 3. Change-Tracking (ETag) Management - -- **Location**: `packages/adt-client/src/adapter.ts` vs. `website/docs/sdk/packages/adt-client.md` -- **The Conflict**: The client implementation features an automated ETag cache/refresh mechanism to prevent "lost updates" (Optimistic Concurrency Control). Consuming developers aren't told they need to use `clearETag()` after certain out-of-band operations. -- **Root Cause Suggestion**: Documentation rot. The ETag logic was hardened recently, but the SDK guide hasn't been updated to reflect the `clearETag` API. -- **Recommended Fix**: **UPDATE DOCUMENTATION**. Update the SDK guide to explain the ETag lifecycle and when manual cache clearing is required. - ---- - -## REFACTOR CODE - -_Implementation violates core architectural patterns defined in the spec._ - -### 1. MCP "Thin Adapter" Violation - -- **Location**: `packages/adt-mcp/src/lib/tools/sap-connect.ts` -- **The Conflict**: The `AGENTS.md` and `overview.md` define the MCP server as a "thin adapter". However, `sap_connect` contains significant branching logic for client resolution and verification. -- **Root Cause Suggestion**: Shortcut in coding. It was easier to implement the resolution logic directly in the tool handler than to create a dedicated `ConnectionService` in `adt-cli` or `adt-client`. -- **Recommended Fix**: **REFACTOR CODE**. Move the client resolution logic (Priority A/B/C) into a reusable service in `@abapify/adt-cli`. The MCP tool should simply call `ConnectionService.resolve(args)`. - -### 2. Parity Invariant Violation (`sap_connect`) - -- **Location**: `packages/adt-mcp/src/lib/tools/index.ts` -- **The Conflict**: `AGENTS.md` states: "Every CLI subcommand has a matching MCP tool, and every MCP tool has a matching CLI subcommand." The `sap_connect` and `sap_disconnect` tools have no CLI equivalent. -- **Root Cause Suggestion**: Design mismatch. These tools were viewed as "transport-specific" (HTTP only), but the invariant is stated as a global monorepo rule. -- **Recommended Fix**: **REFACTOR CODE** (or **UPDATE SPEC**). Either implement `adt auth connect/disconnect` (which would update the local session store) or explicitly exempt lifecycle tools from the parity invariant in `AGENTS.md`. - -### 3. Dependency Leak (`adt-cli` in `adt-mcp` tools) - -- **Location**: `packages/adt-mcp/src/lib/tools/sap-connect.ts` -- **The Conflict**: The tool imports `getAdtClientV2Safe` from `@abapify/adt-cli` via its public entrypoint, so this is not a deep-import problem. The actual concern is architectural coupling: `adt-mcp` tools are relying on CLI-owned auth-store / connection-resolution behavior instead of a transport-agnostic shared service layer. -- **Root Cause Suggestion**: Shortcut in coding. -- **Recommended Fix**: **REFACTOR CODE**. Extract or expose the connection/auth resolution logic through a shared service contract that `adt-mcp` can consume directly, rather than depending on CLI-specific bridge helpers.