kanban 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/skills/kanban-skill.js +1 -1
- package/dist/skills/kanban-skill.js.map +1 -1
- package/dist/terminal/pty-session.d.ts.map +1 -1
- package/dist/terminal/pty-session.js +38 -2
- package/dist/terminal/pty-session.js.map +1 -1
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +2 -1
- package/dist/update/auto-update.js.map +1 -1
- package/dist/web-ui/assets/{index-C-z3g54p.js → index-DBFyjndU.js} +9742 -9742
- package/dist/web-ui/index.html +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -46,7 +46,7 @@ kanban
|
|
|
46
46
|
Run this from the root of any git repo. Kanban will detect your installed CLI agent and launch a local running webserver in your browser. No account or setup required, it works right out of the box.
|
|
47
47
|
|
|
48
48
|
### 2. Create tasks
|
|
49
|
-
Create a task card manually, or open the built-in terminal (<kbd>⌘</kbd> + <kbd>J</kbd>) and ask your agent to break work down into tasks for you. A `kanban` skill is automatically added to your CLI agent so it knows how to create, edit, start, and link tasks on your kanban board. Use `/kanban` or `$kanban`, or simply ask your agent to "add tasks..."
|
|
49
|
+
Create a task card manually, or open the built-in terminal (<kbd>⌘</kbd> + <kbd>J</kbd>) and ask your agent to break work down into tasks for you. A `kanban` skill is automatically added to your CLI agent so it knows how to create, edit, start, and link tasks on your kanban board. Use `/kanban` or `$kanban`, or simply ask your agent to "add tasks to kanban..."
|
|
50
50
|
|
|
51
51
|
### 3. Link and automate
|
|
52
52
|
<kbd>⌘</kbd> + click a card to link it to another task. When a card is completed and moved to trash, linked tasks auto-start. Combine with auto-commit for fully autonomous dependency chains: one task completes → commits → kicks off the next → repeat. It’s a pretty magical experience asking your agent to decompose a big task into subtasks that auto-commit - he’ll cleverly do it in a way that parallelizes for maximum efficiency and links tasks together for end-to-end autonomy.
|
|
@@ -46,7 +46,7 @@ export function renderKanbanSkillMarkdown(commandPrefix) {
|
|
|
46
46
|
const kanbanCommand = commandPrefix.trim() || DEFAULT_COMMAND_PREFIX;
|
|
47
47
|
return `---
|
|
48
48
|
name: kanban
|
|
49
|
-
description: Manage tasks on the user's Kanban, a tool for orchestrating agents in worktrees
|
|
49
|
+
description: Manage tasks on the user's Kanban, a tool for orchestrating coding agents in worktrees via a kanban board. This skill helps you create, edit, link, and start tasks using the kanban CLI. The user first launches kanban with e.g. npx kanban, then may ask you to help 'add tasks to kanban' or something to that effect (e.g. link / port over / break work down / split into kanban tasks). Only use this skill when the user mentions kanban.
|
|
50
50
|
---
|
|
51
51
|
|
|
52
52
|
# Kanban
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban-skill.js","sourceRoot":"","sources":["../../src/skills/kanban-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAElG,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,sBAAsB,GAAG,QAAQ,CAAC;AASxC,MAAM,UAAU,+BAA+B,CAAC,OAA+C;IAC9F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,OAAO,sBAAsB,CAAC;IAC/B,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,YAAY,CAAC;IAChE,IAAI,cAAsB,CAAC;IAC3B,IAAI,CAAC;QACJ,cAAc,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,sBAAsB,CAAC;IAC/B,CAAC;IAED,MAAM,YAAY,GAAG,4BAA4B,CAAC;QACjD,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,WAAW,EAAE,QAAQ;QACrB,cAAc;QACd,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;KACjC,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC9C,OAAO,sBAAsB,CAAC;IAC/B,CAAC;IAED,IAAI,YAAY,CAAC,cAAc,KAAK,wBAAwB,CAAC,GAAG,EAAE,CAAC;QAClE,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,IAAI,YAAY,CAAC,cAAc,KAAK,wBAAwB,CAAC,IAAI,EAAE,CAAC;QACnE,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IACD,IAAI,YAAY,CAAC,cAAc,KAAK,wBAAwB,CAAC,IAAI,EAAE,CAAC;QACnE,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IACD,IAAI,YAAY,CAAC,cAAc,KAAK,wBAAwB,CAAC,GAAG,EAAE,CAAC;QAClE,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,OAAO,sBAAsB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,aAAqB;IAC9D,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,sBAAsB,CAAC;IACrE,OAAO;;;;;;;;;;;;;6HAaqH,aAAa;;;;;IAKtI,aAAa;;;;;;;;;;;IAWb,aAAa;;;;;;;;;;;IAWb,aAAa;;;;;;;;;;;;;;;IAeb,aAAa;;;;;;;;;;;;;;;;;;;IAmBb,aAAa;;;;;;;;;;;;IAYb,aAAa;;;;;;;;;;;IAWb,aAAa;;;;;;;;;;;;CAYhB,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,kBAA2B;IAC1E,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5E,IAAI,kBAAkB,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAuC;IACpF,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE,EAAE,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC;IAE9G,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,YAAY,CAAC;AACrB,CAAC","sourcesContent":["import { realpathSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { AutoUpdatePackageManager, detectAutoUpdateInstallation } from \"../update/auto-update.js\";\n\nconst SKILL_NAME = \"kanban\";\nconst DEFAULT_COMMAND_PREFIX = \"kanban\";\n\nexport interface ResolveKanbanSkillCommandPrefixOptions {\n\tcurrentVersion: string;\n\targv?: string[];\n\tcwd?: string;\n\tresolveRealPath?: (path: string) => string;\n}\n\nexport function resolveKanbanSkillCommandPrefix(options: ResolveKanbanSkillCommandPrefixOptions): string {\n\tconst argv = options.argv ?? process.argv;\n\tconst entrypointArg = argv[1];\n\tif (!entrypointArg) {\n\t\treturn DEFAULT_COMMAND_PREFIX;\n\t}\n\n\tconst resolveRealPath = options.resolveRealPath ?? realpathSync;\n\tlet entrypointPath: string;\n\ttry {\n\t\tentrypointPath = resolveRealPath(entrypointArg);\n\t} catch {\n\t\treturn DEFAULT_COMMAND_PREFIX;\n\t}\n\n\tconst installation = detectAutoUpdateInstallation({\n\t\tcurrentVersion: options.currentVersion,\n\t\tpackageName: \"kanban\",\n\t\tentrypointPath,\n\t\tcwd: options.cwd ?? process.cwd(),\n\t});\n\n\tif (installation.updateTiming !== \"shutdown\") {\n\t\treturn DEFAULT_COMMAND_PREFIX;\n\t}\n\n\tif (installation.packageManager === AutoUpdatePackageManager.NPX) {\n\t\treturn \"npx -y kanban\";\n\t}\n\tif (installation.packageManager === AutoUpdatePackageManager.PNPM) {\n\t\treturn \"pnpm dlx kanban\";\n\t}\n\tif (installation.packageManager === AutoUpdatePackageManager.YARN) {\n\t\treturn \"yarn dlx kanban\";\n\t}\n\tif (installation.packageManager === AutoUpdatePackageManager.BUN) {\n\t\treturn \"bun x kanban\";\n\t}\n\n\treturn DEFAULT_COMMAND_PREFIX;\n}\n\nexport function renderKanbanSkillMarkdown(commandPrefix: string): string {\n\tconst kanbanCommand = commandPrefix.trim() || DEFAULT_COMMAND_PREFIX;\n\treturn `---\nname: kanban\ndescription: Manage tasks on the user's Kanban, a tool for orchestrating agents in worktrees. Use when the user asks to create tasks, add tasks, make multiple tasks, break work down into tasks, split work into tasks, decompose work into tasks, turn work into Kanban tasks, or manage existing Kanban task dependencies. Also use when the user vaguely asks to add or create tasks without specifically mentioning Kanban -- if they say things like \"add some tasks\", \"create a few tasks for this\", \"make tasks for these changes\", or any generic task creation request, default to using Kanban.\n---\n\n# Kanban\n\nKanban is a CLI tool for orchestrating multiple coding agents working on tasks in parallel on a kanban board. It manages git worktrees automatically so that each task can run a dedicated CLI agent in its own worktree.\n\n- If the user asks to add tasks to kb, ask kb, kanban, or says add tasks without other context, they likely want to add tasks in Kanban. This includes phrases like \"create tasks\", \"make 3 tasks\", \"add a task\", \"break down into tasks\", \"split into tasks\", \"decompose into tasks\", \"turn into tasks\", etc.\n- Kanban also supports linking tasks. Linking is useful both for parallelization and for dependencies: when work is easy to decompose into multiple pieces that can be done in parallel, link multiple backlog tasks to the same dependency so they all become ready to start once that dependency finishes; when one piece of work depends on another, use links to represent that follow-on dependency. A link requires at least one backlog task, and when the linked review task is moved to trash, that backlog task becomes ready to start.\n- Tasks can also enable automatic review actions: auto-commit, auto-open-pr, or auto-move-to-trash once completed, sending the task to trash and kicking off any linked tasks.\n- There is a special case where the user may create a Kanban task to create new Kanban tasks. If the current working directory contains .kanban/worktrees/ in its path, you are running inside an ephemeral Kanban worktree. In this case, pass the main worktree path with \\`--project-path\\` so the new tasks are created under the correct workspace, not the ephemeral worktree path.\n- If a task command fails because the runtime is unavailable, tell the user to start Kanban in that workspace first with \\`${kanbanCommand}\\`, then retry the task command.\n\n# Command Prefix\n\nUse this prefix for every Kanban command in this session:\n\\`${kanbanCommand}\\`\n\n# CLI Reference\n\nAll commands return JSON.\n\n## task list\n\nPurpose: list Kanban tasks for a workspace, including auto-review settings and dependency links.\n\nCommand:\n\\`${kanbanCommand} task list [--project-path <path>] [--column backlog|in_progress|review]\\`\n\nParameters:\n- \\`--project-path <path>\\` optional workspace path. If omitted, uses the current working directory workspace.\n- \\`--column <value>\\` optional filter. Allowed values: \\`backlog\\`, \\`in_progress\\`, \\`review\\`.\n\n## task create\n\nPurpose: create a new task in \\`backlog\\`, with optional plan mode and auto-review behavior.\n\nCommand:\n\\`${kanbanCommand} task create --prompt \"<text>\" [--project-path <path>] [--base-ref <branch>] [--start-in-plan-mode <true|false>] [--auto-review-enabled <true|false>] [--auto-review-mode commit|pr|move_to_trash]\\`\n\nParameters:\n- \\`--prompt \"<text>\"\\` required task prompt text.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n- \\`--base-ref <branch>\\` optional base branch/worktree ref. Defaults to current branch, then default branch, then first known branch.\n- \\`--start-in-plan-mode <true|false>\\` optional. Default false. Set true only when explicitly requested.\n- \\`--auto-review-enabled <true|false>\\` optional. Default false. Enables automatic action once task reaches review.\n- \\`--auto-review-mode commit|pr|move_to_trash\\` optional auto-review action. Default \\`commit\\`.\n\n## task update\n\nPurpose: update an existing task, including prompt, base ref, plan mode, and auto-review behavior.\n\nCommand:\n\\`${kanbanCommand} task update --task-id <task_id> [--prompt \"<text>\"] [--project-path <path>] [--base-ref <branch>] [--start-in-plan-mode <true|false>] [--auto-review-enabled <true|false>] [--auto-review-mode commit|pr|move_to_trash]\\`\n\nParameters:\n- \\`--task-id <task_id>\\` required task ID.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n- \\`--prompt \"<text>\"\\` optional replacement prompt text.\n- \\`--base-ref <branch>\\` optional replacement base ref.\n- \\`--start-in-plan-mode <true|false>\\` optional replacement of plan-mode behavior.\n- \\`--auto-review-enabled <true|false>\\` optional replacement of auto-review toggle. Set false to cancel pending automatic review actions.\n- \\`--auto-review-mode commit|pr|move_to_trash\\` optional replacement auto-review action.\n\nNotes:\n- Provide at least one field to change in addition to \\`--task-id\\`.\n\n## task link\n\nPurpose: link two tasks so one can wait on another. At least one linked task must be in backlog.\n\nCommand:\n\\`${kanbanCommand} task link --task-id <task_id> --linked-task-id <task_id> [--project-path <path>]\\`\n\nParameters:\n- \\`--task-id <task_id>\\` required first task ID.\n- \\`--linked-task-id <task_id>\\` required second task ID.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n\n## task unlink\n\nPurpose: remove an existing task link (dependency) by dependency ID.\n\nCommand:\n\\`${kanbanCommand} task unlink --dependency-id <dependency_id> [--project-path <path>]\\`\n\nParameters:\n- \\`--dependency-id <dependency_id>\\` required dependency ID. Use \\`task list\\` to inspect existing links.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n\n## task start\n\nPurpose: start a task by ensuring its worktree, launching its agent session, and moving it to \\`in_progress\\`.\n\nCommand:\n\\`${kanbanCommand} task start --task-id <task_id> [--project-path <path>]\\`\n\nParameters:\n- \\`--task-id <task_id>\\` required task ID.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n\n# Workflow Notes\n\n- Prefer \\`task list\\` first when task IDs or dependency IDs are needed.\n- To create multiple linked tasks, create tasks first, then call \\`task link\\` for each dependency edge.\n- If \\`pwd\\` includes \\`/.kanban/worktrees/\\`, set \\`--project-path\\` to the main workspace path. You can derive it with:\n\\`main_path=\"\\${PWD%%/.kanban/worktrees/*}\"\\`\n`;\n}\n\nfunction getSkillInstallPaths(homePath: string, includeClaudeSkill: boolean): string[] {\n\tconst paths = [join(homePath, \".agents\", \"skills\", SKILL_NAME, \"SKILL.md\")];\n\tif (includeClaudeSkill) {\n\t\tpaths.push(join(homePath, \".claude\", \"skills\", SKILL_NAME, \"SKILL.md\"));\n\t}\n\treturn paths;\n}\n\nexport interface InstallKanbanSkillFilesOptions {\n\tcommandPrefix: string;\n\tinstallClaudeSkill?: boolean;\n\thomePath?: string;\n}\n\nexport async function installKanbanSkillFiles(options: InstallKanbanSkillFilesOptions): Promise<string[]> {\n\tconst skillContent = renderKanbanSkillMarkdown(options.commandPrefix);\n\tconst installPaths = getSkillInstallPaths(options.homePath ?? homedir(), options.installClaudeSkill === true);\n\n\tfor (const installPath of installPaths) {\n\t\tawait mkdir(dirname(installPath), { recursive: true });\n\t\tawait writeFile(installPath, skillContent, \"utf8\");\n\t}\n\n\treturn installPaths;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kanban-skill.js","sourceRoot":"","sources":["../../src/skills/kanban-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpathSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { AutoUpdatePackageManager, detectAutoUpdateInstallation } from \"../update/auto-update.js\";\n\nconst SKILL_NAME = \"kanban\";\nconst DEFAULT_COMMAND_PREFIX = \"kanban\";\n\nexport interface ResolveKanbanSkillCommandPrefixOptions {\n\tcurrentVersion: string;\n\targv?: string[];\n\tcwd?: string;\n\tresolveRealPath?: (path: string) => string;\n}\n\nexport function resolveKanbanSkillCommandPrefix(options: ResolveKanbanSkillCommandPrefixOptions): string {\n\tconst argv = options.argv ?? process.argv;\n\tconst entrypointArg = argv[1];\n\tif (!entrypointArg) {\n\t\treturn DEFAULT_COMMAND_PREFIX;\n\t}\n\n\tconst resolveRealPath = options.resolveRealPath ?? realpathSync;\n\tlet entrypointPath: string;\n\ttry {\n\t\tentrypointPath = resolveRealPath(entrypointArg);\n\t} catch {\n\t\treturn DEFAULT_COMMAND_PREFIX;\n\t}\n\n\tconst installation = detectAutoUpdateInstallation({\n\t\tcurrentVersion: options.currentVersion,\n\t\tpackageName: \"kanban\",\n\t\tentrypointPath,\n\t\tcwd: options.cwd ?? process.cwd(),\n\t});\n\n\tif (installation.updateTiming !== \"shutdown\") {\n\t\treturn DEFAULT_COMMAND_PREFIX;\n\t}\n\n\tif (installation.packageManager === AutoUpdatePackageManager.NPX) {\n\t\treturn \"npx -y kanban\";\n\t}\n\tif (installation.packageManager === AutoUpdatePackageManager.PNPM) {\n\t\treturn \"pnpm dlx kanban\";\n\t}\n\tif (installation.packageManager === AutoUpdatePackageManager.YARN) {\n\t\treturn \"yarn dlx kanban\";\n\t}\n\tif (installation.packageManager === AutoUpdatePackageManager.BUN) {\n\t\treturn \"bun x kanban\";\n\t}\n\n\treturn DEFAULT_COMMAND_PREFIX;\n}\n\nexport function renderKanbanSkillMarkdown(commandPrefix: string): string {\n\tconst kanbanCommand = commandPrefix.trim() || DEFAULT_COMMAND_PREFIX;\n\treturn `---\nname: kanban\ndescription: Manage tasks on the user's Kanban, a tool for orchestrating coding agents in worktrees via a kanban board. This skill helps you create, edit, link, and start tasks using the kanban CLI. The user first launches kanban with e.g. npx kanban, then may ask you to help 'add tasks to kanban' or something to that effect (e.g. link / port over / break work down / split into kanban tasks). Only use this skill when the user mentions kanban.\n---\n\n# Kanban\n\nKanban is a CLI tool for orchestrating multiple coding agents working on tasks in parallel on a kanban board. It manages git worktrees automatically so that each task can run a dedicated CLI agent in its own worktree.\n\n- If the user asks to add tasks to kb, ask kb, kanban, or says add tasks without other context, they likely want to add tasks in Kanban. This includes phrases like \"create tasks\", \"make 3 tasks\", \"add a task\", \"break down into tasks\", \"split into tasks\", \"decompose into tasks\", \"turn into tasks\", etc.\n- Kanban also supports linking tasks. Linking is useful both for parallelization and for dependencies: when work is easy to decompose into multiple pieces that can be done in parallel, link multiple backlog tasks to the same dependency so they all become ready to start once that dependency finishes; when one piece of work depends on another, use links to represent that follow-on dependency. A link requires at least one backlog task, and when the linked review task is moved to trash, that backlog task becomes ready to start.\n- Tasks can also enable automatic review actions: auto-commit, auto-open-pr, or auto-move-to-trash once completed, sending the task to trash and kicking off any linked tasks.\n- There is a special case where the user may create a Kanban task to create new Kanban tasks. If the current working directory contains .kanban/worktrees/ in its path, you are running inside an ephemeral Kanban worktree. In this case, pass the main worktree path with \\`--project-path\\` so the new tasks are created under the correct workspace, not the ephemeral worktree path.\n- If a task command fails because the runtime is unavailable, tell the user to start Kanban in that workspace first with \\`${kanbanCommand}\\`, then retry the task command.\n\n# Command Prefix\n\nUse this prefix for every Kanban command in this session:\n\\`${kanbanCommand}\\`\n\n# CLI Reference\n\nAll commands return JSON.\n\n## task list\n\nPurpose: list Kanban tasks for a workspace, including auto-review settings and dependency links.\n\nCommand:\n\\`${kanbanCommand} task list [--project-path <path>] [--column backlog|in_progress|review]\\`\n\nParameters:\n- \\`--project-path <path>\\` optional workspace path. If omitted, uses the current working directory workspace.\n- \\`--column <value>\\` optional filter. Allowed values: \\`backlog\\`, \\`in_progress\\`, \\`review\\`.\n\n## task create\n\nPurpose: create a new task in \\`backlog\\`, with optional plan mode and auto-review behavior.\n\nCommand:\n\\`${kanbanCommand} task create --prompt \"<text>\" [--project-path <path>] [--base-ref <branch>] [--start-in-plan-mode <true|false>] [--auto-review-enabled <true|false>] [--auto-review-mode commit|pr|move_to_trash]\\`\n\nParameters:\n- \\`--prompt \"<text>\"\\` required task prompt text.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n- \\`--base-ref <branch>\\` optional base branch/worktree ref. Defaults to current branch, then default branch, then first known branch.\n- \\`--start-in-plan-mode <true|false>\\` optional. Default false. Set true only when explicitly requested.\n- \\`--auto-review-enabled <true|false>\\` optional. Default false. Enables automatic action once task reaches review.\n- \\`--auto-review-mode commit|pr|move_to_trash\\` optional auto-review action. Default \\`commit\\`.\n\n## task update\n\nPurpose: update an existing task, including prompt, base ref, plan mode, and auto-review behavior.\n\nCommand:\n\\`${kanbanCommand} task update --task-id <task_id> [--prompt \"<text>\"] [--project-path <path>] [--base-ref <branch>] [--start-in-plan-mode <true|false>] [--auto-review-enabled <true|false>] [--auto-review-mode commit|pr|move_to_trash]\\`\n\nParameters:\n- \\`--task-id <task_id>\\` required task ID.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n- \\`--prompt \"<text>\"\\` optional replacement prompt text.\n- \\`--base-ref <branch>\\` optional replacement base ref.\n- \\`--start-in-plan-mode <true|false>\\` optional replacement of plan-mode behavior.\n- \\`--auto-review-enabled <true|false>\\` optional replacement of auto-review toggle. Set false to cancel pending automatic review actions.\n- \\`--auto-review-mode commit|pr|move_to_trash\\` optional replacement auto-review action.\n\nNotes:\n- Provide at least one field to change in addition to \\`--task-id\\`.\n\n## task link\n\nPurpose: link two tasks so one can wait on another. At least one linked task must be in backlog.\n\nCommand:\n\\`${kanbanCommand} task link --task-id <task_id> --linked-task-id <task_id> [--project-path <path>]\\`\n\nParameters:\n- \\`--task-id <task_id>\\` required first task ID.\n- \\`--linked-task-id <task_id>\\` required second task ID.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n\n## task unlink\n\nPurpose: remove an existing task link (dependency) by dependency ID.\n\nCommand:\n\\`${kanbanCommand} task unlink --dependency-id <dependency_id> [--project-path <path>]\\`\n\nParameters:\n- \\`--dependency-id <dependency_id>\\` required dependency ID. Use \\`task list\\` to inspect existing links.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n\n## task start\n\nPurpose: start a task by ensuring its worktree, launching its agent session, and moving it to \\`in_progress\\`.\n\nCommand:\n\\`${kanbanCommand} task start --task-id <task_id> [--project-path <path>]\\`\n\nParameters:\n- \\`--task-id <task_id>\\` required task ID.\n- \\`--project-path <path>\\` optional workspace path. If not already registered in Kanban, it is auto-added for git repos.\n\n# Workflow Notes\n\n- Prefer \\`task list\\` first when task IDs or dependency IDs are needed.\n- To create multiple linked tasks, create tasks first, then call \\`task link\\` for each dependency edge.\n- If \\`pwd\\` includes \\`/.kanban/worktrees/\\`, set \\`--project-path\\` to the main workspace path. You can derive it with:\n\\`main_path=\"\\${PWD%%/.kanban/worktrees/*}\"\\`\n`;\n}\n\nfunction getSkillInstallPaths(homePath: string, includeClaudeSkill: boolean): string[] {\n\tconst paths = [join(homePath, \".agents\", \"skills\", SKILL_NAME, \"SKILL.md\")];\n\tif (includeClaudeSkill) {\n\t\tpaths.push(join(homePath, \".claude\", \"skills\", SKILL_NAME, \"SKILL.md\"));\n\t}\n\treturn paths;\n}\n\nexport interface InstallKanbanSkillFilesOptions {\n\tcommandPrefix: string;\n\tinstallClaudeSkill?: boolean;\n\thomePath?: string;\n}\n\nexport async function installKanbanSkillFiles(options: InstallKanbanSkillFilesOptions): Promise<string[]> {\n\tconst skillContent = renderKanbanSkillMarkdown(options.commandPrefix);\n\tconst installPaths = getSkillInstallPaths(options.homePath ?? homedir(), options.installClaudeSkill === true);\n\n\tfor (const installPath of installPaths) {\n\t\tawait mkdir(dirname(installPath), { recursive: true });\n\t\tawait writeFile(installPath, skillContent, \"utf8\");\n\t}\n\n\treturn installPaths;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-session.d.ts","sourceRoot":"","sources":["../../src/terminal/pty-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pty-session.d.ts","sourceRoot":"","sources":["../../src/terminal/pty-session.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACvC;AAwDD,qBAAa,UAAU;IAQrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IARjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAwBP,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAS,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,GAAG,UAAU;IAoB7G,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAIrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIlC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAWnF,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAO/C,cAAc,IAAI,OAAO;CAGzB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as pty from "node-pty";
|
|
2
2
|
const MAX_HISTORY_BYTES = 1024 * 1024;
|
|
3
|
+
const SAFE_WINDOWS_CMD_TOKEN_PATTERN = /^[A-Za-z0-9_./:\\@%+=,-]+$/;
|
|
3
4
|
function normalizeOutputChunk(data) {
|
|
4
5
|
if (typeof data === "string") {
|
|
5
6
|
return Buffer.from(data, "utf8");
|
|
@@ -18,6 +19,35 @@ function terminatePtyProcess(ptyProcess) {
|
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
}
|
|
22
|
+
function resolveWindowsComSpec() {
|
|
23
|
+
const comSpec = process.env.ComSpec?.trim() || process.env.COMSPEC?.trim();
|
|
24
|
+
return comSpec || "cmd.exe";
|
|
25
|
+
}
|
|
26
|
+
function quoteWindowsCmdToken(value) {
|
|
27
|
+
if (value.length === 0) {
|
|
28
|
+
return '""';
|
|
29
|
+
}
|
|
30
|
+
if (SAFE_WINDOWS_CMD_TOKEN_PATTERN.test(value)) {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
return `"${value.replaceAll('"', '""')}"`;
|
|
34
|
+
}
|
|
35
|
+
function buildWindowsCmdCommandLine(binary, args) {
|
|
36
|
+
return [binary, ...args].map((part) => quoteWindowsCmdToken(part)).join(" ");
|
|
37
|
+
}
|
|
38
|
+
function shouldUseWindowsShellLaunch(binary) {
|
|
39
|
+
if (process.platform !== "win32") {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const normalized = binary.trim().toLowerCase();
|
|
43
|
+
if (!normalized) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (normalized === "cmd" || normalized === "cmd.exe") {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return normalized !== resolveWindowsComSpec().toLowerCase();
|
|
50
|
+
}
|
|
21
51
|
export class PtySession {
|
|
22
52
|
onDataCallback;
|
|
23
53
|
onExitCallback;
|
|
@@ -48,14 +78,20 @@ export class PtySession {
|
|
|
48
78
|
}
|
|
49
79
|
static spawn({ binary, args = [], cwd, env, cols, rows, onData, onExit }) {
|
|
50
80
|
const terminalName = env?.TERM?.trim() || process.env.TERM?.trim() || "xterm-256color";
|
|
51
|
-
const
|
|
81
|
+
const useWindowsShellLaunch = shouldUseWindowsShellLaunch(binary);
|
|
82
|
+
const spawnBinary = useWindowsShellLaunch ? resolveWindowsComSpec() : binary;
|
|
83
|
+
const spawnArgs = useWindowsShellLaunch
|
|
84
|
+
? ["/d", "/s", "/c", buildWindowsCmdCommandLine(binary, args)]
|
|
85
|
+
: args;
|
|
86
|
+
const ptyOptions = {
|
|
52
87
|
name: terminalName,
|
|
53
88
|
cwd,
|
|
54
89
|
env,
|
|
55
90
|
cols,
|
|
56
91
|
rows,
|
|
57
92
|
encoding: null,
|
|
58
|
-
}
|
|
93
|
+
};
|
|
94
|
+
const ptyProcess = pty.spawn(spawnBinary, spawnArgs, ptyOptions);
|
|
59
95
|
return new PtySession(ptyProcess, onData, onExit);
|
|
60
96
|
}
|
|
61
97
|
get pid() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-session.js","sourceRoot":"","sources":["../../src/terminal/pty-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"pty-session.js","sourceRoot":"","sources":["../../src/terminal/pty-session.ts"],"names":[],"mappings":"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","sourcesContent":["import * as pty from \"node-pty\";\n\nconst MAX_HISTORY_BYTES = 1024 * 1024;\nconst SAFE_WINDOWS_CMD_TOKEN_PATTERN = /^[A-Za-z0-9_./:\\\\@%+=,-]+$/;\n\nexport interface PtyExitEvent {\n\texitCode: number;\n\tsignal?: number;\n}\n\nexport interface SpawnPtySessionRequest {\n\tbinary: string;\n\targs?: string[];\n\tcwd: string;\n\tenv?: Record<string, string | undefined>;\n\tcols: number;\n\trows: number;\n\tonData?: (chunk: Buffer) => void;\n\tonExit?: (event: PtyExitEvent) => void;\n}\n\ntype PtyOutputChunk = string | Buffer | Uint8Array;\n\nfunction normalizeOutputChunk(data: PtyOutputChunk): Buffer {\n\tif (typeof data === \"string\") {\n\t\treturn Buffer.from(data, \"utf8\");\n\t}\n\treturn Buffer.isBuffer(data) ? data : Buffer.from(data);\n}\n\nfunction terminatePtyProcess(ptyProcess: pty.IPty): void {\n\tconst pid = ptyProcess.pid;\n\tptyProcess.kill();\n\tif (process.platform !== \"win32\" && Number.isFinite(pid) && pid > 0) {\n\t\ttry {\n\t\t\tprocess.kill(-pid, \"SIGTERM\");\n\t\t} catch {\n\t\t\t// Best effort: process group may already be gone or inaccessible.\n\t\t}\n\t}\n}\n\nfunction resolveWindowsComSpec(): string {\n\tconst comSpec = process.env.ComSpec?.trim() || process.env.COMSPEC?.trim();\n\treturn comSpec || \"cmd.exe\";\n}\n\nfunction quoteWindowsCmdToken(value: string): string {\n\tif (value.length === 0) {\n\t\treturn '\"\"';\n\t}\n\tif (SAFE_WINDOWS_CMD_TOKEN_PATTERN.test(value)) {\n\t\treturn value;\n\t}\n\treturn `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction buildWindowsCmdCommandLine(binary: string, args: string[]): string {\n\treturn [binary, ...args].map((part) => quoteWindowsCmdToken(part)).join(\" \");\n}\n\nfunction shouldUseWindowsShellLaunch(binary: string): boolean {\n\tif (process.platform !== \"win32\") {\n\t\treturn false;\n\t}\n\tconst normalized = binary.trim().toLowerCase();\n\tif (!normalized) {\n\t\treturn false;\n\t}\n\tif (normalized === \"cmd\" || normalized === \"cmd.exe\") {\n\t\treturn false;\n\t}\n\treturn normalized !== resolveWindowsComSpec().toLowerCase();\n}\n\nexport class PtySession {\n\tprivate readonly ptyProcess: pty.IPty;\n\tprivate readonly outputHistory: Buffer[] = [];\n\tprivate historyBytes = 0;\n\tprivate interrupted = false;\n\n\tprivate constructor(\n\t\tptyProcess: pty.IPty,\n\t\tprivate readonly onDataCallback?: (chunk: Buffer) => void,\n\t\tprivate readonly onExitCallback?: (event: PtyExitEvent) => void,\n\t) {\n\t\tthis.ptyProcess = ptyProcess;\n\t\t(this.ptyProcess.onData as unknown as (listener: (data: PtyOutputChunk) => void) => void)((data) => {\n\t\t\tconst chunk = normalizeOutputChunk(data);\n\t\t\tthis.outputHistory.push(chunk);\n\t\t\tthis.historyBytes += chunk.byteLength;\n\t\t\twhile (this.historyBytes > MAX_HISTORY_BYTES && this.outputHistory.length > 0) {\n\t\t\t\tconst shifted = this.outputHistory.shift();\n\t\t\t\tif (!shifted) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.historyBytes -= shifted.byteLength;\n\t\t\t}\n\t\t\tthis.onDataCallback?.(chunk);\n\t\t});\n\t\tthis.ptyProcess.onExit((event) => {\n\t\t\tthis.onExitCallback?.(event);\n\t\t});\n\t}\n\n\tstatic spawn({ binary, args = [], cwd, env, cols, rows, onData, onExit }: SpawnPtySessionRequest): PtySession {\n\t\tconst terminalName = env?.TERM?.trim() || process.env.TERM?.trim() || \"xterm-256color\";\n\t\tconst useWindowsShellLaunch = shouldUseWindowsShellLaunch(binary);\n\t\tconst spawnBinary = useWindowsShellLaunch ? resolveWindowsComSpec() : binary;\n\t\tconst spawnArgs = useWindowsShellLaunch\n\t\t\t? [\"/d\", \"/s\", \"/c\", buildWindowsCmdCommandLine(binary, args)]\n\t\t\t: args;\n\t\tconst ptyOptions: pty.IPtyForkOptions = {\n\t\t\tname: terminalName,\n\t\t\tcwd,\n\t\t\tenv,\n\t\t\tcols,\n\t\t\trows,\n\t\t\tencoding: null,\n\t\t};\n\n\t\tconst ptyProcess = pty.spawn(spawnBinary, spawnArgs, ptyOptions);\n\t\treturn new PtySession(ptyProcess, onData, onExit);\n\t}\n\n\tget pid(): number {\n\t\treturn this.ptyProcess.pid;\n\t}\n\n\tgetOutputHistory(): readonly Buffer[] {\n\t\treturn this.outputHistory;\n\t}\n\n\twrite(data: string | Buffer): void {\n\t\tthis.ptyProcess.write(typeof data === \"string\" ? data : data.toString(\"utf8\"));\n\t}\n\n\tresize(cols: number, rows: number, pixelWidth?: number, pixelHeight?: number): void {\n\t\tif (pixelWidth !== undefined && pixelHeight !== undefined) {\n\t\t\tthis.ptyProcess.resize(cols, rows, {\n\t\t\t\twidth: pixelWidth,\n\t\t\t\theight: pixelHeight,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.ptyProcess.resize(cols, rows);\n\t}\n\n\tpause(): void {\n\t\tthis.ptyProcess.pause();\n\t}\n\n\tresume(): void {\n\t\tthis.ptyProcess.resume();\n\t}\n\n\tstop(options?: { interrupted?: boolean }): void {\n\t\tif (options?.interrupted) {\n\t\t\tthis.interrupted = true;\n\t\t}\n\t\tterminatePtyProcess(this.ptyProcess);\n\t}\n\n\twasInterrupted(): boolean {\n\t\treturn this.interrupted;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../src/update/auto-update.ts"],"names":[],"mappings":"AAIA,oBAAY,wBAAwB;IACnC,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,KAAK,UAAU;IACf,OAAO,YAAY;CACnB;AAED,UAAU,wBAAwB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CACf;AAED,UAAU,0BAA0B;IACnC,cAAc,EAAE,wBAAwB,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC/C,YAAY,EAAE,SAAS,GAAG,UAAU,CAAC;CACrC;AAED,UAAU,uBAAuB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxD,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACrE;AAOD,UAAU,yBAAyB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../src/update/auto-update.ts"],"names":[],"mappings":"AAIA,oBAAY,wBAAwB;IACnC,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,KAAK,UAAU;IACf,OAAO,YAAY;CACnB;AAED,UAAU,wBAAwB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CACf;AAED,UAAU,0BAA0B;IACnC,cAAc,EAAE,wBAAwB,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC/C,YAAY,EAAE,SAAS,GAAG,UAAU,CAAC;CACrC;AAED,UAAU,uBAAuB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxD,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACrE;AAOD,UAAU,yBAAyB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACtB;AA2QD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAejF;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACZ,GAAG,0BAA0B,CAiG7B;AAoDD,wBAAgB,8BAA8B,CAAC,OAAO,CAAC,EAAE;IACxD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,GAAG,IAAI,CAaP;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDzF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAE3E"}
|
|
@@ -137,6 +137,7 @@ function looksLikeTransientCachePath(path) {
|
|
|
137
137
|
const normalizedPath = toPosixLowerPath(path);
|
|
138
138
|
return (normalizedPath.includes("/.npm/_npx/") ||
|
|
139
139
|
normalizedPath.includes("/npm/_npx/") ||
|
|
140
|
+
normalizedPath.includes("/npm-cache/_npx/") ||
|
|
140
141
|
normalizedPath.includes("/.npx/") ||
|
|
141
142
|
normalizedPath.includes("/pnpm/dlx/") ||
|
|
142
143
|
normalizedPath.includes("/.yarn/cache/") ||
|
|
@@ -148,7 +149,7 @@ function detectTransientAutoUpdateInstallation(options) {
|
|
|
148
149
|
if (!normalizedPath.includes(`/node_modules/${options.packageName.toLowerCase()}/`)) {
|
|
149
150
|
return null;
|
|
150
151
|
}
|
|
151
|
-
const npxCacheDirectory = extractDirectoryForSegmentSequence(options.entrypointPath, [[".npm", "_npx"], ["npm", "_npx"], [".npx"]], 1);
|
|
152
|
+
const npxCacheDirectory = extractDirectoryForSegmentSequence(options.entrypointPath, [[".npm", "_npx"], ["npm", "_npx"], ["npm-cache", "_npx"], [".npx"]], 1);
|
|
152
153
|
if (npxCacheDirectory) {
|
|
153
154
|
return {
|
|
154
155
|
packageManager: AutoUpdatePackageManager.NPX,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/update/auto-update.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport enum AutoUpdatePackageManager {\n\tNPM = \"npm\",\n\tPNPM = \"pnpm\",\n\tYARN = \"yarn\",\n\tBUN = \"bun\",\n\tNPX = \"npx\",\n\tLOCAL = \"local\",\n\tUNKNOWN = \"unknown\",\n}\n\ninterface AutoUpdateInstallCommand {\n\tcommand: string;\n\targs: string[];\n}\n\ninterface AutoUpdateInstallationInfo {\n\tpackageManager: AutoUpdatePackageManager;\n\tnpmTag: string;\n\tupdateCommand: AutoUpdateInstallCommand | null;\n\tupdateTiming: \"startup\" | \"shutdown\";\n}\n\ninterface FetchLatestVersionInput {\n\tpackageName: string;\n\tnpmTag: string;\n}\n\nexport interface AutoUpdateStartupOptions {\n\tcurrentVersion: string;\n\tpackageName?: string;\n\tenv?: NodeJS.ProcessEnv;\n\targv?: string[];\n\tcwd?: string;\n\tresolveRealPath?: (path: string) => string;\n\tfetchLatestVersion?: (input: FetchLatestVersionInput) => Promise<string | null>;\n\tspawnUpdate?: (command: string, args: string[]) => void;\n\tscheduleShutdownUpdate?: (update: PendingShutdownAutoUpdate) => void;\n}\n\ninterface ParsedVersion {\n\tcore: number[];\n\tprerelease: Array<number | string> | null;\n}\n\ninterface PendingShutdownAutoUpdate {\n\tcommand: string;\n\targs: string[];\n\tlatestVersion: string;\n}\n\nconst DELETE_DIRECTORY_AFTER_DELAY_SCRIPT = `\nconst { rmSync } = require(\"node:fs\");\n\nconst targetDirectory = process.argv[1];\nif (!targetDirectory) {\n\tprocess.exit(0);\n}\n\nsetTimeout(() => {\n\ttry {\n\t\trmSync(targetDirectory, { recursive: true, force: true, maxRetries: 8, retryDelay: 250 });\n\t} catch {}\n}, 750);\n`.trim();\n\nlet pendingShutdownAutoUpdate: PendingShutdownAutoUpdate | null = null;\n\nfunction toPosixLowerPath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nfunction toPosixPath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction isPathInside(targetPath: string, containerPath: string): boolean {\n\tconst normalizedTarget = toPosixLowerPath(resolve(targetPath));\n\tconst normalizedContainer = toPosixLowerPath(resolve(containerPath));\n\tif (normalizedTarget === normalizedContainer) {\n\t\treturn true;\n\t}\n\treturn normalizedTarget.startsWith(`${normalizedContainer}/`);\n}\n\nfunction isNightlyVersion(version: string): boolean {\n\treturn version.includes(\"-nightly.\");\n}\n\nfunction getNpmTag(currentVersion: string): string {\n\treturn isNightlyVersion(currentVersion) ? \"nightly\" : \"latest\";\n}\n\nfunction parseVersion(version: string): ParsedVersion {\n\tconst versionWithoutBuild = version.split(\"+\", 1)[0] ?? \"\";\n\tconst [corePart, prereleasePart] = versionWithoutBuild.split(\"-\", 2);\n\tconst core = corePart\n\t\t.split(\".\")\n\t\t.filter((part) => part.length > 0)\n\t\t.map((part) => Number.parseInt(part, 10));\n\tconst prerelease = prereleasePart\n\t\t? prereleasePart\n\t\t\t\t.split(\".\")\n\t\t\t\t.filter((part) => part.length > 0)\n\t\t\t\t.map((part) => (/^\\d+$/u.test(part) ? Number.parseInt(part, 10) : part))\n\t\t: null;\n\treturn {\n\t\tcore,\n\t\tprerelease,\n\t};\n}\n\nfunction buildShutdownCacheRefreshCommand(cacheDirectory: string): AutoUpdateInstallCommand {\n\treturn {\n\t\tcommand: process.execPath,\n\t\targs: [\"-e\", DELETE_DIRECTORY_AFTER_DELAY_SCRIPT, cacheDirectory],\n\t};\n}\n\nfunction splitResolvedPath(path: string): {\n\thasLeadingSlash: boolean;\n\tsegments: string[];\n\tnormalizedSegments: string[];\n} {\n\tconst resolvedPath = toPosixPath(resolve(path));\n\tconst hasLeadingSlash = resolvedPath.startsWith(\"/\");\n\tconst segments = resolvedPath.split(\"/\").filter((_segment, index) => !(hasLeadingSlash && index === 0));\n\treturn {\n\t\thasLeadingSlash,\n\t\tsegments,\n\t\tnormalizedSegments: segments.map((segment) => segment.toLowerCase()),\n\t};\n}\n\nfunction buildDirectoryFromSegments(segments: string[], hasLeadingSlash: boolean, endIndex: number): string | null {\n\tif (endIndex <= 0 || segments.length < endIndex) {\n\t\treturn null;\n\t}\n\tconst directory = segments.slice(0, endIndex).join(\"/\");\n\tif (directory.length === 0) {\n\t\treturn null;\n\t}\n\treturn hasLeadingSlash ? `/${directory}` : directory;\n}\n\nfunction findSegmentSequence(segments: string[], sequence: string[]): number {\n\tif (sequence.length === 0 || segments.length < sequence.length) {\n\t\treturn -1;\n\t}\n\n\tfor (let index = 0; index <= segments.length - sequence.length; index += 1) {\n\t\tlet matches = true;\n\t\tfor (let offset = 0; offset < sequence.length; offset += 1) {\n\t\t\tif (segments[index + offset] !== sequence[offset]) {\n\t\t\t\tmatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matches) {\n\t\t\treturn index;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nfunction extractDirectoryForSegmentSequence(\n\tentrypointPath: string,\n\tsequences: string[][],\n\ttrailingSegmentCount: number,\n): string | null {\n\tconst { hasLeadingSlash, segments, normalizedSegments } = splitResolvedPath(entrypointPath);\n\n\tfor (const sequence of sequences) {\n\t\tconst sequenceIndex = findSegmentSequence(normalizedSegments, sequence);\n\t\tif (sequenceIndex < 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst endIndex = sequenceIndex + sequence.length + trailingSegmentCount;\n\t\tconst requiredSegments = normalizedSegments.slice(sequenceIndex + sequence.length, endIndex);\n\t\tif (\n\t\t\trequiredSegments.length !== trailingSegmentCount ||\n\t\t\trequiredSegments.some(\n\t\t\t\t(segment) => segment.length === 0 || segment === \".\" || segment === \"..\" || segment === \"node_modules\",\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst directory = buildDirectoryFromSegments(segments, hasLeadingSlash, endIndex);\n\t\tif (directory) {\n\t\t\treturn directory;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction extractDirectoryForSegmentPattern(entrypointPath: string, pattern: RegExp): string | null {\n\tconst { hasLeadingSlash, segments, normalizedSegments } = splitResolvedPath(entrypointPath);\n\tconst matchingIndex = normalizedSegments.findIndex((segment) => pattern.test(segment));\n\treturn buildDirectoryFromSegments(segments, hasLeadingSlash, matchingIndex + 1);\n}\n\nfunction looksLikeTransientCachePath(path: string): boolean {\n\tconst normalizedPath = toPosixLowerPath(path);\n\treturn (\n\t\tnormalizedPath.includes(\"/.npm/_npx/\") ||\n\t\tnormalizedPath.includes(\"/npm/_npx/\") ||\n\t\tnormalizedPath.includes(\"/.npx/\") ||\n\t\tnormalizedPath.includes(\"/pnpm/dlx/\") ||\n\t\tnormalizedPath.includes(\"/.yarn/cache/\") ||\n\t\tnormalizedPath.includes(\"/bunx-\")\n\t);\n}\n\nfunction detectTransientAutoUpdateInstallation(options: {\n\tcurrentVersion: string;\n\tpackageName: string;\n\tentrypointPath: string;\n}): AutoUpdateInstallationInfo | null {\n\tconst npmTag = getNpmTag(options.currentVersion);\n\tconst normalizedPath = toPosixLowerPath(options.entrypointPath);\n\n\tif (!normalizedPath.includes(`/node_modules/${options.packageName.toLowerCase()}/`)) {\n\t\treturn null;\n\t}\n\n\tconst npxCacheDirectory = extractDirectoryForSegmentSequence(\n\t\toptions.entrypointPath,\n\t\t[[\".npm\", \"_npx\"], [\"npm\", \"_npx\"], [\".npx\"]],\n\t\t1,\n\t);\n\tif (npxCacheDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.NPX,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(npxCacheDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\tconst pnpmDlxCacheDirectory = extractDirectoryForSegmentSequence(options.entrypointPath, [[\"pnpm\", \"dlx\"]], 2);\n\tif (pnpmDlxCacheDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.PNPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(pnpmDlxCacheDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\tconst yarnDlxDirectory = extractDirectoryForSegmentPattern(options.entrypointPath, /^dlx-\\d+$/u);\n\tif (yarnDlxDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.YARN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(yarnDlxDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\tconst bunxDirectory = extractDirectoryForSegmentPattern(options.entrypointPath, /^bunx-/u);\n\tif (bunxDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.BUN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(bunxDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\treturn null;\n}\n\nfunction comparePrereleaseParts(left: Array<number | string> | null, right: Array<number | string> | null): number {\n\tif (!left && !right) {\n\t\treturn 0;\n\t}\n\tif (!left) {\n\t\treturn 1;\n\t}\n\tif (!right) {\n\t\treturn -1;\n\t}\n\n\tconst length = Math.max(left.length, right.length);\n\tfor (let index = 0; index < length; index += 1) {\n\t\tconst leftPart = left[index];\n\t\tconst rightPart = right[index];\n\t\tif (leftPart === undefined && rightPart === undefined) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (leftPart === undefined) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (rightPart === undefined) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (leftPart === rightPart) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof leftPart === \"number\" && typeof rightPart === \"number\") {\n\t\t\treturn leftPart > rightPart ? 1 : -1;\n\t\t}\n\t\tif (typeof leftPart === \"number\") {\n\t\t\treturn -1;\n\t\t}\n\t\tif (typeof rightPart === \"number\") {\n\t\t\treturn 1;\n\t\t}\n\t\treturn leftPart.localeCompare(rightPart);\n\t}\n\treturn 0;\n}\n\nexport function compareVersions(leftVersion: string, rightVersion: string): number {\n\tconst left = parseVersion(leftVersion);\n\tconst right = parseVersion(rightVersion);\n\tconst length = Math.max(left.core.length, right.core.length);\n\tfor (let index = 0; index < length; index += 1) {\n\t\tconst leftPart = left.core[index] ?? 0;\n\t\tconst rightPart = right.core[index] ?? 0;\n\t\tif (leftPart > rightPart) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (leftPart < rightPart) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn comparePrereleaseParts(left.prerelease, right.prerelease);\n}\n\nexport function detectAutoUpdateInstallation(options: {\n\tcurrentVersion: string;\n\tpackageName: string;\n\tentrypointPath: string;\n\tcwd: string;\n}): AutoUpdateInstallationInfo {\n\tconst normalizedPath = toPosixLowerPath(options.entrypointPath);\n\tconst npmTag = getNpmTag(options.currentVersion);\n\n\tif (isPathInside(options.entrypointPath, options.cwd)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.LOCAL,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: null,\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tconst transientInstallation = detectTransientAutoUpdateInstallation({\n\t\tcurrentVersion: options.currentVersion,\n\t\tpackageName: options.packageName,\n\t\tentrypointPath: options.entrypointPath,\n\t});\n\tif (transientInstallation) {\n\t\treturn transientInstallation;\n\t}\n\n\tif (looksLikeTransientCachePath(options.entrypointPath)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.UNKNOWN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: null,\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(\"/.pnpm/global/\") || normalizedPath.includes(\"/pnpm/global/\")) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.PNPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"pnpm\",\n\t\t\t\targs: [\"add\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(\"/.yarn/\") || normalizedPath.includes(\"/yarn/global/\")) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.YARN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"yarn\",\n\t\t\t\targs: [\"global\", \"add\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(\"/.bun/bin/\")) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.BUN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"bun\",\n\t\t\t\targs: [\"add\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(`/lib/node_modules/${options.packageName}/`)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.NPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"npm\",\n\t\t\t\targs: [\"install\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(`/node_modules/${options.packageName}/`)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.NPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"npm\",\n\t\t\t\targs: [\"install\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\treturn {\n\t\tpackageManager: AutoUpdatePackageManager.UNKNOWN,\n\t\tnpmTag,\n\t\tupdateCommand: null,\n\t\tupdateTiming: \"startup\",\n\t};\n}\n\nfunction isAutoUpdateDisabled(env: NodeJS.ProcessEnv): boolean {\n\tif (env.KANBAN_NO_AUTO_UPDATE === \"1\") {\n\t\treturn true;\n\t}\n\tif (env.NODE_ENV === \"test\" || env.VITEST === \"true\") {\n\t\treturn true;\n\t}\n\tif (env.CI === \"true\") {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersionFromRegistry(input: FetchLatestVersionInput): Promise<string | null> {\n\ttry {\n\t\tconst response = await fetch(`https://registry.npmjs.org/${input.packageName}/${input.npmTag}`, {\n\t\t\tsignal: AbortSignal.timeout(2_500),\n\t\t});\n\t\tif (!response.ok) {\n\t\t\treturn null;\n\t\t}\n\t\tconst payload = (await response.json()) as unknown;\n\t\tif (!payload || typeof payload !== \"object\") {\n\t\t\treturn null;\n\t\t}\n\t\tconst version = (payload as { version?: unknown }).version;\n\t\tif (typeof version !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\t\tconst normalized = version.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction spawnDetachedUpdate(command: string, args: string[]): void {\n\tconst child = spawn(command, args, {\n\t\tdetached: true,\n\t\tstdio: \"ignore\",\n\t\tenv: process.env,\n\t\twindowsHide: true,\n\t});\n\tchild.unref();\n}\n\nfunction schedulePendingShutdownAutoUpdate(update: PendingShutdownAutoUpdate): void {\n\tpendingShutdownAutoUpdate = update;\n}\n\nexport function runPendingAutoUpdateOnShutdown(options?: {\n\tspawnUpdate?: (command: string, args: string[]) => void;\n\tlog?: (message: string) => void;\n}): void {\n\tif (!pendingShutdownAutoUpdate) {\n\t\treturn;\n\t}\n\n\tconst pendingUpdate = pendingShutdownAutoUpdate;\n\tpendingShutdownAutoUpdate = null;\n\n\tconst log = options?.log ?? console.log;\n\tlog(`New version ${pendingUpdate.latestVersion} detected. Refreshing cached Kanban for next launch.`);\n\n\tconst spawnUpdate = options?.spawnUpdate ?? spawnDetachedUpdate;\n\tspawnUpdate(pendingUpdate.command, pendingUpdate.args);\n}\n\nexport async function runAutoUpdateCheck(options: AutoUpdateStartupOptions): Promise<void> {\n\tconst env = options.env ?? process.env;\n\tif (isAutoUpdateDisabled(env)) {\n\t\treturn;\n\t}\n\n\tconst entrypointArg = options.argv?.[1] ?? process.argv[1];\n\tif (!entrypointArg) {\n\t\treturn;\n\t}\n\n\tconst resolveRealPath = options.resolveRealPath ?? ((path: string) => realpathSync(path));\n\tlet entrypointPath: string;\n\ttry {\n\t\tentrypointPath = resolveRealPath(entrypointArg);\n\t} catch {\n\t\treturn;\n\t}\n\n\tconst packageName = options.packageName ?? \"kanban\";\n\tconst installation = detectAutoUpdateInstallation({\n\t\tcurrentVersion: options.currentVersion,\n\t\tpackageName,\n\t\tentrypointPath,\n\t\tcwd: options.cwd ?? process.cwd(),\n\t});\n\tif (!installation.updateCommand) {\n\t\treturn;\n\t}\n\n\tconst fetchLatestVersion = options.fetchLatestVersion ?? fetchLatestVersionFromRegistry;\n\tconst spawnUpdate = options.spawnUpdate ?? spawnDetachedUpdate;\n\tconst scheduleShutdownUpdate = options.scheduleShutdownUpdate ?? schedulePendingShutdownAutoUpdate;\n\n\ttry {\n\t\tconst latestVersion = await fetchLatestVersion({\n\t\t\tpackageName,\n\t\t\tnpmTag: installation.npmTag,\n\t\t});\n\n\t\tif (!latestVersion || compareVersions(options.currentVersion, latestVersion) >= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (installation.updateTiming === \"shutdown\") {\n\t\t\tscheduleShutdownUpdate({\n\t\t\t\tcommand: installation.updateCommand.command,\n\t\t\t\targs: installation.updateCommand.args,\n\t\t\t\tlatestVersion,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tspawnUpdate(installation.updateCommand.command, installation.updateCommand.args);\n\t} catch {\n\t\treturn;\n\t}\n}\n\nexport function autoUpdateOnStartup(options: AutoUpdateStartupOptions): void {\n\tvoid runAutoUpdateCheck(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/update/auto-update.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport enum AutoUpdatePackageManager {\n\tNPM = \"npm\",\n\tPNPM = \"pnpm\",\n\tYARN = \"yarn\",\n\tBUN = \"bun\",\n\tNPX = \"npx\",\n\tLOCAL = \"local\",\n\tUNKNOWN = \"unknown\",\n}\n\ninterface AutoUpdateInstallCommand {\n\tcommand: string;\n\targs: string[];\n}\n\ninterface AutoUpdateInstallationInfo {\n\tpackageManager: AutoUpdatePackageManager;\n\tnpmTag: string;\n\tupdateCommand: AutoUpdateInstallCommand | null;\n\tupdateTiming: \"startup\" | \"shutdown\";\n}\n\ninterface FetchLatestVersionInput {\n\tpackageName: string;\n\tnpmTag: string;\n}\n\nexport interface AutoUpdateStartupOptions {\n\tcurrentVersion: string;\n\tpackageName?: string;\n\tenv?: NodeJS.ProcessEnv;\n\targv?: string[];\n\tcwd?: string;\n\tresolveRealPath?: (path: string) => string;\n\tfetchLatestVersion?: (input: FetchLatestVersionInput) => Promise<string | null>;\n\tspawnUpdate?: (command: string, args: string[]) => void;\n\tscheduleShutdownUpdate?: (update: PendingShutdownAutoUpdate) => void;\n}\n\ninterface ParsedVersion {\n\tcore: number[];\n\tprerelease: Array<number | string> | null;\n}\n\ninterface PendingShutdownAutoUpdate {\n\tcommand: string;\n\targs: string[];\n\tlatestVersion: string;\n}\n\nconst DELETE_DIRECTORY_AFTER_DELAY_SCRIPT = `\nconst { rmSync } = require(\"node:fs\");\n\nconst targetDirectory = process.argv[1];\nif (!targetDirectory) {\n\tprocess.exit(0);\n}\n\nsetTimeout(() => {\n\ttry {\n\t\trmSync(targetDirectory, { recursive: true, force: true, maxRetries: 8, retryDelay: 250 });\n\t} catch {}\n}, 750);\n`.trim();\n\nlet pendingShutdownAutoUpdate: PendingShutdownAutoUpdate | null = null;\n\nfunction toPosixLowerPath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nfunction toPosixPath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction isPathInside(targetPath: string, containerPath: string): boolean {\n\tconst normalizedTarget = toPosixLowerPath(resolve(targetPath));\n\tconst normalizedContainer = toPosixLowerPath(resolve(containerPath));\n\tif (normalizedTarget === normalizedContainer) {\n\t\treturn true;\n\t}\n\treturn normalizedTarget.startsWith(`${normalizedContainer}/`);\n}\n\nfunction isNightlyVersion(version: string): boolean {\n\treturn version.includes(\"-nightly.\");\n}\n\nfunction getNpmTag(currentVersion: string): string {\n\treturn isNightlyVersion(currentVersion) ? \"nightly\" : \"latest\";\n}\n\nfunction parseVersion(version: string): ParsedVersion {\n\tconst versionWithoutBuild = version.split(\"+\", 1)[0] ?? \"\";\n\tconst [corePart, prereleasePart] = versionWithoutBuild.split(\"-\", 2);\n\tconst core = corePart\n\t\t.split(\".\")\n\t\t.filter((part) => part.length > 0)\n\t\t.map((part) => Number.parseInt(part, 10));\n\tconst prerelease = prereleasePart\n\t\t? prereleasePart\n\t\t\t\t.split(\".\")\n\t\t\t\t.filter((part) => part.length > 0)\n\t\t\t\t.map((part) => (/^\\d+$/u.test(part) ? Number.parseInt(part, 10) : part))\n\t\t: null;\n\treturn {\n\t\tcore,\n\t\tprerelease,\n\t};\n}\n\nfunction buildShutdownCacheRefreshCommand(cacheDirectory: string): AutoUpdateInstallCommand {\n\treturn {\n\t\tcommand: process.execPath,\n\t\targs: [\"-e\", DELETE_DIRECTORY_AFTER_DELAY_SCRIPT, cacheDirectory],\n\t};\n}\n\nfunction splitResolvedPath(path: string): {\n\thasLeadingSlash: boolean;\n\tsegments: string[];\n\tnormalizedSegments: string[];\n} {\n\tconst resolvedPath = toPosixPath(resolve(path));\n\tconst hasLeadingSlash = resolvedPath.startsWith(\"/\");\n\tconst segments = resolvedPath.split(\"/\").filter((_segment, index) => !(hasLeadingSlash && index === 0));\n\treturn {\n\t\thasLeadingSlash,\n\t\tsegments,\n\t\tnormalizedSegments: segments.map((segment) => segment.toLowerCase()),\n\t};\n}\n\nfunction buildDirectoryFromSegments(segments: string[], hasLeadingSlash: boolean, endIndex: number): string | null {\n\tif (endIndex <= 0 || segments.length < endIndex) {\n\t\treturn null;\n\t}\n\tconst directory = segments.slice(0, endIndex).join(\"/\");\n\tif (directory.length === 0) {\n\t\treturn null;\n\t}\n\treturn hasLeadingSlash ? `/${directory}` : directory;\n}\n\nfunction findSegmentSequence(segments: string[], sequence: string[]): number {\n\tif (sequence.length === 0 || segments.length < sequence.length) {\n\t\treturn -1;\n\t}\n\n\tfor (let index = 0; index <= segments.length - sequence.length; index += 1) {\n\t\tlet matches = true;\n\t\tfor (let offset = 0; offset < sequence.length; offset += 1) {\n\t\t\tif (segments[index + offset] !== sequence[offset]) {\n\t\t\t\tmatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matches) {\n\t\t\treturn index;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nfunction extractDirectoryForSegmentSequence(\n\tentrypointPath: string,\n\tsequences: string[][],\n\ttrailingSegmentCount: number,\n): string | null {\n\tconst { hasLeadingSlash, segments, normalizedSegments } = splitResolvedPath(entrypointPath);\n\n\tfor (const sequence of sequences) {\n\t\tconst sequenceIndex = findSegmentSequence(normalizedSegments, sequence);\n\t\tif (sequenceIndex < 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst endIndex = sequenceIndex + sequence.length + trailingSegmentCount;\n\t\tconst requiredSegments = normalizedSegments.slice(sequenceIndex + sequence.length, endIndex);\n\t\tif (\n\t\t\trequiredSegments.length !== trailingSegmentCount ||\n\t\t\trequiredSegments.some(\n\t\t\t\t(segment) => segment.length === 0 || segment === \".\" || segment === \"..\" || segment === \"node_modules\",\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst directory = buildDirectoryFromSegments(segments, hasLeadingSlash, endIndex);\n\t\tif (directory) {\n\t\t\treturn directory;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction extractDirectoryForSegmentPattern(entrypointPath: string, pattern: RegExp): string | null {\n\tconst { hasLeadingSlash, segments, normalizedSegments } = splitResolvedPath(entrypointPath);\n\tconst matchingIndex = normalizedSegments.findIndex((segment) => pattern.test(segment));\n\treturn buildDirectoryFromSegments(segments, hasLeadingSlash, matchingIndex + 1);\n}\n\nfunction looksLikeTransientCachePath(path: string): boolean {\n\tconst normalizedPath = toPosixLowerPath(path);\n\treturn (\n\t\tnormalizedPath.includes(\"/.npm/_npx/\") ||\n\t\tnormalizedPath.includes(\"/npm/_npx/\") ||\n\t\tnormalizedPath.includes(\"/npm-cache/_npx/\") ||\n\t\tnormalizedPath.includes(\"/.npx/\") ||\n\t\tnormalizedPath.includes(\"/pnpm/dlx/\") ||\n\t\tnormalizedPath.includes(\"/.yarn/cache/\") ||\n\t\tnormalizedPath.includes(\"/bunx-\")\n\t);\n}\n\nfunction detectTransientAutoUpdateInstallation(options: {\n\tcurrentVersion: string;\n\tpackageName: string;\n\tentrypointPath: string;\n}): AutoUpdateInstallationInfo | null {\n\tconst npmTag = getNpmTag(options.currentVersion);\n\tconst normalizedPath = toPosixLowerPath(options.entrypointPath);\n\n\tif (!normalizedPath.includes(`/node_modules/${options.packageName.toLowerCase()}/`)) {\n\t\treturn null;\n\t}\n\n\tconst npxCacheDirectory = extractDirectoryForSegmentSequence(\n\t\toptions.entrypointPath,\n\t\t[[\".npm\", \"_npx\"], [\"npm\", \"_npx\"], [\"npm-cache\", \"_npx\"], [\".npx\"]],\n\t\t1,\n\t);\n\tif (npxCacheDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.NPX,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(npxCacheDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\tconst pnpmDlxCacheDirectory = extractDirectoryForSegmentSequence(options.entrypointPath, [[\"pnpm\", \"dlx\"]], 2);\n\tif (pnpmDlxCacheDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.PNPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(pnpmDlxCacheDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\tconst yarnDlxDirectory = extractDirectoryForSegmentPattern(options.entrypointPath, /^dlx-\\d+$/u);\n\tif (yarnDlxDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.YARN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(yarnDlxDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\tconst bunxDirectory = extractDirectoryForSegmentPattern(options.entrypointPath, /^bunx-/u);\n\tif (bunxDirectory) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.BUN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: buildShutdownCacheRefreshCommand(bunxDirectory),\n\t\t\tupdateTiming: \"shutdown\",\n\t\t};\n\t}\n\n\treturn null;\n}\n\nfunction comparePrereleaseParts(left: Array<number | string> | null, right: Array<number | string> | null): number {\n\tif (!left && !right) {\n\t\treturn 0;\n\t}\n\tif (!left) {\n\t\treturn 1;\n\t}\n\tif (!right) {\n\t\treturn -1;\n\t}\n\n\tconst length = Math.max(left.length, right.length);\n\tfor (let index = 0; index < length; index += 1) {\n\t\tconst leftPart = left[index];\n\t\tconst rightPart = right[index];\n\t\tif (leftPart === undefined && rightPart === undefined) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (leftPart === undefined) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (rightPart === undefined) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (leftPart === rightPart) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof leftPart === \"number\" && typeof rightPart === \"number\") {\n\t\t\treturn leftPart > rightPart ? 1 : -1;\n\t\t}\n\t\tif (typeof leftPart === \"number\") {\n\t\t\treturn -1;\n\t\t}\n\t\tif (typeof rightPart === \"number\") {\n\t\t\treturn 1;\n\t\t}\n\t\treturn leftPart.localeCompare(rightPart);\n\t}\n\treturn 0;\n}\n\nexport function compareVersions(leftVersion: string, rightVersion: string): number {\n\tconst left = parseVersion(leftVersion);\n\tconst right = parseVersion(rightVersion);\n\tconst length = Math.max(left.core.length, right.core.length);\n\tfor (let index = 0; index < length; index += 1) {\n\t\tconst leftPart = left.core[index] ?? 0;\n\t\tconst rightPart = right.core[index] ?? 0;\n\t\tif (leftPart > rightPart) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (leftPart < rightPart) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn comparePrereleaseParts(left.prerelease, right.prerelease);\n}\n\nexport function detectAutoUpdateInstallation(options: {\n\tcurrentVersion: string;\n\tpackageName: string;\n\tentrypointPath: string;\n\tcwd: string;\n}): AutoUpdateInstallationInfo {\n\tconst normalizedPath = toPosixLowerPath(options.entrypointPath);\n\tconst npmTag = getNpmTag(options.currentVersion);\n\n\tif (isPathInside(options.entrypointPath, options.cwd)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.LOCAL,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: null,\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tconst transientInstallation = detectTransientAutoUpdateInstallation({\n\t\tcurrentVersion: options.currentVersion,\n\t\tpackageName: options.packageName,\n\t\tentrypointPath: options.entrypointPath,\n\t});\n\tif (transientInstallation) {\n\t\treturn transientInstallation;\n\t}\n\n\tif (looksLikeTransientCachePath(options.entrypointPath)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.UNKNOWN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: null,\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(\"/.pnpm/global/\") || normalizedPath.includes(\"/pnpm/global/\")) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.PNPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"pnpm\",\n\t\t\t\targs: [\"add\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(\"/.yarn/\") || normalizedPath.includes(\"/yarn/global/\")) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.YARN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"yarn\",\n\t\t\t\targs: [\"global\", \"add\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(\"/.bun/bin/\")) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.BUN,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"bun\",\n\t\t\t\targs: [\"add\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(`/lib/node_modules/${options.packageName}/`)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.NPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"npm\",\n\t\t\t\targs: [\"install\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\tif (normalizedPath.includes(`/node_modules/${options.packageName}/`)) {\n\t\treturn {\n\t\t\tpackageManager: AutoUpdatePackageManager.NPM,\n\t\t\tnpmTag,\n\t\t\tupdateCommand: {\n\t\t\t\tcommand: \"npm\",\n\t\t\t\targs: [\"install\", \"-g\", `${options.packageName}@${npmTag}`],\n\t\t\t},\n\t\t\tupdateTiming: \"startup\",\n\t\t};\n\t}\n\n\treturn {\n\t\tpackageManager: AutoUpdatePackageManager.UNKNOWN,\n\t\tnpmTag,\n\t\tupdateCommand: null,\n\t\tupdateTiming: \"startup\",\n\t};\n}\n\nfunction isAutoUpdateDisabled(env: NodeJS.ProcessEnv): boolean {\n\tif (env.KANBAN_NO_AUTO_UPDATE === \"1\") {\n\t\treturn true;\n\t}\n\tif (env.NODE_ENV === \"test\" || env.VITEST === \"true\") {\n\t\treturn true;\n\t}\n\tif (env.CI === \"true\") {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersionFromRegistry(input: FetchLatestVersionInput): Promise<string | null> {\n\ttry {\n\t\tconst response = await fetch(`https://registry.npmjs.org/${input.packageName}/${input.npmTag}`, {\n\t\t\tsignal: AbortSignal.timeout(2_500),\n\t\t});\n\t\tif (!response.ok) {\n\t\t\treturn null;\n\t\t}\n\t\tconst payload = (await response.json()) as unknown;\n\t\tif (!payload || typeof payload !== \"object\") {\n\t\t\treturn null;\n\t\t}\n\t\tconst version = (payload as { version?: unknown }).version;\n\t\tif (typeof version !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\t\tconst normalized = version.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction spawnDetachedUpdate(command: string, args: string[]): void {\n\tconst child = spawn(command, args, {\n\t\tdetached: true,\n\t\tstdio: \"ignore\",\n\t\tenv: process.env,\n\t\twindowsHide: true,\n\t});\n\tchild.unref();\n}\n\nfunction schedulePendingShutdownAutoUpdate(update: PendingShutdownAutoUpdate): void {\n\tpendingShutdownAutoUpdate = update;\n}\n\nexport function runPendingAutoUpdateOnShutdown(options?: {\n\tspawnUpdate?: (command: string, args: string[]) => void;\n\tlog?: (message: string) => void;\n}): void {\n\tif (!pendingShutdownAutoUpdate) {\n\t\treturn;\n\t}\n\n\tconst pendingUpdate = pendingShutdownAutoUpdate;\n\tpendingShutdownAutoUpdate = null;\n\n\tconst log = options?.log ?? console.log;\n\tlog(`New version ${pendingUpdate.latestVersion} detected. Refreshing cached Kanban for next launch.`);\n\n\tconst spawnUpdate = options?.spawnUpdate ?? spawnDetachedUpdate;\n\tspawnUpdate(pendingUpdate.command, pendingUpdate.args);\n}\n\nexport async function runAutoUpdateCheck(options: AutoUpdateStartupOptions): Promise<void> {\n\tconst env = options.env ?? process.env;\n\tif (isAutoUpdateDisabled(env)) {\n\t\treturn;\n\t}\n\n\tconst entrypointArg = options.argv?.[1] ?? process.argv[1];\n\tif (!entrypointArg) {\n\t\treturn;\n\t}\n\n\tconst resolveRealPath = options.resolveRealPath ?? ((path: string) => realpathSync(path));\n\tlet entrypointPath: string;\n\ttry {\n\t\tentrypointPath = resolveRealPath(entrypointArg);\n\t} catch {\n\t\treturn;\n\t}\n\n\tconst packageName = options.packageName ?? \"kanban\";\n\tconst installation = detectAutoUpdateInstallation({\n\t\tcurrentVersion: options.currentVersion,\n\t\tpackageName,\n\t\tentrypointPath,\n\t\tcwd: options.cwd ?? process.cwd(),\n\t});\n\tif (!installation.updateCommand) {\n\t\treturn;\n\t}\n\n\tconst fetchLatestVersion = options.fetchLatestVersion ?? fetchLatestVersionFromRegistry;\n\tconst spawnUpdate = options.spawnUpdate ?? spawnDetachedUpdate;\n\tconst scheduleShutdownUpdate = options.scheduleShutdownUpdate ?? schedulePendingShutdownAutoUpdate;\n\n\ttry {\n\t\tconst latestVersion = await fetchLatestVersion({\n\t\t\tpackageName,\n\t\t\tnpmTag: installation.npmTag,\n\t\t});\n\n\t\tif (!latestVersion || compareVersions(options.currentVersion, latestVersion) >= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (installation.updateTiming === \"shutdown\") {\n\t\t\tscheduleShutdownUpdate({\n\t\t\t\tcommand: installation.updateCommand.command,\n\t\t\t\targs: installation.updateCommand.args,\n\t\t\t\tlatestVersion,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tspawnUpdate(installation.updateCommand.command, installation.updateCommand.args);\n\t} catch {\n\t\treturn;\n\t}\n}\n\nexport function autoUpdateOnStartup(options: AutoUpdateStartupOptions): void {\n\tvoid runAutoUpdateCheck(options);\n}\n"]}
|