{"id":"task-link","repo":"panrafal/paseo-plugins","url":"https://github.com/panrafal/paseo-plugins/tree/main/task-link","name":"task-link","description":"Composer pill that opens a task link when a branch, title, or workspace name matches a configurable pattern.","categories":["productivity"],"platforms":[],"caveats":["Shipped default matches CT-1234 Notion links; change the pattern and URL in settings first"],"images":["https://raw.githubusercontent.com/panrafal/paseo-plugins/004c6a80c6aa8e76bb563694c3eee5c2c0b0466f/task-link/images/task-link-settings.png"],"themes":[],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":true,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-10-15T12:34:45.582Z","addedAt":"2026-09-10T11:29:03+03:00","path":"task-link","version":"0.1.0","security":{"status":"failed","blockingFindings":1,"advisoryFindings":0,"scannedAt":"2026-10-15T12:14:24.405Z","commit":"004c6a80c6aa8e76bb563694c3eee5c2c0b0466f"},"author":"panrafal","license":"MIT","paseoVersionRequirement":">=0.7.2-0","descriptionNodes":[{"type":"text","text":"Composer pill that opens a task link when a branch, title, or workspace name matches a configurable pattern."}],"caveatNodes":[[{"type":"text","text":"Shipped default matches CT-1234 Notion links; change the pattern and URL in settings first"}]],"manifest":{"id":"task-link","requirements":{"paseo":">=0.7.2-0"}},"repoMeta":{"stars":6,"defaultBranch":"main","pushedAt":"2026-10-15T04:33:35Z"},"owner":{"login":"panrafal","avatarUrl":"https://avatars.githubusercontent.com/u/1268900?v=4"},"installNotesHtml":"<pre><code class=\"language-bash\">paseo plugin add panrafal/paseo-plugins:task-link\n</code></pre>\n<p>From a checkout:</p>\n<pre><code class=\"language-bash\">npm install            # from the monorepo root\nnpm run typecheck\npaseo plugin install /absolute/path/to/paseo-plugins/task-link\npaseo plugin ls        # expect \"running\"\n</code></pre>\n<p>When replacing an installed <code>capitally-tasks</code>, remove that old installation and install <code>task-link</code>\nfrom its renamed directory to avoid duplicate pills. The old plugin had no saved settings.</p>\n<p>After editing:</p>\n<pre><code class=\"language-bash\">npm run typecheck\nnpm test --workspace=task-link\npaseo plugin reload task-link\npaseo plugin logs task-link\n</code></pre>","limitationsNotesHtml":"<ul>\n<li>The shipped default matches <code>CT-1234</code> style IDs and opens Notion. Change the pattern and URL\nin settings before relying on the pill.</li>\n<li>The native settings screen needs a Paseo client with <code>addSettingsScreen</code>, <code>openSettings</code>, and\n<code>@getpaseo/plugin/client/ui</code> support.</li>\n</ul>","readmeText":"# task-link\n\nAdds a composer pill when an agent's branch, title, or workspace name contains a task ID.\nPress the pill to open the configured link. Previously named `capitally-tasks`.\n\n![Task link settings](./images/task-link-settings.png)\n\n## Settings\n\nOpen **Settings → Plugins → task-link → Task link**, or choose **Configure task link** in the\nCommand Center. Requires a Paseo client with `addSettingsScreen`, `openSettings`, and\n`@getpaseo/plugin/client/ui` support. Paseo owns settings navigation, scrolling, mobile layout, and theme.\n\n- **Task regular expression**: a JavaScript pattern without `/` delimiters or flags. Matching is\n  case-sensitive; use character classes such as `[Cc][Tt]` to accept either case. For each match,\n  the first non-empty capture group, in group order, is the task ID. If there are no capture groups,\n  the whole match is used. Matches with only empty/unmatched groups are skipped.\n- **Task link**: an HTTP(S) URL containing `{ID}`. Every `{ID}` is replaced with the URL-encoded\n  captured text. Case and punctuation in the ID are preserved.\n- **Preview**: try a branch or title to inspect the extracted ID and destination before saving.\n\n| Pattern | Input | Task ID |\n| --- | --- | --- |\n| `\\b(CT-\\d+)\\b` | `feature/CT-1234-fix` | `CT-1234` |\n| `(\\[CT-\\d+\\])|-(ct-\\d+)` | `Fix [CT-1234]` | `[CT-1234]` |\n| `(\\[CT-\\d+\\])|-(ct-\\d+)` | `feature-ct-42` | `ct-42` |\n| `CT-(\\d+)` | `CT-1234` | `1234` |\n\nFor example, `https://tracker.example/tasks/{ID}` opens task `CT-1234` at\n`https://tracker.example/tasks/CT-1234`. A bracketed ID becomes `%5BCT-1234%5D`.\n\nDefaults match `\\b([Cc][Tt]-\\d+)\\b` and open `https://www.notion.so/{ID}`. Unlike the old plugin,\nIDs are no longer forced to uppercase.\n\nSettings use validated plugin RPCs and are saved atomically under\n`$PASEO_HOME/plugin-data/task-link/settings.json` (default Paseo home: `~/.paseo`). They are shared\nby clients of that daemon and survive plugin reloads. Saving updates this client's pills immediately;\nother clients refresh within 15 seconds and also read the latest settings before opening a link.\n\n## How it works\n\nSources are checked in this order: branch, agent title, workspace title, workspace name.\nWithin each source, matches are checked from left to right.\n\n- `shared/link.ts` extracts task IDs and builds links; `shared/settings.ts` validates settings.\n- `server/branch.ts` reads the checked-out branch with `git rev-parse --abbrev-ref HEAD`.\n- `client/pill.tsx` follows agent/workspace updates and refreshes branches after agent turns.\n- Pills disappear when no task matches or the agent is archived, and are removed on disconnect\n  or plugin reload along with subscriptions and the settings refresh timer.\n\n## Limitations\n\n- The shipped default matches `CT-1234` style IDs and opens Notion. Change the pattern and URL\n  in settings before relying on the pill.\n- The native settings screen needs a Paseo client with `addSettingsScreen`, `openSettings`, and\n  `@getpaseo/plugin/client/ui` support.\n\n## Install\n\n```bash\npaseo plugin add panrafal/paseo-plugins:task-link\n```\n\nFrom a checkout:\n\n```bash\nnpm install            # from the monorepo root\nnpm run typecheck\npaseo plugin install /absolute/path/to/paseo-plugins/task-link\npaseo plugin ls        # expect \"running\"\n```\n\nWhen replacing an installed `capitally-tasks`, remove that old installation and install `task-link`\nfrom its renamed directory to avoid duplicate pills. The old plugin had no saved settings.\n\nAfter editing:\n\n```bash\nnpm run typecheck\nnpm test --workspace=task-link\npaseo plugin reload task-link\npaseo plugin logs task-link\n```\n"}