From 2171f279e3e0d397db1b267ea78665608a914d30 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Jul 2026 21:11:25 +0000 Subject: [PATCH 1/3] feat: reconcile commands with the current API (issues absorb incidents) The platform renamed incidents to issues: incident timelines moved to issues.timeline.* keyed by issue ID, the incident thread type and feed category were removed, and issue statuses changed. Move the incident timeline/note/milestone commands into the issue group, fix the issue status and feed category enums, refresh thread types and visibilities (adds workspace_and_github_org), add the identity node category, and rename automation action types (openIssue, createGithubIssue). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01XHaytyPxmPhLqPavUH8Ss1 --- src/commands/autofix/list.ts | 4 ++-- src/commands/automation/create.ts | 4 ++-- src/commands/feed/list.ts | 6 ++--- src/commands/incident/index.ts | 9 -------- src/commands/index.ts | 2 -- src/commands/issue/index.ts | 11 +++++++++- src/commands/issue/list.ts | 10 ++++----- src/commands/{incident => issue}/milestone.ts | 22 +++++++++---------- src/commands/{incident => issue}/note.ts | 22 +++++++++---------- src/commands/issue/show.ts | 2 +- src/commands/{incident => issue}/timeline.ts | 20 ++++++++--------- src/commands/service/list.ts | 3 ++- src/commands/thread/ask.ts | 2 +- src/commands/thread/list.ts | 6 ++--- src/registry.ts | 3 +-- test/resolve.test.ts | 11 +++++----- 16 files changed, 67 insertions(+), 70 deletions(-) delete mode 100644 src/commands/incident/index.ts rename src/commands/{incident => issue}/milestone.ts (66%) rename src/commands/{incident => issue}/note.ts (65%) rename src/commands/{incident => issue}/timeline.ts (80%) 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); }); }); From b3928ca407f61301408462006a56af35cf86647d Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 23 Jul 2026 21:13:25 +0000 Subject: [PATCH 2/3] build: fix dependency advisories and drop EOL Node 18 Update ws to 8.21.1 and esbuild to 0.25 (both had open advisories), refresh tsx and transitive pins via npm audit fix, raise the engines floor to Node 20, and move the CI matrix and installer checks from 18/20/22 to 20/22/24. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XHaytyPxmPhLqPavUH8Ss1 --- .github/workflows/checks.yml | 2 +- .github/workflows/release.yml | 2 +- AGENTS.md | 2 +- install/install.ps1 | 8 +- install/install.sh | 8 +- package-lock.json | 516 +++++++++++++++++----------------- package.json | 8 +- 7 files changed, 275 insertions(+), 271 deletions(-) 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/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" } From db5159ba44cf862a640e9b6d8bcfcd1cf9b6346e Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 23 Jul 2026 21:15:20 +0000 Subject: [PATCH 3/3] docs: refresh README and skill for the current platform surface Incidents are now issues (issue timeline/note/milestone, investigation threads, renamed automation actions), OAuth is the default connect path with API keys reserved for headless use, the Homebrew install command names the formula, and the Node floor is 20. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XHaytyPxmPhLqPavUH8Ss1 --- README.md | 27 +++++++++++++++------------ skill/SKILL.md | 37 +++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index cdabadf..2601a55 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # polylane <p><strong>Agent-focused CLI for the <a href="https://polylane.com">Polylane</a> platform.</strong><br> -Investigate incidents, explore cloud infrastructure, search code, run automations, and drive threads — from any agent or terminal.</p> +Investigate production issues, explore cloud infrastructure, search code, run automations, and drive threads — from any agent or terminal.</p> <p>📚 <strong>Docs: <a href="https://docs.polylane.com">docs.polylane.com</a></strong> · <a href="https://docs.polylane.com/getting-started">Getting started</a> · <a href="https://docs.polylane.com/llms.txt">llms.txt</a> (agent index)</p> <p> <a href="https://www.npmjs.com/package/@coreplane/polylane"><img src="https://img.shields.io/npm/v/@coreplane/polylane.svg" alt="npm version"></a> <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a> - <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg" alt="Node.js >= 18"></a> + <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg" alt="Node.js >= 20"></a> </p> ## 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 <op>` 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 <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 <thread-id> "rolled back deploy" +polylane thread list --type investigation # investigation threads +polylane issue note <issue-id> "rolled back deploy" polylane service logs <service> --since 1h --grep error polylane tools run findNodes --params '{"query":"api"}' polylane thread ask "<prompt>" --stream @@ -167,11 +168,13 @@ Manage with `polylane config show` and `polylane config set --key <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/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 <email> --password <pw> # 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 <issue-id> # full body + linked incident -polylane thread list --type incident # active incident threads -polylane thread show <thread-id> # the incident thread with Console / Next footer -polylane incident timeline <thread-id> # who did what, when -polylane incident note <thread-id> "rolled back deploy ABC" -polylane incident milestone <thread-id> "Mitigated" +polylane issue show <issue-id> # full body + linked investigation +polylane thread list --type investigation # active investigation threads +polylane thread show <thread-id> # the investigation thread with Console / Next footer +polylane issue timeline <issue-id> # who did what, when +polylane issue note <issue-id> "rolled back deploy ABC" +polylane issue milestone <issue-id> "Mitigated" # Drill into services polylane service find "<query>" @@ -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: <https://docs.polylane.com/fix-and-automate/automations>. ```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`.