diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index ef315b4..9a4119b 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x, 22.x] + node-version: [20.x, 22.x, 24.x] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 09013b0..045ce11 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,7 @@ jobs: # (OIDC). We intentionally don't run `npm install -g npm@latest` — the # npm bundled with some Node 22.x patch releases has a broken # node_modules (missing `promise-retry`) that makes self-upgrade fail. - # ci.yml still runs the test matrix against 18/20/22 for runtime compat. + # ci.yml still runs the test matrix against 20/22/24 for runtime compat. - name: Setup Node.js uses: actions/setup-node@v4 with: diff --git a/AGENTS.md b/AGENTS.md index eaab749..a0c6d84 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,7 +6,7 @@ Guidance for AI coding assistants working **on** this repo. For guidance on how - **Name:** `@coreplane/polylane` on npm — binary still invoked as `polylane` - **Type:** Node.js CLI tool (ESM, bundled with esbuild) -- **Engine:** Node.js 18+ (ships as a single bundled file; dev tooling needs a recent Node) +- **Engine:** Node.js 20+ (ships as a single bundled file; dev tooling needs a recent Node) - **Language:** TypeScript, strict mode - Runtime deps are intentionally minimal — check `package.json` before adding a new one. diff --git a/README.md b/README.md index cdabadf..2601a55 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # polylane

Agent-focused CLI for the Polylane platform.
-Investigate incidents, explore cloud infrastructure, search code, run automations, and drive threads — from any agent or terminal.

+Investigate production issues, explore cloud infrastructure, search code, run automations, and drive threads — from any agent or terminal.

📚 Docs: docs.polylane.com · Getting started · llms.txt (agent index)

npm version License: MIT - Node.js >= 18 + Node.js >= 20

