{"id":95550,"plugin_id":"plugin_asdk_app_6ae189f951708191920e9f41269c8cde","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-13T18:12:13.862Z","digest":"0b114f058b516dc3bfdd014cd50f567d16d64def8b54c9b864271ce5dbc49d20","against":null,"payload":{"description":"Use when the user wants to track work or customers in Corsair: file, update or list issues and projects in Corsair's PM, or add and update people, companies, deals, notes and tasks in Corsair's CRM. Gives the action names and the usual lookups for both.","included_files":[],"name":"corsair-workspace","skill_md_contents":"---\nname: corsair-workspace\ndescription: Use when the user wants to track work or customers in Corsair: file, update or list issues and projects in Corsair's PM, or add and update people, companies, deals, notes and tasks in Corsair's CRM. Gives the action names and the usual lookups for both.\n---\n\n# Corsair's PM and CRM\n\nEvery Corsair link comes with two apps of Corsair's own. Their data lives in Corsair, so they work without any other app connected.\n\n- **PM** (`pm`): teams, projects, issues with a status, priority, assignee, labels and a due date, plus comments.\n- **CRM** (`crm`): people, companies and deals. A deal has a stage (Lead, In Progress, Won, Lost), a value, an owner and linked people and company. Any record can have notes and tasks.\n\nFind what's there with `search` first (\"what's open for the Kestrel pilot?\" finds the deal, its notes and tasks, and the PM issues that name it). Use `read_data` for complete lists and `run_script` for changes, as the corsair-data skill explains.\n\n## PM\n\n| To | Action |\n| --- | --- |\n| Look up teams, states, people, labels, projects | `pm.db.teams.search`, `pm.db.workflowStates.search`, `pm.db.users.search`, `pm.db.issueLabels.search`, `pm.db.projects.search` |\n| List or find issues | `pm.db.issues.search` (filter on `title`, `stateId`, `assigneeId`, `projectId`, `dueDate`) |\n| File an issue | `pm.api.issues.create`: `title`, and optionally `stateId`, `priority` (1 urgent, 2 high, 3 medium, 4 low), `assigneeId`, `dueDate` (YYYY-MM-DD), `projectId`, `labelIds` |\n| Change an issue | `pm.api.issues.update` with the issue's `id` |\n| Comment | `pm.api.comments.create` |\n\nIds come from the lookups, never from names: look up the state, label, project and member first, in the same script.\n\n```js\nconst [states, labels, projects, users] = await Promise.all([\n  corsair.pm.db.workflowStates.search({ limit: 50 }),\n  corsair.pm.db.issueLabels.search({ limit: 50 }),\n  corsair.pm.db.projects.search({ limit: 50 }),\n  corsair.pm.db.users.search({ limit: 50 }),\n]);\nconst todo = states.find((s) => s.name === 'Todo');\nconst bug = labels.find((l) => l.name === 'Bug');\nconst relaunch = projects.find((p) => p.name === 'Website relaunch');\nreturn await corsair.pm.api.issues.create({\n  title: 'Checkout button does nothing in Safari',\n  stateId: todo?.id, priority: 1, labelIds: bug ? [bug.id] : [], projectId: relaunch?.id,\n  assigneeId: users[0]?.id, dueDate: '2026-11-21',\n});\n```\n\n## CRM\n\n| To | Action |\n| --- | --- |\n| Find records | `crm.api.records.query` with `object` (`people`, `companies`, `deals`), and `q` for text or `filter` such as `{ stage: 'Lead' }` |\n| Add a record | `crm.api.records.create` with `object` and `values` (attribute slugs from `crm.api.attributes.list`) |\n| Change a record | `crm.api.records.patch` with `object`, `record_id`, `values`; a deal's stage takes the stage's title |\n| Notes | `crm.api.notes.create` with `record_id`, `title`, `content` |\n| Tasks | `crm.api.tasks.create` with `content`, `deadline`, `linked_records` |\n\nA record's values come back as lists of dated values; the current one has `active_until: null`.\n\nMoving a deal to Won or Lost, or deleting anything, changes the user's records: say what you'll change and do it only when they asked for it.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}