From a8f0bed45eb8629a9d8f455de456412591c57af0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 31 Oct 2026 08:39:03 +0000 Subject: [PATCH 1/4] chore: drop banned typecheck paths and fix broken npm scripts Remove root astro check/tsc scripts and stale docs references; repoint broken npm script paths; align agent/devcontainer docs with oxlint-only lint. --- .devcontainer/devcontainer.json | 2 +- GEMINI.md | 5 +- Makefile | 8 +- .../content-store/docs/development-setup.md | 3 +- .../docs/getting-started/setup.md | 3 +- apps/web/src/scripts/fix-ts-errors.sh | 79 ------- apps/web/src/scripts/ts-error-docs.md | 177 ---------------- package.json | 30 +-- pnpm-lock.yaml | 199 ------------------ reasonix.toml | 6 +- scripts/content/blog-web.js | 2 +- scripts/utils/tag-manager.cjs | 10 +- scripts/utils/tag-manager.js | 74 ------- 13 files changed, 24 insertions(+), 574 deletions(-) delete mode 100644 apps/web/src/scripts/fix-ts-errors.sh delete mode 100644 apps/web/src/scripts/ts-error-docs.md delete mode 100644 scripts/utils/tag-manager.js diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e7e18a54ad..9ded0f668b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ // Devcontainer: the only outright zero on the readiness report. -// Matches the documented toolchain exactly: Node 24 + pnpm 11.24 +// Matches the documented toolchain exactly: Node 24 + pnpm 12.16.1 // (packageManager pin), Python 3.14 via uv (ai/ requires-python), // and docker-outside-of-docker for the throwaway pe test database // (make pe-test-db). Submodules are checked out by the post-create diff --git a/GEMINI.md b/GEMINI.md index d1c8931026..2df9dbdcf9 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -49,8 +49,7 @@ Python): # Frontend & Services (Astro 6 / React 19 / Express) pnpm dev # Start Astro frontend (port 5173) pnpm dev:all-services # Start complete local service ecosystem -pnpm typecheck # Run TypeScript compiler checks -pnpm lint # ESLint & formatting audits +pnpm lint # oxlint (type-aware) and repo lint gates pnpm vitest run -c config/vitest.config.ts # Run unit/integration tests pnpm build # Production build @@ -92,6 +91,6 @@ uv run python -m # Run Python module 1. **Grounded Approach**: Confirm understanding against Foresight context. 2. **Minimal-Safe Edits**: Implement surgical code changes. 3. **Targeted Verification**: Run tests (`pnpm vitest`, `uv run pytest`) and - linting (`pnpm typecheck`). + linting (`pnpm lint`). 4. **State Capture**: Update `pending_items` or store new decisions in Foresight before closing. diff --git a/Makefile b/Makefile index 4015857d62..4d02693ff3 100644 --- a/Makefile +++ b/Makefile @@ -57,11 +57,11 @@ format: ## Format all code format-check: ## Check formatting pnpm format:check -typecheck: ## Run TypeScript type check - pnpm typecheck +typecheck: ## Run oxlint type-aware lint (see AGENTS.md — no tsc/astro check) + pnpm lint -check-all: ## Run all checks (typecheck + lint + format) - pnpm check:all +check-all: ## Run lint gates (formerly check:all; typecheck scripts removed) + pnpm lint # ── Docker ────────────────────────────────────────────── diff --git a/apps/web/src/content-store/docs/development-setup.md b/apps/web/src/content-store/docs/development-setup.md index 6a2f405fa0..c0ee2a826b 100644 --- a/apps/web/src/content-store/docs/development-setup.md +++ b/apps/web/src/content-store/docs/development-setup.md @@ -124,7 +124,6 @@ pnpm run diagnostics ## Additional Development Tools -- **Code Linting**: `pnpm lint` -- **Type Checking**: `pnpm typecheck` +- **Code Linting**: `pnpm lint` (oxlint, type-aware) - **Testing**: `pnpm test` - **Formatting**: `pnpm format` diff --git a/apps/web/src/content-store/docs/getting-started/setup.md b/apps/web/src/content-store/docs/getting-started/setup.md index 6a2f405fa0..c0ee2a826b 100644 --- a/apps/web/src/content-store/docs/getting-started/setup.md +++ b/apps/web/src/content-store/docs/getting-started/setup.md @@ -124,7 +124,6 @@ pnpm run diagnostics ## Additional Development Tools -- **Code Linting**: `pnpm lint` -- **Type Checking**: `pnpm typecheck` +- **Code Linting**: `pnpm lint` (oxlint, type-aware) - **Testing**: `pnpm test` - **Formatting**: `pnpm format` diff --git a/apps/web/src/scripts/fix-ts-errors.sh b/apps/web/src/scripts/fix-ts-errors.sh deleted file mode 100644 index 971cab4513..0000000000 --- a/apps/web/src/scripts/fix-ts-errors.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -set -euo pipefail - -# Fix TypeScript Errors - Shell Script Wrapper -# This script provides a convenient way to run the TypeScript error fixer - -# Colors for better output -# shellcheck disable=SC2034 -# shellcheck disable=SC2034 -# shellcheck disable=SC2034 -# shellcheck disable=SC2034 -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Check if we're in the right environment -if [[ -z ${CONDA_DEFAULT_ENV} ]] || [[ ${CONDA_DEFAULT_ENV} != "pixelated" ]]; then - echo -e "${YELLOW}Warning: Not in the pixelated conda environment.${NC}" - echo -e "${YELLOW}It's recommended to run: conda activate pixelated${NC}" - read -p "Continue anyway? (y/n) " -n 1 -r - echo - if [[ ! ${REPLY} =~ ^[Yy]$ ]]; then - exit 1 - fi -fi -# Change to the project root directory -if [[ -z ${PROJECT_ROOT} ]]; then - PROJECT_ROOT="$(cd "$(dirname "${0}")/../.." && pwd)" -fi -if [[ -z ${PROJECT_ROOT} ]]; then - echo -e "${RED}Error: Could not find project root directory.${NC}" - exit 1 -fi -cd "${PROJECT_ROOT}" || { - echo -e "${RED}Error: Could not change to project root directory.${NC}" -} - -echo -e "${BLUE}=== TypeScript Error Fixer ===${NC}" -echo -e "${BLUE}Project root: ${PROJECT_ROOT}${NC}" - -# Check if the TypeScript fixer script exists -TS_FIXER="src/scripts/fix-ts-errors.ts" -if [[ ! -f ${TS_FIXER} ]]; then - echo -e "${RED}Error: TypeScript fixer script not found at ${TS_FIXER}${NC}" - exit 1 -fi - -# Check if arguments are provided -if [[ ${1} == "--help" ]]; then - echo "Usage: ./fix-ts-errors.sh [options]" - echo "" - echo "Options:" - echo " --dry-run Preview changes without applying them" - echo " --verbose Show detailed logging" - echo " --list List files with TypeScript errors" - echo " --fix-file Fix a specific file (e.g. --fix-file src/components/Chat.tsx)" - echo " --help Show this help message" - exit 0 -fi - -# Run the TypeScript fixer script -echo -e "${GREEN}Running TypeScript error fixer...${NC}" -npx tsx "${TS_FIXER}" "$@" - -# Check the result -if [[ ${?} -eq 0 ]]; then - echo -e "${GREEN}TypeScript error fixer completed successfully.${NC}" - - # Provide helpful next steps - echo -e "${BLUE}Next steps:${NC}" - echo -e "1. Run ${YELLOW}npx tsc --noEmit${NC} to check for remaining errors" - echo -e "2. To fix specific files, use ${YELLOW}./fix-ts-errors.sh --fix-file path/to/file.ts${NC}" - echo -e "3. To run in dry-run mode (preview only), use ${YELLOW}./fix-ts-errors.sh --dry-run${NC}" -else - echo -e "${RED}TypeScript error fixer encountered problems.${NC}" - echo -e "Try running with ${YELLOW}--verbose${NC} for more details." -fi diff --git a/apps/web/src/scripts/ts-error-docs.md b/apps/web/src/scripts/ts-error-docs.md deleted file mode 100644 index 2e4fac1355..0000000000 --- a/apps/web/src/scripts/ts-error-docs.md +++ /dev/null @@ -1,177 +0,0 @@ -# TypeScript Error Fixing Guide - -This document outlines common TypeScript errors found in the project and how -they're addressed by the `fix-ts-errors.ts` script. - -## Common Error Patterns - -### 1. Underscore Variable Pattern - -**Problem:** Variables are defined with an underscore prefix (`_variable`) but -then used without the underscore (`variable`). - -**Example:** - -```typescript -// Error: -const user = await getUser() -console.log(user.name) // Error: 'user' is not defined - -// Fixed: -const user = await getUser() -console.log(user.name) // Correctly using user -``` - -### 2. Missing Properties in AIMessage Interface - -**Problem:** The `AIMessage` interface requires a `name` property, but it's -often omitted. - -**Example:** - -```typescript -// Error: -const message: AIMessage = { - role: 'user', - content: 'Hello', -} // Error: Property 'name' is missing - -// Fixed: -const message: AIMessage = { - role: 'user', - content: 'Hello', - name: '', // Added required property -} -``` - -### 3. Nullable Property Access - -**Problem:** Accessing properties on objects that could be null or undefined -without optional chaining. - -**Example:** - -```typescript -// Error: -const name = error.message // Error if error is null or undefined - -// Fixed: -const name = error?.message // Safely accesses message if error exists -``` - -## Using the TypeScript Error Fixer - -The `fix-ts-errors.ts` script automates the process of fixing these common -errors. Here's how to use it: - -### Prerequisites - -1. Make sure you're in the correct conda environment: - - ```bash - conda activate pixelated - ``` - -2. Run the script from the project root directory. - -### Commands - -1. **List files with TypeScript errors:** - - ```bash - ./src/scripts/fix-ts-errors.sh --list - ``` - -2. **Fix all TypeScript errors:** - - ```bash - ./src/scripts/fix-ts-errors.sh - ``` - -3. **Preview fixes without making changes:** - - ```bash - ./src/scripts/fix-ts-errors.sh --dry-run - ``` - -4. **Fix errors in a specific file:** - - ```bash - ./src/scripts/fix-ts-errors.sh --fix-file src/components/demo/ChatDemo.tsx - ``` - -5. **Get detailed logs during fixing:** - ```bash - ./src/scripts/fix-ts-errors.sh --verbose - ``` - -## Manual Fixes - -Some TypeScript errors require manual intervention because they involve complex -logic or project-specific knowledge. Here are some tips for common manual fixes: - -### 1. Type Assertion When Needed - -```typescript -// Error: -const id = someFunction() // Type 'unknown' is not assignable to type 'string' - -// Fixed using type assertion: -const id = someFunction() as string -``` - -### 2. Properly Typing React Components - -```typescript -// Error: -function MyComponent(props) { - /* ... */ -} // 'props' implicitly has 'any' type - -// Fixed: -interface MyComponentProps { - name: string - age?: number -} - -function MyComponent(props: MyComponentProps) { - /* ... */ -} -``` - -### 3. Adding Type Guards - -```typescript -// Error: -function processData(data: any) { - return data.value // Unsafe property access -} - -// Fixed with type guard: -function processData(data: unknown) { - if (data && typeof data === 'object' && 'value' in data) { - return data.value - } - return undefined -} -``` - -## Troubleshooting - -If you encounter issues with the automatic fixer: - -1. Try running TypeScript compiler to see detailed error messages: - - ```bash - npx tsc --noEmit - ``` - -2. Fix one file at a time using the `--fix-file` option. - -3. Some complex errors may require manual fixing. Use the error messages from - the TypeScript compiler as guidance. - ---- - -For more information, contact the development team or refer to the TypeScript -documentation. diff --git a/package.json b/package.json index 820487a9f3..a3e9e56848 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dev:training-server": "NODE_ENV=development tsx apps/web/src/lib/services/training/server.ts", "dev:websocket": "NODE_ENV=development tsx apps/web/src/server.ts", "dev:academic-sourcing": "ENV=development uv run uvicorn ai.sourcing.academic.api.main:app --host 0.0.0.0 --port 8000 --reload", - "dev:all-services": "scripts/dev/health-check.sh --quiet && concurrently \"pnpm dev\" \"pnpm dev:bias-detection\" \"pnpm dev:ai-service\" \"pnpm dev:analytics\" \"pnpm dev:worker\" \"pnpm dev:training-server\" \"pnpm dev:websocket\" \"pnpm dev:academic-sourcing\" \"pnpm bias:py\"", + "dev:all-services": "concurrently \"pnpm dev\" \"pnpm dev:bias-detection\" \"pnpm dev:ai-service\" \"pnpm dev:analytics\" \"pnpm dev:worker\" \"pnpm dev:training-server\" \"pnpm dev:websocket\" \"pnpm dev:academic-sourcing\" \"pnpm bias:py\"", "agent:runner": "uv run python -m tools.agent_runner run", "agent:runner:once": "uv run python -m tools.agent_runner run --once", "agent:triage": "uv run python -m tools.agent_runner triage", @@ -88,21 +88,12 @@ "lint:markdown:ci": "node scripts/ci/lint-changed.mjs --markdown", "lint:markdown:ci:all": "pnpm exec markdownlint --config .markdownlint.json --ignore node_modules --ignore '**/node_modules/**' \"**/*.md\" \"**/*.mdx\"", "lint:fix": "oxlint -c .oxlintrc.json --fix-dangerously . && pnpm lint:no-suppressions", - "typecheck": "NODE_OPTIONS='--max-old-space-size=8192' astro check && NODE_OPTIONS='--max-old-space-size=8192' tsc --noEmit", - "typecheck:strict": "NODE_OPTIONS='--max-old-space-size=8192' tsx scripts/validate-typescript.ts", - "type-check": "pnpm run typecheck", - "check": "NODE_OPTIONS='--max-old-space-size=8192' astro check", - "check:all": "pnpm run check && pnpm run typecheck", "ts:debug": "./debug-typescript.sh normal", "ts:debug:verbose": "./debug-typescript.sh verbose", "ts:debug:minimal": "./debug-typescript.sh minimal", "ts:debug:clean": "./debug-typescript.sh clean", "ts:debug:repro": "./debug-typescript.sh repro", "ts:debug:monitor": "./debug-typescript.sh monitor", - "ts:check:debug": "tsc --noEmit --project config/tsconfig.debug.json", - "ts:check:main": "tsc --noEmit --project config/tsconfig.json", - "ts:check:aws": "tsc --noEmit --project config/tsconfig.aws.json", - "ts:compare": "pnpm run ts:check:debug && echo '✅ Debug config works' && pnpm run ts:check:main && echo '✅ Main config works'", "ts:switch:debug": "cp config/tsconfig.json config/tsconfig.json.backup && cp config/tsconfig.debug.json config/tsconfig.json", "ts:switch:main": "cp config/tsconfig.json.backup config/tsconfig.json", "ts:logs": "echo 'TypeScript logs location varies by system. Run: ./debug-typescript.sh normal'", @@ -206,7 +197,7 @@ "submodules:update": "git submodule update", "submodules:sync": "git submodule init && git submodule update", "jules:setup": "bash scripts/devops/jules-setup.sh", - "jules:check": "git status | grep 'on branch staging' || (echo '❌ ERROR: Jules must work on staging branch' && exit 1) && pnpm check:all", + "jules:check": "git status | grep 'on branch staging' || (echo '❌ ERROR: Jules must work on staging branch' && exit 1) && pnpm lint", "hooks:install": "if [ -f scripts/devops/install-git-hooks.sh ]; then bash scripts/devops/install-git-hooks.sh; else echo \"Skipping git hooks install: scripts/devops/install-git-hooks.sh not found.\"; fi", "prepare": "husky && pnpm run -s hooks:install", "safe": "./scripts/utils/no-fail.sh", @@ -216,23 +207,16 @@ "safe:test:e2e": "./scripts/utils/no-fail.sh pnpm run test:e2e", "safe:test:all": "./scripts/utils/no-fail.sh pnpm run test:all", "safe:lint": "./scripts/utils/no-fail.sh pnpm run lint", - "safe:typecheck": "./scripts/utils/no-fail.sh pnpm run typecheck", - "tags:create": "node scripts/tag-manager.js create", - "tags:list": "node scripts/tag-manager.js list", - "tags:validate": "node scripts/tag-manager.js validate", - "tags:cleanup": "node scripts/tag-manager.js cleanup", - "tags:maintenance": "node scripts/tag-maintenance.js full-maintenance", - "version:release": "node scripts/version-manager.js release", - "version:info": "node scripts/version-manager.js info", + "tags:create": "node scripts/utils/tag-manager.cjs create", + "tags:list": "node scripts/utils/tag-manager.cjs list", + "tags:validate": "node scripts/utils/tag-manager.cjs validate", + "tags:cleanup": "node scripts/utils/tag-manager.cjs cleanup", "toolbar:on": "astro preferences enable devToolbar", "toolbar:off": "astro preferences disable devToolbar", "blog-publisher": "tsx apps/web/src/lib/scripts/blog-publisher.ts", - "blog": "node scripts/blog-web.js", + "blog": "node scripts/content/blog-web.js", "schedule-posts": "node scripts/content/schedule-posts.js", "mcp:installer": "pnpm exec cursor-mcp-installer-free /workspaces/pixelated", - "mcp:list": "node scripts/mcp-manager.js list", - "mcp:run": "node scripts/mcp-manager.js run", - "mcp:manage": "node scripts/mcp-manager.js", "backend:up": "set -a && . ./.env.backend && set +a && docker compose -f infra/docker/docker-compose.backend.yml up -d", "backend:down": "set -a && . ./.env.backend && set +a && docker compose -f infra/docker/docker-compose.backend.yml down", "backend:logs": "set -a && . ./.env.backend && set +a && docker compose -f infra/docker/docker-compose.backend.yml logs -f", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31874ca5fc..67c2b6aa46 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1769,43 +1769,6 @@ importers: specifier: ~5.7.3 version: 5.7.3 - foresight/cli: - dependencies: - '@clack/prompts': - specifier: ^0.7.0 - version: 0.7.0 - commander: - specifier: ^12.1.0 - version: 12.1.0 - ioredis: - specifier: ^5.4.1 - version: 5.11.1(supports-color@10.2.2) - ora: - specifier: ^8.1.1 - version: 8.2.0 - pg: - specifier: ^8.13.0 - version: 8.23.1 - picocolors: - specifier: ^1.1.0 - version: 1.1.1 - devDependencies: - '@types/node': - specifier: ^22.9.0 - version: 22.20.5 - '@types/pg': - specifier: ^8.11.10 - version: 8.23.1 - tsup: - specifier: ^8.3.5 - version: 8.5.1(jiti@2.7.0)(postcss@8.5.30)(supports-color@10.2.2)(tsx@4.23.15)(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.1.10 - version: 4.1.12(@opentelemetry/api@1.9.1)(@types/node@22.20.5)(@vitest/coverage-v8@4.1.12)(jsdom@30.1.3(@noble/hashes@2.4.0))(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) - packages/autoreview: dependencies: '@ai-sdk/anthropic': @@ -2904,18 +2867,10 @@ packages: resolution: {integrity: sha512-JrsQaiUg3rJIgIcqXteuhgccmbzlwyv9LSBlUokDeX6nFD0I3nrn+msLiI381NYKpu6V/l8GrNWF9Y73JeyMcw==} engines: {node: '>=20'} - '@clack/core@0.3.5': - resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} - '@clack/core@1.5.1': resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} engines: {node: '>= 20.12.0'} - '@clack/prompts@0.7.0': - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - bundledDependencies: - - is-unicode-supported - '@clack/prompts@1.8.1': resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} engines: {node: '>= 20.12.0'} @@ -7884,9 +7839,6 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.20.5': - resolution: {integrity: sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==} - '@types/node@24.19.2': resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} @@ -9517,10 +9469,6 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-truncate@5.2.0: resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} @@ -11742,10 +11690,6 @@ packages: resolution: {integrity: sha512-li88H4QGRoNMX27jEmY8nR515oJVspAgC/WFMlhHfFV8RJ4QyGpHhXnwAe9gH5RIgKmdYRUmrOhQobcgEjIdSw==} engines: {node: '>=18'} - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -11837,10 +11781,6 @@ packages: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} engines: {node: '>=0.10.0'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -12526,10 +12466,6 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} @@ -13374,10 +13310,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - os-paths@4.4.0: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} @@ -14724,10 +14656,6 @@ packages: std-env@4.3.0: resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -15370,9 +15298,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@6.29.0: resolution: {integrity: sha512-yzE4aF6qGj7fE8lu8fE8LonY07kmMXs20QR1bG3JGJ+jXrVTLtgUBieEr74AQRChYyqHrhJm9IktT337qOQhng==} @@ -17738,22 +17663,11 @@ snapshots: '@chat-adapter/catalog@4.42.0': {} - '@clack/core@0.3.5': - dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 - '@clack/core@1.5.1': dependencies: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@0.7.0': - dependencies: - '@clack/core': 0.3.5 - picocolors: 1.1.1 - sisteransi: 1.0.5 - '@clack/prompts@1.8.1': dependencies: '@clack/core': 1.5.1 @@ -23050,10 +22964,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.20.5': - dependencies: - undici-types: 6.21.0 - '@types/node@24.19.2': dependencies: undici-types: 7.24.6 @@ -23851,15 +23761,6 @@ snapshots: msw: 3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4) - '@vitest/mocker@4.1.12(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4))': - dependencies: - '@vitest/spy': 4.1.12 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - msw: 3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) - vite: 8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4) - '@vitest/mocker@4.1.12(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4))': dependencies: '@vitest/spy': 4.1.12 @@ -25004,8 +24905,6 @@ snapshots: dependencies: restore-cursor: 5.1.0 - cli-spinners@2.9.2: {} - cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 @@ -27363,8 +27262,6 @@ snapshots: global-directory: 4.0.1 is-path-inside: 4.0.0 - is-interactive@2.0.0: {} - is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -27438,8 +27335,6 @@ snapshots: dependencies: unc-path-regex: 0.1.2 - is-unicode-supported@1.3.0: {} - is-unicode-supported@2.1.0: {} is-weakmap@2.0.2: {} @@ -28383,11 +28278,6 @@ snapshots: lodash@4.18.1: {} - log-symbols@6.0.0: - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 @@ -29510,18 +29400,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@8.2.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.2.0 - os-paths@4.4.0: {} otplib@13.5.0: @@ -31101,8 +30979,6 @@ snapshots: std-env@4.3.0: {} - stdin-discarder@0.2.2: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -31654,33 +31530,6 @@ snapshots: - supports-color - tsx - tsup@8.5.1(jiti@2.7.0)(postcss@8.5.30)(supports-color@10.2.2)(tsx@4.23.15)(typescript@5.9.3): - dependencies: - bundle-require: 5.1.0(esbuild@0.28.2) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.3(supports-color@10.2.2) - esbuild: 0.28.2 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.30)(tsx@4.23.15) - resolve-from: 5.0.0 - rollup: 4.65.1 - source-map: 0.7.6 - sucrase: 3.35.1 - tinyexec: 0.3.2 - tinyglobby: 0.2.17 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.30 - typescript: 5.9.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - tsx@4.23.15: dependencies: esbuild: 0.28.2 @@ -31850,8 +31699,6 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.21.0: {} - undici-types@6.29.0: {} undici-types@7.24.6: {} @@ -32158,22 +32005,6 @@ snapshots: - supports-color - typescript - vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.7 - postcss: 8.5.30 - rolldown: 1.2.14 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 22.20.5 - esbuild: 0.28.2 - fsevents: 2.3.3 - jiti: 2.7.0 - terser: 5.51.2 - tsx: 4.23.15 - yaml: 2.8.4 - vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4): dependencies: lightningcss: 1.33.0 @@ -32270,36 +32101,6 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.12(@opentelemetry/api@1.9.1)(@types/node@22.20.5)(@vitest/coverage-v8@4.1.12)(jsdom@30.1.3(@noble/hashes@2.4.0))(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)): - dependencies: - '@vitest/expect': 4.1.12 - '@vitest/mocker': 4.1.12(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) - '@vitest/pretty-format': 4.1.12 - '@vitest/runner': 4.1.12 - '@vitest/snapshot': 4.1.12 - '@vitest/spy': 4.1.12 - '@vitest/utils': 4.1.12 - es-module-lexer: 2.3.2 - expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 3.0.0 - pathe: 2.0.3 - picomatch: 4.0.7 - std-env: 4.3.0 - tinybench: 2.9.0 - tinyexec: 1.3.1 - tinyglobby: 0.2.17 - tinyrainbow: 3.2.0 - vite: 8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.1 - '@types/node': 22.20.5 - '@vitest/coverage-v8': 4.1.12(vitest@4.1.12) - jsdom: 30.1.3(@noble/hashes@2.4.0) - transitivePeerDependencies: - - msw - vitest@4.1.12(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(@vitest/coverage-v8@4.1.12)(jsdom@30.1.3(@noble/hashes@2.4.0))(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)): dependencies: '@vitest/expect': 4.1.12 diff --git a/reasonix.toml b/reasonix.toml index a09424b8f3..c6bf89be1d 100644 --- a/reasonix.toml +++ b/reasonix.toml @@ -1,6 +1,2 @@ [permissions] -allow = [ - "Bash=pnpm run typecheck 2>&1 | head -50", - "Bash=NODE_OPTIONS='--max-old-space-size=8192' npx astro check 2>&1 | head -50", - "Bash=NODE_OPTIONS='--max-old-space-size=8192' npx astro check 2>&1 | tail -30", -] +allow = [] diff --git a/scripts/content/blog-web.js b/scripts/content/blog-web.js index 109e8756e6..5fe11ff9d1 100644 --- a/scripts/content/blog-web.js +++ b/scripts/content/blog-web.js @@ -11,7 +11,7 @@ import { fileURLToPath } from 'url' /* jshint esversion: 6, node: true */ // IMPORTANT: Import Sentry instrumentation first -import '../instrument.mjs' +import '../../config/instrument.mjs' // Get current directory const __filename = fileURLToPath(import.meta.url) diff --git a/scripts/utils/tag-manager.cjs b/scripts/utils/tag-manager.cjs index 060e53a092..ab657cb476 100644 --- a/scripts/utils/tag-manager.cjs +++ b/scripts/utils/tag-manager.cjs @@ -1,11 +1,11 @@ #!/usr/bin/env node -// Minimal tag-manager.cjs for rollback workflow (CommonJS) +// Minimal tag-manager.js for rollback workflow const { execFileSync } = require('child_process') const args = process.argv.slice(2) function usage() { console.log( - 'Usage: node tag-manager.cjs [--message="msg"] [--push]', + 'Usage: node tag-manager.js [--message="msg"] [--push]', ) process.exit(1) } @@ -24,7 +24,9 @@ function getTags(pattern) { const tags = execFileSync( 'git', ['tag', '-l', pattern, '--sort=-committerdate'], - { encoding: 'utf8' }, + { + encoding: 'utf8', + }, ) return tags.split('\n').filter(Boolean) } catch { @@ -58,7 +60,7 @@ if (command === 'create') { try { execFileSync('git', ['tag', '-a', tagName, '-m', message || 'Rollback tag']) if (push) { - const remote = process.env.GIT_PUSH_REMOTE ?? 'origin' + const remote = process.env.GIT_PUSH_REMOTE || 'origin' execFileSync('git', ['push', remote, tagName]) } console.log(`Created tag: ${tagName}`) diff --git a/scripts/utils/tag-manager.js b/scripts/utils/tag-manager.js deleted file mode 100644 index ab657cb476..0000000000 --- a/scripts/utils/tag-manager.js +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env node -// Minimal tag-manager.js for rollback workflow -const { execFileSync } = require('child_process') -const args = process.argv.slice(2) - -function usage() { - console.log( - 'Usage: node tag-manager.js [--message="msg"] [--push]', - ) - process.exit(1) -} - -if (args.length < 2) { - usage() -} -const command = args[0] -const env = args[1] -if (!['staging', 'production'].includes(env)) { - usage() -} - -function getTags(pattern) { - try { - const tags = execFileSync( - 'git', - ['tag', '-l', pattern, '--sort=-committerdate'], - { - encoding: 'utf8', - }, - ) - return tags.split('\n').filter(Boolean) - } catch { - return [] - } -} - -if (command === 'validate') { - const tags = getTags(`${env}-*`) - if (tags.length >= 2) { - process.exit(0) - } else { - process.exit(1) - } -} - -if (command === 'create') { - // Parse message and push - let message = '' - let push = false - for (let i = 2; i < args.length; i++) { - if (args[i].startsWith('--message=')) { - message = args[i].replace('--message=', '') - } - if (args[i] === '--push') { - push = true - } - } - const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14) - const tagName = `${env}-${timestamp}` - try { - execFileSync('git', ['tag', '-a', tagName, '-m', message || 'Rollback tag']) - if (push) { - const remote = process.env.GIT_PUSH_REMOTE || 'origin' - execFileSync('git', ['push', remote, tagName]) - } - console.log(`Created tag: ${tagName}`) - process.exit(0) - } catch (e) { - console.error('Failed to create tag:', e.message) - process.exit(1) - } -} - -usage() From fcaeb039e7f98db9c1b1395b66d74c8ee96ddcbf Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 31 Oct 2026 08:39:18 +0000 Subject: [PATCH 2/4] chore: restore pnpm-lock.yaml (no lockfile changes in this PR) --- pnpm-lock.yaml | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67c2b6aa46..31874ca5fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1769,6 +1769,43 @@ importers: specifier: ~5.7.3 version: 5.7.3 + foresight/cli: + dependencies: + '@clack/prompts': + specifier: ^0.7.0 + version: 0.7.0 + commander: + specifier: ^12.1.0 + version: 12.1.0 + ioredis: + specifier: ^5.4.1 + version: 5.11.1(supports-color@10.2.2) + ora: + specifier: ^8.1.1 + version: 8.2.0 + pg: + specifier: ^8.13.0 + version: 8.23.1 + picocolors: + specifier: ^1.1.0 + version: 1.1.1 + devDependencies: + '@types/node': + specifier: ^22.9.0 + version: 22.20.5 + '@types/pg': + specifier: ^8.11.10 + version: 8.23.1 + tsup: + specifier: ^8.3.5 + version: 8.5.1(jiti@2.7.0)(postcss@8.5.30)(supports-color@10.2.2)(tsx@4.23.15)(typescript@5.9.3) + typescript: + specifier: ^5.7.2 + version: 5.9.3 + vitest: + specifier: ^4.1.10 + version: 4.1.12(@opentelemetry/api@1.9.1)(@types/node@22.20.5)(@vitest/coverage-v8@4.1.12)(jsdom@30.1.3(@noble/hashes@2.4.0))(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) + packages/autoreview: dependencies: '@ai-sdk/anthropic': @@ -2867,10 +2904,18 @@ packages: resolution: {integrity: sha512-JrsQaiUg3rJIgIcqXteuhgccmbzlwyv9LSBlUokDeX6nFD0I3nrn+msLiI381NYKpu6V/l8GrNWF9Y73JeyMcw==} engines: {node: '>=20'} + '@clack/core@0.3.5': + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + '@clack/core@1.5.1': resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} engines: {node: '>= 20.12.0'} + '@clack/prompts@0.7.0': + resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} + bundledDependencies: + - is-unicode-supported + '@clack/prompts@1.8.1': resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} engines: {node: '>= 20.12.0'} @@ -7839,6 +7884,9 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@22.20.5': + resolution: {integrity: sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==} + '@types/node@24.19.2': resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} @@ -9469,6 +9517,10 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@5.2.0: resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} @@ -11690,6 +11742,10 @@ packages: resolution: {integrity: sha512-li88H4QGRoNMX27jEmY8nR515oJVspAgC/WFMlhHfFV8RJ4QyGpHhXnwAe9gH5RIgKmdYRUmrOhQobcgEjIdSw==} engines: {node: '>=18'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -11781,6 +11837,10 @@ packages: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} engines: {node: '>=0.10.0'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -12466,6 +12526,10 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} @@ -13310,6 +13374,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + os-paths@4.4.0: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} @@ -14656,6 +14724,10 @@ packages: std-env@4.3.0: resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -15298,6 +15370,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@6.29.0: resolution: {integrity: sha512-yzE4aF6qGj7fE8lu8fE8LonY07kmMXs20QR1bG3JGJ+jXrVTLtgUBieEr74AQRChYyqHrhJm9IktT337qOQhng==} @@ -17663,11 +17738,22 @@ snapshots: '@chat-adapter/catalog@4.42.0': {} + '@clack/core@0.3.5': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/core@1.5.1': dependencies: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 + '@clack/prompts@0.7.0': + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/prompts@1.8.1': dependencies: '@clack/core': 1.5.1 @@ -22964,6 +23050,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.20.5': + dependencies: + undici-types: 6.21.0 + '@types/node@24.19.2': dependencies: undici-types: 7.24.6 @@ -23761,6 +23851,15 @@ snapshots: msw: 3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) vite: 8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4) + '@vitest/mocker@4.1.12(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4))': + dependencies: + '@vitest/spy': 4.1.12 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) + vite: 8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4) + '@vitest/mocker@4.1.12(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4))': dependencies: '@vitest/spy': 4.1.12 @@ -24905,6 +25004,8 @@ snapshots: dependencies: restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 @@ -27262,6 +27363,8 @@ snapshots: global-directory: 4.0.1 is-path-inside: 4.0.0 + is-interactive@2.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -27335,6 +27438,8 @@ snapshots: dependencies: unc-path-regex: 0.1.2 + is-unicode-supported@1.3.0: {} + is-unicode-supported@2.1.0: {} is-weakmap@2.0.2: {} @@ -28278,6 +28383,11 @@ snapshots: lodash@4.18.1: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 @@ -29400,6 +29510,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.2.0 + os-paths@4.4.0: {} otplib@13.5.0: @@ -30979,6 +31101,8 @@ snapshots: std-env@4.3.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -31530,6 +31654,33 @@ snapshots: - supports-color - tsx + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.30)(supports-color@10.2.2)(tsx@4.23.15)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.28.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3(supports-color@10.2.2) + esbuild: 0.28.2 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.30)(tsx@4.23.15) + resolve-from: 5.0.0 + rollup: 4.65.1 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.30 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + tsx@4.23.15: dependencies: esbuild: 0.28.2 @@ -31699,6 +31850,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.21.0: {} + undici-types@6.29.0: {} undici-types@7.24.6: {} @@ -32005,6 +32158,22 @@ snapshots: - supports-color - typescript + vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.30 + rolldown: 1.2.14 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.20.5 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 2.7.0 + terser: 5.51.2 + tsx: 4.23.15 + yaml: 2.8.4 + vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4): dependencies: lightningcss: 1.33.0 @@ -32101,6 +32270,36 @@ snapshots: transitivePeerDependencies: - msw + vitest@4.1.12(@opentelemetry/api@1.9.1)(@types/node@22.20.5)(@vitest/coverage-v8@4.1.12)(jsdom@30.1.3(@noble/hashes@2.4.0))(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)): + dependencies: + '@vitest/expect': 4.1.12 + '@vitest/mocker': 4.1.12(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)) + '@vitest/pretty-format': 4.1.12 + '@vitest/runner': 4.1.12 + '@vitest/snapshot': 4.1.12 + '@vitest/spy': 4.1.12 + '@vitest/utils': 4.1.12 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 3.0.0 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.3.0 + tinybench: 2.9.0 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tinyrainbow: 3.2.0 + vite: 8.3.5(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@types/node': 22.20.5 + '@vitest/coverage-v8': 4.1.12(vitest@4.1.12) + jsdom: 30.1.3(@noble/hashes@2.4.0) + transitivePeerDependencies: + - msw + vitest@4.1.12(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(@vitest/coverage-v8@4.1.12)(jsdom@30.1.3(@noble/hashes@2.4.0))(msw@3.0.3(@types/node@26.6.5)(graphql@17.0.2)(supports-color@10.2.2)(typescript@5.8.3)(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)))(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4)): dependencies: '@vitest/expect': 4.1.12 From b801b47e59294a7d86d652a9a4e675eac83d8f3d Mon Sep 17 00:00:00 2001 From: dagger Date: Sun, 1 Nov 2026 22:41:29 +0000 Subject: [PATCH 3/4] fix(deps): remove @astrojs/check after dropping typecheck scripts --- package.json | 1 - pnpm-lock.yaml | 21 --------------------- 2 files changed, 22 deletions(-) diff --git a/package.json b/package.json index a3e9e56848..82662ed18f 100644 --- a/package.json +++ b/package.json @@ -386,7 +386,6 @@ "@ai-sdk/mcp": "^2.0.29", "@ai-sdk/provider": "^4.0.8", "@ai-sdk/sandbox-vercel": "^1.0.87", - "@astrojs/check": "^0.9.10", "@astrojs/markdoc": "^2.1.1", "@astrojs/node": "^11.1.4", "@astrojs/react": "^7.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31874ca5fc..5e247978d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -790,9 +790,6 @@ importers: '@ai-sdk/sandbox-vercel': specifier: ^1.0.87 version: 1.0.153(ws@8.22.0(utf-8-validate@6.0.6))(zod@4.6.7) - '@astrojs/check': - specifier: ^0.9.10 - version: 0.9.10(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.1(prettier@3.9.10))(prettier@3.9.10)(typescript@5.8.3) '@astrojs/markdoc': specifier: ^2.1.1 version: 2.1.1(@types/react@19.3.0)(astro@7.4.2(patch_hash=74950e75e5c1b6b481917ab76bdc51751e1359ee6e6c5618fa69037bad96d2a5)(@azure/storage-blob@12.34.0(supports-color@10.2.2))(@types/node@26.6.5)(@upstash/redis@1.40.0)(@vercel/functions@3.10.1(@aws-sdk/credential-provider-web-identity@3.972.80)(ws@8.22.0(utf-8-validate@6.0.6)))(crossws@0.4.15(srvx@1.0.5))(db0@0.4.1)(esbuild@0.28.2)(ioredis@5.11.1(supports-color@10.2.2))(jiti@2.7.0)(ocache@0.3.0)(terser@5.51.2)(tsx@4.23.15)(yaml@2.8.4))(react@19.3.1) @@ -2090,12 +2087,6 @@ packages: resolution: {integrity: sha512-GMDC7Eo0myBUA/QLBl0u+OcegJ8LiBhccmNZR34KmprQNP8gQUJlWlOOZWUsxNA2rNS6GuPYcGDyLoPnjmn4/Q==} engines: {node: ^20.19.0 || >=22.12.0} - '@astrojs/check@0.9.10': - resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==} - hasBin: true - peerDependencies: - typescript: ^5.0.0 || ^6.0.0 - '@astrojs/compiler-binding-android-arm64@0.5.2': resolution: {integrity: sha512-kckIxon6Rm/Bxzh9mGPYpRRqUbToUQoHptCmpMmE+Yt0Xumq8CqrKUidyYhrBsrHVO7bxuRzzWUUqvpf+iYceQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -16466,18 +16457,6 @@ snapshots: transitivePeerDependencies: - '@emnapi/runtime' - '@astrojs/check@0.9.10(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.1(prettier@3.9.10))(prettier@3.9.10)(typescript@5.8.3)': - dependencies: - '@astrojs/language-server': 2.17.2(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.1(prettier@3.9.10))(prettier@3.9.10)(typescript@5.8.3) - chokidar: 4.0.3 - kleur: 4.1.5 - typescript: 5.8.3 - yargs: 18.2.0 - transitivePeerDependencies: - - '@emnapi/runtime' - - prettier - - prettier-plugin-astro - '@astrojs/compiler-binding-android-arm64@0.5.2': optional: true From aca72bfcd1680c8bbf8fd04dd2d9ee598abef5be Mon Sep 17 00:00:00 2001 From: dagger Date: Sun, 1 Nov 2026 22:45:03 +0000 Subject: [PATCH 4/4] fix: address review threads (readiness lint lane, localhost binding, tag list/cleanup) --- scripts/content/blog-web.js | 2 +- scripts/devops/aggregate-readiness.py | 8 +++--- scripts/testing/run-final-tests.sh | 8 +++--- scripts/utils/tag-manager.cjs | 35 ++++++++++++++++++++++++--- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/scripts/content/blog-web.js b/scripts/content/blog-web.js index 5fe11ff9d1..3564405105 100644 --- a/scripts/content/blog-web.js +++ b/scripts/content/blog-web.js @@ -439,7 +439,7 @@ const server = http.createServer((req, res) => { // Start server const PORT = process.env.PORT || 3333 -server.listen(PORT, () => { +server.listen(PORT, '127.0.0.1', () => { const url = `http://localhost:${PORT}` console.log(`Blog management interface running at ${url}`) diff --git a/scripts/devops/aggregate-readiness.py b/scripts/devops/aggregate-readiness.py index 9e0c1cf720..f04699e550 100644 --- a/scripts/devops/aggregate-readiness.py +++ b/scripts/devops/aggregate-readiness.py @@ -201,17 +201,17 @@ def run_lint(dry_run: bool, cwd: str) -> LaneResult: def run_typecheck(dry_run: bool, cwd: str) -> LaneResult: - """Run the project's type checker (tsc + astro check).""" + """Run the type-aware lint gate (oxlint) — replaces the removed tsc/astro check.""" if dry_run: - logger.info(" ▌ [dry-run] Typecheck (astro check + tsc)") + logger.info(" ▌ [dry-run] Type-aware lint (oxlint)") return { - "command": "pnpm typecheck", + "command": "pnpm lint", "status": "pass", "exitCode": 0, "stdout": "", "stderr": "", } - return run_command(["pnpm", "typecheck"], timeout=600, cwd=cwd, max_retries=2) + return run_command(["pnpm", "lint"], timeout=600, cwd=cwd, max_retries=2) def run_tests(dry_run: bool, cwd: str) -> LaneResult: diff --git a/scripts/testing/run-final-tests.sh b/scripts/testing/run-final-tests.sh index ae1eb59616..eb8d03f46d 100755 --- a/scripts/testing/run-final-tests.sh +++ b/scripts/testing/run-final-tests.sh @@ -71,13 +71,13 @@ else exit 1 fi -# Run type checking -npm run typecheck +# Run type-aware lint (oxlint) — typecheck scripts were removed per AGENTS.md +pnpm lint if [ $? -eq 0 ]; then - echo -e "${GREEN}✅ Type checking passed!${NC}" + echo -e "${GREEN}✅ Type-aware lint passed!${NC}" else - echo -e "${RED}❌ Type checking failed!${NC}" + echo -e "${RED}❌ Type-aware lint failed!${NC}" exit 1 fi diff --git a/scripts/utils/tag-manager.cjs b/scripts/utils/tag-manager.cjs index ab657cb476..b3eff9e28b 100644 --- a/scripts/utils/tag-manager.cjs +++ b/scripts/utils/tag-manager.cjs @@ -5,7 +5,7 @@ const args = process.argv.slice(2) function usage() { console.log( - 'Usage: node tag-manager.js [--message="msg"] [--push]', + 'Usage: node tag-manager.js [--message="msg"] [--push]', ) process.exit(1) } @@ -43,6 +43,30 @@ if (command === 'validate') { } } +if (command === 'list') { + const tags = getTags(`${env}-*`) + for (const t of tags) { + console.log(t) + } + process.exit(0) +} + +if (command === 'cleanup') { + const tags = getTags(`${env}-*`) + // Keep the 2 most recent tags (rollback needs a pair); delete the rest + const stale = tags.slice(2) + for (const t of stale) { + try { + execFileSync('git', ['tag', '-d', t]) + console.log(`Deleted tag: ${t}`) + } catch (e) { + console.error(`Failed to delete tag ${t}: ${e.message}`) + } + } + console.log(`Cleanup complete: deleted ${stale.length}, kept ${Math.min(tags.length, 2)}`) + process.exit(0) +} + if (command === 'create') { // Parse message and push let message = '' @@ -55,8 +79,13 @@ if (command === 'create') { push = true } } - const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14) - const tagName = `${env}-${timestamp}` + // Millisecond precision + uniqueness loop: same-second creates must not collide + let tagName = `${env}-${new Date().toISOString().replace(/[-:T]/g, '').slice(0, 17)}` + const existing = getTags(`${env}-*`) + let suffix = 1 + while (existing.includes(tagName)) { + tagName = `${env}-${new Date().toISOString().replace(/[-:T]/g, '').slice(0, 17)}-${suffix++}` + } try { execFileSync('git', ['tag', '-a', tagName, '-m', message || 'Rollback tag']) if (push) {