## What this is @@ -16,7 +16,7 @@ Investigate incidents, explore cloud infrastructure, search code, run automation `polylane` is designed to be driven by AI agents. Top-level commands map to the tasks an agent actually performs: - **Triage** issues — anomalies and alerts detected across your cloud and observability stack -- **Drive** incidents — record timeline notes and milestones as you respond +- **Drive** issue timelines — record notes and milestones as you respond - **Explore** cloud infrastructure — logs, metrics, dependency graphs - **Search** code - **Run** the platform's agent tools directly (`tools search` / `tools run` / `tools code`) @@ -29,7 +29,7 @@ The full API surface is available behind `polylane api call ` as an escape h ## Install -Pick whichever channel fits your system. All install the same Node-based bundle and require Node 18+ (Homebrew pulls Node in as a dependency; the curl + PowerShell installers check for it). +Pick whichever channel fits your system. All install the same Node-based bundle and require Node 20+ (Homebrew pulls Node in as a dependency; the curl + PowerShell installers check for it). ```bash # macOS / Linux — curl @@ -39,7 +39,7 @@ curl -fsSL https://polylane.com/install.sh | bash irm https://polylane.com/install.ps1 | iex # Homebrew (tap: coreplanelabs/polylane) -brew install coreplanelabs/polylane +brew install coreplanelabs/polylane/polylane # npm npm install -g @coreplane/polylane @@ -48,7 +48,7 @@ npm install -g @coreplane/polylane bun add -g @coreplane/polylane ``` -> Requires [Node.js](https://nodejs.org) 18+ at runtime. +> Requires [Node.js](https://nodejs.org) 20+ at runtime. Version-pin the curl / PowerShell installers with: @@ -61,8 +61,9 @@ $env:POLYLANE_VERSION='v0.1.0'; irm https://polylane.com/install.ps1 | iex ```bash # 1. Authenticate (pick one) -polylane auth login # OAuth browser (humans at a terminal) -polylane auth login --api-key sk_xxxxx # API key (CI / agents) +polylane auth login # OAuth browser (the default) +polylane auth login --no-browser # OAuth device code (SSH / headless) +polylane auth login --api-key sk_xxxxx # API key (CI / scripts where OAuth is impossible) polylane auth signup --email agent@example.com # bootstrap a fresh account # (returns a session token; create an # API key after step 2 for long-lived use) @@ -78,8 +79,8 @@ polylane cloud connect --provider # see `polylane cloud connect # 4. Work polylane issue list --active # what the system is flagging -polylane thread list --type incident # incident threads -polylane incident note "rolled back deploy" +polylane thread list --type investigation # investigation threads +polylane issue note "rolled back deploy" polylane service logs --since 1h --grep error polylane tools run findNodes --params '{"query":"api"}' polylane thread ask "" --stream @@ -167,11 +168,13 @@ Manage with `polylane config show` and `polylane config set --key --value ## Authentication +OAuth is the default way to connect — including for agents. Use an API key only where a browser sign-in is impossible. + | Command | When | |---|---| -| `polylane auth login --api-key sk_...` | Scripts / CI / machines | -| `polylane auth login` | Interactive OAuth (browser, PKCE) | +| `polylane auth login` | Interactive OAuth (browser, PKCE) — the default | | `polylane auth login --no-browser` | OAuth device code (SSH / headless) | +| `polylane auth login --api-key sk_...` | Scripts / CI / machines that cannot complete OAuth | | `polylane auth signup --email … --password …` | Bootstrap a fresh account from an agent (no browser, no human) | OAuth credentials live at `~/.polylane/credentials.json` (mode `0600`) and auto-refresh before expiry. `polylane auth status` reports the active source. diff --git a/install/install.ps1 b/install/install.ps1 index 30ffa81..0c6cebc 100644 --- a/install/install.ps1 +++ b/install/install.ps1 @@ -3,7 +3,7 @@ # irm https://polylane.com/install.ps1 | iex # # Installs the bundled CLI to $env:USERPROFILE\.polylane\bin\ and (if needed) -# prints the line to add to your PATH. Node 18+ must be installed. +# prints the line to add to your PATH. Node 20+ must be installed. # Override the version or install prefix with env vars: # # $env:POLYLANE_VERSION='v0.1.0'; irm https://polylane.com/install.ps1 | iex @@ -28,12 +28,12 @@ function Ok([string]$msg) { Write-Host "✓ $msg" -ForegroundColor Green } $node = Get-Command node -ErrorAction SilentlyContinue if (-not $node) { - Die "Node.js 18+ is required but 'node' was not found.`nInstall from https://nodejs.org, then re-run." + Die "Node.js 20+ is required but 'node' was not found.`nInstall from https://nodejs.org, then re-run." } $nodeVersion = (& node -v) -replace '^v', '' $nodeMajor = [int]($nodeVersion.Split('.')[0]) -if ($nodeMajor -lt 18) { - Die "Node.js 18+ is required (found v$nodeVersion)." +if ($nodeMajor -lt 20) { + Die "Node.js 20+ is required (found v$nodeVersion)." } # --- resolve download URL --------------------------------------------------- diff --git a/install/install.sh b/install/install.sh index c223ac5..5d155c3 100644 --- a/install/install.sh +++ b/install/install.sh @@ -4,7 +4,7 @@ # curl -fsSL https://polylane.com/install.sh | bash # # Installs the bundled CLI to ~/.polylane/bin/polylane and (if needed) prints the -# line to add to your shell RC to put it on $PATH. Node 18+ must be installed. +# line to add to your shell RC to put it on $PATH. Node 20+ must be installed. # Override the version or install prefix with env vars: # # POLYLANE_VERSION=v0.1.0 curl -fsSL https://polylane.com/install.sh | bash @@ -36,13 +36,13 @@ require_cmd curl require_cmd uname if ! command -v node >/dev/null 2>&1; then - die "Node.js 18+ is required but 'node' was not found. + die "Node.js 20+ is required but 'node' was not found. Install from https://nodejs.org or with your package manager, then re-run." fi NODE_MAJOR="$(node -e 'process.stdout.write(String(process.versions.node.split(".")[0]))')" -if [ "$NODE_MAJOR" -lt 18 ]; then - die "Node.js 18+ is required (found $(node -v))." +if [ "$NODE_MAJOR" -lt 20 ]; then + die "Node.js 20+ is required (found $(node -v))." fi # --- resolve download URL --------------------------------------------------- diff --git a/package-lock.json b/package-lock.json index 9da4300..ba7622f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,22 +10,22 @@ "license": "MIT", "dependencies": { "@clack/prompts": "^0.7.0", - "ws": "^8.20.0" + "ws": "^8.21.1" }, "bin": { - "nominal": "dist/nominal.mjs" + "polylane": "dist/polylane.mjs" }, "devDependencies": { "@types/node": "^22.0.0", "@types/ws": "^8.18.1", - "esbuild": "^0.24.0", + "esbuild": "^0.25.0", "eslint": "^9.0.0", - "tsx": "^4.0.0", + "tsx": "^4.23.1", "typescript": "^5.8.0", "typescript-eslint": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/@clack/core": { @@ -65,9 +65,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -82,9 +82,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -99,9 +99,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -116,9 +116,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -133,9 +133,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -150,9 +150,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -167,9 +167,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -184,9 +184,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -201,9 +201,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -218,9 +218,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -235,9 +235,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -252,9 +252,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -269,9 +269,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -286,9 +286,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -303,9 +303,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -320,9 +320,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -337,9 +337,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -354,9 +354,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -371,9 +371,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -388,9 +388,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -405,9 +405,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -422,9 +422,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -439,9 +439,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -456,9 +456,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -473,9 +473,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -490,9 +490,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -935,16 +935,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { @@ -1089,9 +1089,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1194,9 +1194,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1207,31 +1207,49 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/escape-string-regexp": { @@ -1506,19 +1524,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.13.7", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", - "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1623,10 +1628,20 @@ "license": "ISC" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -1862,16 +1877,6 @@ "node": ">=4" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -1971,14 +1976,13 @@ } }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" @@ -1991,9 +1995,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -2008,9 +2012,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -2025,9 +2029,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -2042,9 +2046,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -2059,9 +2063,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -2076,9 +2080,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -2093,9 +2097,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -2110,9 +2114,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -2127,9 +2131,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -2144,9 +2148,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -2161,9 +2165,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -2178,9 +2182,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -2195,9 +2199,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -2212,9 +2216,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -2229,9 +2233,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -2246,9 +2250,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -2263,9 +2267,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -2280,9 +2284,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -2297,9 +2301,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -2314,9 +2318,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -2331,9 +2335,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -2348,9 +2352,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -2365,9 +2369,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -2382,9 +2386,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -2399,9 +2403,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -2416,9 +2420,9 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2429,32 +2433,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/type-check": { @@ -2552,9 +2556,9 @@ } }, "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index d905831..eb1f5fd 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "dist/polylane.mjs" ], "engines": { - "node": ">=18" + "node": ">=20" }, "scripts": { "dev": "node --env-file-if-exists=.env.local --import tsx src/main.ts", @@ -44,14 +44,14 @@ }, "dependencies": { "@clack/prompts": "^0.7.0", - "ws": "^8.20.0" + "ws": "^8.21.1" }, "devDependencies": { "@types/node": "^22.0.0", "@types/ws": "^8.18.1", - "esbuild": "^0.24.0", + "esbuild": "^0.25.0", "eslint": "^9.0.0", - "tsx": "^4.0.0", + "tsx": "^4.23.1", "typescript": "^5.8.0", "typescript-eslint": "^8.0.0" } diff --git a/skill/SKILL.md b/skill/SKILL.md index d23f33e..7f8fd8d 100644 --- a/skill/SKILL.md +++ b/skill/SKILL.md @@ -1,6 +1,6 @@ --- name: polylane-cli -description: Use `polylane` to investigate incidents, explore cloud infrastructure (logs / metrics / dependency graphs), search code, save memories, run automations from a catalog, connect observability tools and cloud accounts, and drive threads with the Polylane agent. Use when the user wants to debug a production issue, look up a service, search their codebase, manage integrations, connect a cloud provider, or talk to the Polylane agent from the terminal. +description: Use `polylane` to investigate production issues, explore cloud infrastructure (logs / metrics / dependency graphs), search code, save memories, run automations from a catalog, connect observability tools and cloud accounts, and drive threads with the Polylane agent. Use when the user wants to debug a production issue, look up a service, search their codebase, manage integrations, connect a cloud provider, or talk to the Polylane agent from the terminal. --- # Polylane CLI — Agent Skill Guide @@ -19,12 +19,12 @@ description: Use `polylane` to investigate incidents, explore cloud infrastructu # Install (pick one — see README for the full list) npm install -g @coreplane/polylane # curl -fsSL https://polylane.com/install.sh | bash -# brew install coreplanelabs/polylane +# brew install coreplanelabs/polylane/polylane -# Pick ONE auth path: -polylane auth login --api-key sk_xxxxx # API key — scripts / CI -polylane auth login # OAuth browser (PKCE) +# Pick ONE auth path (OAuth is the default; use an API key only where a browser sign-in is impossible): +polylane auth login # OAuth browser (PKCE) — the default polylane auth login --no-browser # OAuth device code (SSH / headless) +polylane auth login --api-key sk_xxxxx # API key — scripts / CI without OAuth polylane auth signup --email --password # bootstrap an account from an agent # Verify @@ -149,16 +149,16 @@ polylane automation list `integration connect` and `cloud connect` dispatch on `--type` / `--provider`. Some options open a browser for an install URL; others take API credentials directly. Use `--help` on each to see the required flags and optional `--no-browser`. -### Investigating an incident +### Investigating an issue ```bash polylane issue list --active # what's currently flagged -polylane issue show # full body + linked incident -polylane thread list --type incident # active incident threads -polylane thread show # the incident thread with Console / Next footer -polylane incident timeline # who did what, when -polylane incident note "rolled back deploy ABC" -polylane incident milestone "Mitigated" +polylane issue show # full body + linked investigation +polylane thread list --type investigation # active investigation threads +polylane thread show # the investigation thread with Console / Next footer +polylane issue timeline # who did what, when +polylane issue note "rolled back deploy ABC" +polylane issue milestone "Mitigated" # Drill into services polylane service find "" @@ -216,7 +216,7 @@ Attach resources as context by passing their IDs — the CLI infers the resource An automation is **trigger → instructions → tools → actions**: a typed event fires, an agent runs with your instructions and a set of skills (tools), and optional actions apply side-effects (open an -incident, roll back a deploy, open a PR) — each gated by a `mode` (`smart` = act only when warranted, +issue, roll back a deploy, open a PR) — each gated by a `mode` (`smart` = act only when warranted, `always`). Full schema and every trigger/action type: . ```bash @@ -242,9 +242,9 @@ template covers. `automation create` is a first-class command; you do **not** ne polylane automation create \ --name "Triage Datadog alerts" \ --trigger '{"type":"alert","filters":{"sources":["datadog"]}}' \ - --instructions "Correlate the alert with recent deploys and open an incident with the findings." \ + --instructions "Correlate the alert with recent deploys and open an issue with the findings." \ --tool investigate-errors --tool investigate-latency \ - --action '{"type":"openIncident","mode":"smart","defaultSeverity":"high"}' \ + --action '{"type":"openIssue","mode":"smart","defaultSeverity":"high"}' \ --delay 600000 # wait 10m (e.g. let a deploy settle) before the run # Or pass a full JSON body (--body-file '-' reads stdin); flags layer on top. @@ -258,9 +258,10 @@ polylane automation create --body-file template.json \ Run `polylane automation create --help` for every flag. Common trigger types: `alert`, `cron` (`{"type":"cron","expression":"0 9 * * *"}`), `webhook`, `github.*` (push/pull_request/deployment/…), -`{cloudflare,vercel,render,fly}.deployment`, `slack.message`, `polylane.*` (cloud_account.synced, -codebase.synced, …). Actions include `openIncident`, `rollback{Cloudflare,Vercel,Render,Fly}Deployment`, -`submitPr`, `commentPr`, `mergePr`, `createIssue`, `autofix`, `handoffTo{Devin,Cursor}`. The +`{cloudflare,vercel,render,fly}.deployment`, `slack.message`, `polylane.*` (issue.triaged, +cloud_account.synced, codebase.synced, …). Actions include `openIssue`, +`rollback{Cloudflare,Vercel,Render,Fly}Deployment`, `submitPr`, `commentPr`, `mergePr`, +`commentGithubIssue`, `createGithubIssue`, `autofix`, `handoffTo{Devin,Cursor,Factory}`. The authoritative, always-current list of types and filters is in the docs and in `polylane api describe automations.post`. diff --git a/src/commands/autofix/list.ts b/src/commands/autofix/list.ts index ae29fcf..79919c0 100644 --- a/src/commands/autofix/list.ts +++ b/src/commands/autofix/list.ts @@ -13,7 +13,7 @@ export const autofixListCommand: Command = { operationId: 'autofixes.list', options: [ { flag: '--status ', description: 'Filter by status (started, branch_pushed, pr_opened, merged, failed, no_fix_needed)', type: 'string' }, - { flag: '--origin ', description: 'Filter by origin (automation, chat, incident)', type: 'string' }, + { flag: '--origin ', description: 'Filter by origin (automation, chat, investigation, system)', type: 'string' }, { flag: '--repo ', description: 'Filter by repo name', type: 'string' }, { flag: '--limit ', description: 'Max items (default 20)', type: 'number' }, { flag: '--full', description: 'Return full objects', type: 'boolean' }, @@ -21,7 +21,7 @@ export const autofixListCommand: Command = { examples: [ 'polylane autofix list', 'polylane autofix list --status pr_opened', - 'polylane autofix list --origin incident --repo my-service', + 'polylane autofix list --origin investigation --repo my-service', ], async execute(config: Config, _flags, args: Record): Promise { const workspaceId = await requireWorkspace(config); diff --git a/src/commands/automation/create.ts b/src/commands/automation/create.ts index 8fbb9c0..4fda052 100644 --- a/src/commands/automation/create.ts +++ b/src/commands/automation/create.ts @@ -74,7 +74,7 @@ export const automationCreateCommand: Command = { { flag: '--name ', description: 'Automation name', type: 'string' }, { flag: '--instructions ', description: 'Agent instructions (the system prompt for the run)', type: 'string' }, { flag: '--trigger ', description: 'Trigger as JSON, or a bare type for filterless triggers (repeatable). e.g. \'{"type":"alert","filters":{"sources":["datadog"]}}\' or webhook', type: 'array' }, - { flag: '--action ', description: 'Action as JSON, or a bare type (repeatable). e.g. \'{"type":"openIncident","mode":"smart"}\'', type: 'array' }, + { flag: '--action ', description: 'Action as JSON, or a bare type (repeatable). e.g. \'{"type":"openIssue","mode":"smart"}\'', type: 'array' }, { flag: '--destination ', description: 'Notification destination as JSON (repeatable). e.g. \'{"type":"slack","name":"ops","channelId":"C123"}\'', type: 'array' }, { flag: '--tool ', description: 'Skill slug to attach as a tool (repeatable). Alias: --skill', type: 'array' }, { flag: '--skill ', description: 'Alias for --tool', type: 'array' }, @@ -85,7 +85,7 @@ export const automationCreateCommand: Command = { { flag: '--body-file ', description: 'Full automation body from a file ("-" for stdin); flags layer on top', type: 'string' }, ], examples: [ - 'polylane automation create --name "Triage Datadog alerts" --trigger \'{"type":"alert","filters":{"sources":["datadog"]}}\' --instructions "Correlate the alert with recent deploys and open an incident with findings." --action \'{"type":"openIncident","mode":"smart"}\' --tool investigate-errors', + 'polylane automation create --name "Triage Datadog alerts" --trigger \'{"type":"alert","filters":{"sources":["datadog"]}}\' --instructions "Correlate the alert with recent deploys and open an issue with findings." --action \'{"type":"openIssue","mode":"smart"}\' --tool investigate-errors', 'polylane automation catalog --output json | jq \'...\' # crib a template body, then:', 'polylane automation create --body-file my-automation.json', 'polylane automation create --body-file template.json --trigger \'{"type":"cloudflare.deployment","filters":{"environments":["production"]}}\' # take a template body, narrow the trigger', diff --git a/src/commands/feed/list.ts b/src/commands/feed/list.ts index 8f2e684..c46dcff 100644 --- a/src/commands/feed/list.ts +++ b/src/commands/feed/list.ts @@ -19,13 +19,13 @@ const VALID_CATEGORIES = [ 'autofix', 'automation', 'anomaly', - 'incident', 'deploy', 'change', 'release', 'alert', 'issue', 'digest', + 'tier', ] as const; type Category = (typeof VALID_CATEGORIES)[number]; @@ -45,7 +45,7 @@ const FIELDS = [ export const feedListCommand: Command = { name: 'feed list', - description: 'Workspace agent activity feed (chat, investigations, autofixes, incidents, deploys…)', + description: 'Workspace agent activity feed (chat, investigations, autofixes, issues, deploys…)', operationId: 'feed.list', options: [ { flag: '--category ', description: VALID_CATEGORIES.join(' | '), type: 'string' }, @@ -59,7 +59,7 @@ export const feedListCommand: Command = { examples: [ 'polylane feed list', 'polylane feed list --since 24h', - 'polylane feed list --category incident --limit 50', + 'polylane feed list --category issue --limit 50', 'polylane feed list --cursor ', ], async execute(config: Config, _flags, args: Record): Promise { diff --git a/src/commands/incident/index.ts b/src/commands/incident/index.ts deleted file mode 100644 index acf0b90..0000000 --- a/src/commands/incident/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { incidentTimelineCommand } from './timeline'; -import { incidentNoteCommand } from './note'; -import { incidentMilestoneCommand } from './milestone'; - -export const incidentCommands = [ - incidentTimelineCommand, - incidentNoteCommand, - incidentMilestoneCommand, -]; diff --git a/src/commands/index.ts b/src/commands/index.ts index db3cecc..2ba80dc 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -5,7 +5,6 @@ import { helpCommand } from './help'; import { updateCommand } from './update'; import { feedCommands } from './feed'; import { issueCommands } from './issue'; -import { incidentCommands } from './incident'; import { serviceCommands } from './service'; import { repoCommands } from './repo'; import { memoryCommands } from './memory'; @@ -31,7 +30,6 @@ export function registerAllCommands(): void { const all = [ ...feedCommands, ...issueCommands, - ...incidentCommands, ...serviceCommands, ...repoCommands, ...memoryCommands, diff --git a/src/commands/issue/index.ts b/src/commands/issue/index.ts index 9880ae4..d089452 100644 --- a/src/commands/issue/index.ts +++ b/src/commands/issue/index.ts @@ -1,4 +1,13 @@ import { issueListCommand } from './list'; import { issueShowCommand } from './show'; +import { issueTimelineCommand } from './timeline'; +import { issueNoteCommand } from './note'; +import { issueMilestoneCommand } from './milestone'; -export const issueCommands = [issueListCommand, issueShowCommand]; +export const issueCommands = [ + issueListCommand, + issueShowCommand, + issueTimelineCommand, + issueNoteCommand, + issueMilestoneCommand, +]; diff --git a/src/commands/issue/list.ts b/src/commands/issue/list.ts index 607568b..e03db20 100644 --- a/src/commands/issue/list.ts +++ b/src/commands/issue/list.ts @@ -7,10 +7,10 @@ import { requireWorkspace, getArgString, getArgNumber, getArgBoolean } from '../ import { CLIError } from '../../errors/base'; import { ExitCode } from '../../errors/codes'; -const FIELDS = ['id', 'severity', 'status', 'title', 'resourceKind', 'resourceId', 'detectedAt', 'incidentThreadId']; +const FIELDS = ['id', 'severity', 'status', 'title', 'resourceKind', 'resourceId', 'detectedAt', 'investigationThreadId']; const VALID_SEVERITIES = ['critical', 'high', 'medium', 'low', 'info'] as const; type Severity = (typeof VALID_SEVERITIES)[number]; -const VALID_STATUSES = ['new', 'triaging', 'incident', 'no_incident', 'failed', 'triage_skipped'] as const; +const VALID_STATUSES = ['new', 'triaging', 'confirmed', 'dismissed', 'failed', 'skipped'] as const; type Status = (typeof VALID_STATUSES)[number]; export const issueListCommand: Command = { @@ -33,7 +33,7 @@ export const issueListCommand: Command = { examples: [ 'polylane issue list', 'polylane issue list --active --severity critical', - 'polylane issue list --status incident', + 'polylane issue list --status confirmed', 'polylane issue list --provider aws --account 123456789012', ], async execute(config: Config, _flags, args: Record): Promise { @@ -84,7 +84,7 @@ export const issueListCommand: Command = { count: result.count, }, { - headers: ['ID', 'Severity', 'Status', 'Title', 'Kind', 'Resource', 'Detected', 'Incident'], + headers: ['ID', 'Severity', 'Status', 'Title', 'Kind', 'Resource', 'Detected', 'Investigation'], rows: (item) => [ String(item.id ?? ''), String(item.severity ?? ''), @@ -93,7 +93,7 @@ export const issueListCommand: Command = { String(item.resourceKind ?? ''), truncate(String(item.resourceId ?? ''), 40), String(item.detectedAt ?? ''), - String(item.incidentThreadId ?? ''), + String(item.investigationThreadId ?? ''), ], } ); diff --git a/src/commands/incident/milestone.ts b/src/commands/issue/milestone.ts similarity index 66% rename from src/commands/incident/milestone.ts rename to src/commands/issue/milestone.ts index d9e2320..de91ee6 100644 --- a/src/commands/incident/milestone.ts +++ b/src/commands/issue/milestone.ts @@ -6,39 +6,39 @@ import { requireWorkspace, requirePositional, getAllPositional, getArgString } f import { CLIError } from '../../errors/base'; import { ExitCode } from '../../errors/codes'; -export const incidentMilestoneCommand: Command = { - name: 'incident milestone', - description: 'Append a milestone event to an incident timeline', - operationId: 'incidents.timeline.create', +export const issueMilestoneCommand: Command = { + name: 'issue milestone', + description: 'Append a milestone event to an issue timeline', + operationId: 'issues.timeline.create', positional: [ - { name: 'thread-id', description: 'Incident thread ID (thrd_…)' }, + { name: 'issue-id', description: 'Issue ID (iss_…)' }, { name: 'title', description: 'Short milestone title (e.g. "Mitigated")', variadic: true }, ], options: [ { flag: '--body ', description: 'Optional markdown body', type: 'string' }, ], examples: [ - 'polylane incident milestone thrd_xxx "Mitigated"', - 'polylane incident milestone thrd_xxx "Resolved" --body "Root cause fixed in PR #123"', + 'polylane issue milestone iss_xxx "Mitigated"', + 'polylane issue milestone iss_xxx "Resolved" --body "Root cause fixed in PR #123"', ], async execute(config: Config, _flags, args: Record): Promise { const workspaceId = await requireWorkspace(config); - const threadId = requirePositional(args, 0, 'thread-id'); + const issueId = requirePositional(args, 0, 'issue-id'); const titleParts = getAllPositional(args).slice(1); if (titleParts.length === 0) { throw new CLIError( 'Missing ', ExitCode.USAGE, - 'polylane incident milestone <thread-id> "<title>"' + 'polylane issue milestone <issue-id> "<title>"' ); } const title = titleParts.join(' '); const body = getArgString(args, 'body'); const api = new PolylaneAPI(config); - const result = await api.incidentsTimelineCreate({ + const result = await api.issuesTimelineCreate({ workspaceId, - incidentThreadId: threadId, + issueId, type: 'milestone', title, ...(body ? { body } : {}), diff --git a/src/commands/incident/note.ts b/src/commands/issue/note.ts similarity index 65% rename from src/commands/incident/note.ts rename to src/commands/issue/note.ts index 73d8307..13aaf2b 100644 --- a/src/commands/incident/note.ts +++ b/src/commands/issue/note.ts @@ -6,39 +6,39 @@ import { requireWorkspace, requirePositional, getAllPositional, getArgString } f import { CLIError } from '../../errors/base'; import { ExitCode } from '../../errors/codes'; -export const incidentNoteCommand: Command = { - name: 'incident note', - description: 'Append a note to an incident timeline', - operationId: 'incidents.timeline.create', +export const issueNoteCommand: Command = { + name: 'issue note', + description: 'Append a note to an issue timeline', + operationId: 'issues.timeline.create', positional: [ - { name: 'thread-id', description: 'Incident thread ID (thrd_…)' }, + { name: 'issue-id', description: 'Issue ID (iss_…)' }, { name: 'body', description: 'Markdown body of the note', variadic: true }, ], options: [ { flag: '--title <t>', description: 'Optional short title', type: 'string' }, ], examples: [ - 'polylane incident note thrd_xxx "rolled back deploy abc123"', - 'polylane incident note thrd_xxx --title "Workaround" "increased lambda concurrency to 200"', + 'polylane issue note iss_xxx "rolled back deploy abc123"', + 'polylane issue note iss_xxx --title "Workaround" "increased lambda concurrency to 200"', ], async execute(config: Config, _flags, args: Record<string, unknown>): Promise<void> { const workspaceId = await requireWorkspace(config); - const threadId = requirePositional(args, 0, 'thread-id'); + const issueId = requirePositional(args, 0, 'issue-id'); const bodyParts = getAllPositional(args).slice(1); if (bodyParts.length === 0) { throw new CLIError( 'Missing <body>', ExitCode.USAGE, - 'polylane incident note <thread-id> "<markdown body>"' + 'polylane issue note <issue-id> "<markdown body>"' ); } const body = bodyParts.join(' '); const title = getArgString(args, 'title'); const api = new PolylaneAPI(config); - const result = await api.incidentsTimelineCreate({ + const result = await api.issuesTimelineCreate({ workspaceId, - incidentThreadId: threadId, + issueId, type: 'note', body, ...(title ? { title } : {}), diff --git a/src/commands/issue/show.ts b/src/commands/issue/show.ts index 521a0ce..d824447 100644 --- a/src/commands/issue/show.ts +++ b/src/commands/issue/show.ts @@ -9,7 +9,7 @@ export const issueShowCommand: Command = { description: 'Show an issue with reasoning, metrics, and logs', operationId: 'issues.get', positional: [{ name: 'issue-id', description: 'The issue ID' }], - examples: ['polylane issue show issue_xxx'], + examples: ['polylane issue show iss_xxx'], async execute(config: Config, _flags, args: Record<string, unknown>): Promise<void> { const workspaceId = await requireWorkspace(config); const id = requirePositional(args, 0, 'issue-id'); diff --git a/src/commands/incident/timeline.ts b/src/commands/issue/timeline.ts similarity index 80% rename from src/commands/incident/timeline.ts rename to src/commands/issue/timeline.ts index bdaf229..5e5e800 100644 --- a/src/commands/incident/timeline.ts +++ b/src/commands/issue/timeline.ts @@ -7,11 +7,11 @@ import { requireWorkspace, requirePositional, getArgString, getArgNumber, getArg const FIELDS = ['id', 'at', 'type', 'title', 'createdBy']; -export const incidentTimelineCommand: Command = { - name: 'incident timeline', - description: 'Show the timeline of events for an incident thread', - operationId: 'incidents.timeline.list', - positional: [{ name: 'thread-id', description: 'Incident thread ID (thrd_…)' }], +export const issueTimelineCommand: Command = { + name: 'issue timeline', + description: 'Show the timeline of events for an issue', + operationId: 'issues.timeline.list', + positional: [{ name: 'issue-id', description: 'Issue ID (iss_…)' }], options: [ { flag: '--types <a,b,c>', description: 'Filter by event types (comma-separated)', type: 'string' }, { flag: '--from <ms>', description: 'Lower bound (unix ms)', type: 'number' }, @@ -20,12 +20,12 @@ export const incidentTimelineCommand: Command = { { flag: '--full', description: 'Return full objects', type: 'boolean' }, ], examples: [ - 'polylane incident timeline thrd_xxx', - 'polylane incident timeline thrd_xxx --types note,milestone', + 'polylane issue timeline iss_xxx', + 'polylane issue timeline iss_xxx --types note,milestone', ], async execute(config: Config, _flags, args: Record<string, unknown>): Promise<void> { const workspaceId = await requireWorkspace(config); - const threadId = requirePositional(args, 0, 'thread-id'); + const issueId = requirePositional(args, 0, 'issue-id'); const limit = getArgNumber(args, 'limit') ?? 100; const full = getArgBoolean(args, 'full') === true; const types = getArgString(args, 'types'); @@ -33,9 +33,9 @@ export const incidentTimelineCommand: Command = { const to = getArgNumber(args, 'to'); const api = new PolylaneAPI(config); - const result = await api.incidentsTimelineList({ + const result = await api.issuesTimelineList({ workspaceId, - incidentThreadId: threadId, + issueId, perPage: limit, ...(types ? { types } : {}), ...(from !== undefined ? { from } : {}), diff --git a/src/commands/service/list.ts b/src/commands/service/list.ts index 437a209..d6c4b07 100644 --- a/src/commands/service/list.ts +++ b/src/commands/service/list.ts @@ -24,6 +24,7 @@ const CATEGORIES: NodeCategory[] = [ 'security', 'observability', 'code', + 'identity', 'other', ]; @@ -36,7 +37,7 @@ export const serviceListCommand: Command = { { flag: '--account <a>', description: 'Cloud account ID/slug', type: 'string' }, { flag: '--region <r>', description: 'Cloud region', type: 'string' }, { flag: '--type <t>', description: 'Resource type (e.g. aws.lambda.function)', type: 'string' }, - { flag: '--category <c>', description: 'compute|storage|database|networking|messaging|security|observability|code|other', type: 'string' }, + { flag: '--category <c>', description: 'compute|storage|database|networking|messaging|security|observability|code|identity|other', type: 'string' }, { flag: '--limit <n>', description: 'Max items (default 20)', type: 'number' }, { flag: '--full', description: 'Return full objects', type: 'boolean' }, ], diff --git a/src/commands/thread/ask.ts b/src/commands/thread/ask.ts index 2476bd3..5fa882f 100644 --- a/src/commands/thread/ask.ts +++ b/src/commands/thread/ask.ts @@ -29,7 +29,7 @@ export const threadAskCommand: Command = { options: [ { flag: '--context <ids>', description: 'Comma-separated resource IDs to attach as context', type: 'string' }, { flag: '--name <n>', description: 'Name for the thread (default: auto-derived)', type: 'string' }, - { flag: '--visibility <v>', description: 'workspace | private | team | unlisted | public (default: workspace)', type: 'string' }, + { flag: '--visibility <v>', description: 'workspace | private | workspace_and_github_org | public (default: workspace)', type: 'string' }, { flag: '--stream', description: 'Stream assistant tokens as they arrive (requires OAuth)', type: 'boolean' }, { flag: '--no-wait', description: 'Return immediately after sending', type: 'boolean' }, ], diff --git a/src/commands/thread/list.ts b/src/commands/thread/list.ts index bb73dee..442f1dc 100644 --- a/src/commands/thread/list.ts +++ b/src/commands/thread/list.ts @@ -8,7 +8,7 @@ import { CLIError } from '../../errors/base'; import { ExitCode } from '../../errors/codes'; const FIELDS = ['id', 'name', 'type', 'created']; -const VALID_TYPES = ['chat', 'investigation', 'automation', 'autofix', 'incident'] as const; +const VALID_TYPES = ['chat', 'hypothesis', 'automation', 'autofix', 'investigation', 'pr_review'] as const; type ThreadType = (typeof VALID_TYPES)[number]; export const threadListCommand: Command = { @@ -16,14 +16,14 @@ export const threadListCommand: Command = { description: 'List conversation threads', operationId: 'threads.list', options: [ - { flag: '--type <t>', description: 'Filter by thread type (chat | investigation | automation | autofix | incident; comma-separated)', type: 'string' }, + { flag: '--type <t>', description: 'Filter by thread type (chat | hypothesis | automation | autofix | investigation | pr_review; comma-separated)', type: 'string' }, { flag: '--labels <a,b,c>', description: 'Filter by labels (comma-separated)', type: 'string' }, { flag: '--limit <n>', description: 'Max items (default 20)', type: 'number' }, { flag: '--full', description: 'Return full objects', type: 'boolean' }, ], examples: [ 'polylane thread list', - 'polylane thread list --type incident', + 'polylane thread list --type investigation', 'polylane thread list --type chat,investigation --limit 50', ], async execute(config: Config, _flags, args: Record<string, unknown>): Promise<void> { diff --git a/src/registry.ts b/src/registry.ts index 36fa267..1759833 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -17,8 +17,7 @@ export interface ResourceGroup { const RESOURCE_ORDER: Record<string, ResourceGroup> = { feed: { name: 'feed', description: 'Workspace activity feed (what just happened)', order: 6 }, - issue: { name: 'issue', description: 'Detected issues (anomalies + alerts)', order: 8 }, - incident: { name: 'incident', description: 'Incident timeline (notes, milestones)', order: 10 }, + issue: { name: 'issue', description: 'Detected issues (anomalies + alerts) and their timelines', order: 8 }, service: { name: 'service', description: 'Cloud infrastructure (nodes, logs, metrics, graph)', order: 20 }, repo: { name: 'repo', description: 'Repositories and code search', order: 30 }, tools: { name: 'tools', description: 'Run Polylane agent tools (observability, infra graph, code search)', order: 40 }, diff --git a/test/resolve.test.ts b/test/resolve.test.ts index d1a4abc..cd29091 100644 --- a/test/resolve.test.ts +++ b/test/resolve.test.ts @@ -12,10 +12,10 @@ describe('command resolution', () => { assert.equal(r.command.name, 'issue list'); }); - it('resolves incident note', () => { - const r = registry.resolve(['incident', 'note']); + it('resolves issue note', () => { + const r = registry.resolve(['issue', 'note']); assert.ok(r); - assert.equal(r.command.name, 'incident note'); + assert.equal(r.command.name, 'issue note'); }); it('resolves service logs', () => { @@ -48,7 +48,6 @@ describe('command resolution', () => { 'config', 'feed', 'help', - 'incident', 'integration', 'issue', 'memory', @@ -64,10 +63,10 @@ describe('command resolution', () => { ]); }); - it('issue group has 2 commands', () => { + it('issue group has 5 commands', () => { const node = registry.resolveNode(['issue']); assert.ok(node); const subs = registry.getSubcommands(node); - assert.equal(subs.length, 2); + assert.equal(subs.length, 5); }); });