[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71DX40892HBHVPHY3184AWM":3,"skill-same:01M71DX40892HBHVPHY3184AWM":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":45,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M71DX40892HBHVPHY3184AWM","dm",null,"Send or read HQ Sync direct messages — inbox, 1:1 threads, channel history; also prompts, details, or scheduled notes to teammates.","indigoai-us\u002Fhq-core","indigoai-us","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F122242446?v=4","01M71DTQ5NGD10GT1Z7E6XKWC5","HQ","01M71DTQ6BKSYYBNC9RAKT3YDK",94,"MIT","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fdm\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"notes","threads","history","inbox","read","messages","send","sync","grep","scheduled","prompts","direct","channel","Bash","2026-11-10 10:12:30",false,"---\nname: dm\ndescription: Send or read HQ Sync direct messages — inbox, 1:1 threads, channel history; also prompts, details, or scheduled notes to teammates.\nallowed-tools: Bash(hq:*), Read, Glob, Grep\n---\n\n# \u002Fdm — Send or read an HQ direct message\n\nSend a person-to-person notification through HQ, **or read** DMs from the CLI.\nOn send, the recipient gets it as a macOS notification in their HQ Desktop App;\nif you attach agent context they get a one-click **Copy prompt** action, and if\nyou attach details they get an **Open details** window. You can DM yourself\n(note-to-self \u002F reminders).\n\n`hq dm` is **send and read**. The HQ Desktop App still surfaces live\nnotifications; the CLI can also list your inbox, open a 1:1 thread, and show\nchannel \u002F group history. You can only DM someone you share an active company\nwith.\n\n## Usage\n\n### Send\n\n```\nhq dm \u003Crecipient> \u003Cmessage> [options]\n```\n\n- `\u003Crecipient>` — one of:\n  - a teammate's **email** (e.g. `stefan@example.com`),\n  - a **personUid** (`prs_…`) or **agentUid** (`agt_…`),\n  - a bare **name** (e.g. `stefan` or `Stefan Walsh`) — resolved to the exact\n    email before sending (see **Resolve recipients** below),\n  - a **comma-separated list** of any of the above — this opens a **group DM**\n    (every token is resolved independently). Your own email = a note-to-self, or\n  - a **named channel** — bare (`vyg-dev`), hash form (`#vyg-dev`), or\n    `--channel \u003Cname>` (see `hq channels`).\n- `\u003Cmessage>` — the notification body (the headline the recipient sees). Required.\n\nOptions (1:1 DMs only — not channels\u002Fgroups):\n\n| Option | Effect |\n|---|---|\n| `--prompt \u003Ctext>` \u002F `--prompt-file \u003Cpath>` | Agent-context prompt the recipient can one-click copy into their own agent session. Only when present does the banner show **Copy prompt**. |\n| `--details \u003Ctext>` \u002F `--details-file \u003Cpath>` | Longer text shown in the recipient's **Open details** window. |\n| `--at \u003Ciso>` | Schedule delivery at an ISO8601 time (store-and-forward — arrives even if you're offline at that time). |\n| `--in \u003Cduration>` | Schedule after a relative delay: `30s`, `10m`, `2h`, `1d`. |\n\nAudience (every send: 1:1, group, channel):\n\n| Option | Effect |\n|---|---|\n| *(none)* | From a person login: `audience: human` for every recipient. From a bot or agent identity: `human` to a person, `agent` to an agent, group or channel. |\n| `--audience human` (alias `--for-human`) | The message is for a person. It shows in their conversation, with a small CLI chip. |\n| `--audience agent` or `both` | Bots and agents only. From a person login the CLI refuses it, and the server answers 403 `person_cannot_send_agent_message`. |\n\nPeople never send agent-tagged messages. A session running under a person's\nlogin sends human messages, including handoffs with `--prompt`. Only a bot or\nagent identity tags machine status as `agent`.\n\n### Read\n\nDMs can be **read from the CLI** (hq-cli ≥ 5.70). Prefer these when the user\nasks to check messages, open a thread, list unread, or pull channel history —\ndo **not** tell them DMs are receive-only in the desktop app.\n\n```\nhq dm inbox [options]\nhq dm thread|read \u003Cperson> [options]\nhq dm channel|history \u003Ctarget> [options]\n```\n\n| Command | Effect |\n|---|---|\n| `hq dm inbox` | List recent **incoming** DMs. |\n| `hq dm thread \u003Cperson>` (alias `read`) | Show the two-way 1:1 conversation with a person (email, `prs_…`, or `agt_…`). Oldest-first; marks their messages read unless `--no-ack`. |\n| `hq dm channel \u003Ctarget>` (alias `history`) | Show recent messages in a named channel or group DM — by name, `#name`, or a channel id from `hq channels`. |\n\nRead options:\n\n| Option | Where | Effect |\n|---|---|---|\n| `--limit \u003Cn>` | all | Max messages to fetch (server-capped). |\n| `--unread` | `inbox` | Show only unread messages. |\n| `--mark-read` | `inbox`, `channel` | Mark fetched inbox messages read \u002F advance the channel read marker. |\n| `--no-ack` | `thread` | Do **not** mark incoming messages as read. |\n| `--json` | all | Raw JSON instead of the list \u002F transcript. |\n\nExamples:\n\n```bash\n# Unread inbox\nhq dm inbox --unread\n\n# Mark the page read after listing\nhq dm inbox --mark-read\n\n# 1:1 thread (alias: hq dm read …)\nhq dm thread stefan@example.com\nhq dm read prs_abc123 --no-ack --limit 50\n\n# Channel \u002F group history (alias: hq dm history …)\nhq dm channel vyg-dev\nhq dm history \"#launch\" --mark-read\nhq dm channel chn_…          # unnamed group DM — id from `hq channels`\n\n# Machine-readable\nhq dm inbox --json\nhq dm thread stefan@example.com --json\n```\n\nFor a bare name on `thread`\u002F`read`, resolve with `hq people resolve` first (same\nrules as send) — the read path only accepts email \u002F personUid \u002F agentUid.\n\n## Steps (send)\n\n1. **Resolve intent.** From the user's request, pull the recipient(s), the\n   message body, and any agent prompt \u002F details \u002F schedule. If the user said\n   \"send my agent context\" or \"so their agent can act,\" put that in `--prompt`.\n   If they want a longer writeup, use `--details`. If they want to **read**\n   messages instead, skip to the Read commands above.\n\n2. **Resolve & confirm recipient emails — never send blind.** `hq dm` only\n   accepts an **email** or a **personUid** — it does NOT look up names. So before\n   sending, turn every recipient token into a **confirmed** email. First split\n   the recipient on commas (a comma means a group DM); then resolve **each token\n   independently**:\n\n   - **Fast path — already an email or personUid → use it verbatim.** If the\n     token contains `@` (an email) or starts with `prs_` (a personUid), pass it\n     through unchanged. Do NOT look it up. This keeps every existing\n     email\u002FpersonUid invocation working exactly as before.\n\n   - **Name → resolve with `hq people resolve` (confirm before sending).**\n     Otherwise treat the token as a name and resolve it through the built-in\n     people lookup (hq-cli ≥ 5.47.16) instead of sending to an unconfirmed\n     recipient:\n\n     ```bash\n     hq people resolve \"\u003Ctoken>\" --json            # active company\n     hq people resolve \"\u003Ctoken>\" --json --company \u003Cslug>   # when scoping explicitly\n     ```\n\n     This is **single-company and tenancy-safe**: it reads the active company's\n     member roster (`companies\u002F\u003Cco>\u002Fpeople\u002F*\u002Fmeta.yaml`) and never looks across\n     company boundaries — HQ tenancy rules forbid cross-company member lookups.\n     The active company is the sole non-archived company in\n     `companies\u002Fmanifest.yaml`; pass `--company \u003Cslug>` to scope explicitly. Read\n     the JSON `status` field:\n\n     - **`status: \"found\"` → use the returned `email`.** Resolution is confirmed;\n       continue. (`hq people resolve \"\u003Ctoken>\"` without `--json` prints the bare\n       email if you just want the address.)\n     - **`status: \"ambiguous\"` → STOP and disambiguate.** Never guess. The result\n       carries a `matches[]` array (the same set `hq people search \"\u003Ctoken>\"`\n       returns); present those candidates (name · email · role) as a single\n       decision and let the user pick — use the runtime structured picker\n       (`AskUserQuestion` \u002F Codex `request_user_input`), one question, plain-text\n       numbered fallback if no picker is available (the decision-queue pattern).\n       Use the chosen person's email.\n     - **`status: \"no_email\"` → STOP.** The person was found but has no email on\n       record. Tell the user plainly and ask for the exact email\u002FpersonUid; do\n       not send.\n     - **`status: \"not_found\"` → STOP.** Say plainly that no teammate named\n       \"\u003Ctoken>\" was found in the company, and that they can pass the exact email\n       or personUid instead (or the person may not be in this company \u002F not yet\n       synced to this machine). Do not send a guessed recipient.\n     - **\"Multiple companies\" error (no `--company` given) → ask which company,**\n       then re-run `hq people resolve \"\u003Ctoken>\" --company \u003Cslug>`. Stay\n       single-company; never fan the lookup across every company.\n\n   After this step you hold a fully-resolved list of **confirmed**\n   emails\u002FpersonUids — one for a 1:1 DM, two or more for a group DM.\n\n3. **Humanize, then send.** Before sending, run the channel-aware humanize pass\n   on the message body (and any `--prompt` \u002F `--details` text) per\n   `core\u002Fknowledge\u002Fpublic\u002Fhq-core\u002Fhumanize-before-send.md` — channel `dm`,\n   default intensity `light`: strip the obvious AI tells but keep the message\n   terse and conversational. Never rewrite recipients, scheduling flags, or\n   anything that is not prose. Then run a single `hq dm` invocation with the\n   resolved recipient(s). For a group DM, join the resolved tokens back into one\n   comma-separated recipient string (a group needs at least 2 other people).\n   Examples:\n\n   ```bash\n   # Plain DM (email — fast path, unchanged)\n   hq dm stefan@example.com \"Heads up — prod deploy going out at 3pm\"\n\n   # By name — confirmed to the teammate's email via `hq people resolve` first, then sent\n   hq dm stefan \"Heads up — prod deploy going out at 3pm\"\n\n   # Group DM — comma-separated recipients (each token resolved independently)\n   hq dm \"stefan@example.com,corey,prs_abc123\" \"Sync on the launch at 4?\"\n\n   # With agent context (recipient gets a Copy-prompt action)\n   hq dm stefan@example.com \"Can your agent take this over?\" \\\n     --prompt \"You are Stefan's agent. Pick up the acme-web deploy: merge #178, run the deploy script, verify routes.\"\n\n   # With a details pane\n   hq dm stefan@example.com \"Review notes attached\" --details-file \u002Ftmp\u002Fnotes.md\n\n   # Scheduled\n   hq dm me@example.com \"Stand-up in 10\" --in 10m\n   hq dm corey@example.com \"EOD wrap-up reminder\" --at 2026-05-29T17:00:00Z\n   ```\n\n   For multi-line or special-character prompts\u002Fdetails, prefer `--prompt-file` \u002F\n   `--details-file` (write the text to a mktemp file first) over inline quoting.\n\n4. **Report.** Print the command's result — `DM sent to \u003Crecipient> (eventId …)`\n   or `Scheduled DM … for \u003Ctime>`. When you resolved a name, mention who it\n   resolved to (e.g. \"sent to Stefan Walsh \u003Cstefan@example.com>\") so the user can\n   confirm it reached the right person. On `Recipient not found or not reachable`,\n   tell the user they can only DM someone they share an active company with\n   (and to double-check the email \u002F personUid).\n\n## Notes\n\n- Name resolution is **read-only, local, and single-company** — `hq people\n  resolve` only reads the active company's `companies\u002F\u003Cco>\u002Fpeople\u002F*\u002Fmeta.yaml`\n  roster, never mutates anything, and never looks across companies (tenancy-safe\n  by construction). If a teammate isn't in that roster yet (not synced, or never\n  recorded), pass their exact email\u002FpersonUid; the name lookup is a confirm layer\n  over the same `hq dm`. Use `hq people search \"\u003Ctoken>\"` to browse candidates,\n  and `--company \u003Cslug>` to scope when you belong to more than one company.\n- Requires a signed-in HQ session (`\u002Fhq-login`). The CLI resolves the caller\n  identity from the Cognito token — a sent DM is always **from** the signed-in\n  user; read commands show **your** inbox \u002F threads.\n- **Read is first-class in the CLI** (`inbox`, `thread`\u002F`read`,\n  `channel`\u002F`history`). The Desktop App still delivers live notifications; use\n  the CLI when the agent or user needs to inspect messages without the app UI.\n- Scheduled DMs are promoted to live notifications within ~60s of their time\n  on the recipient's next inbox poll.\n- Never paste secrets into a DM body\u002Fprompt\u002Fdetails — DMs are stored server-side.\n- From a person login every send is `audience: human`. A bot or agent identity\n  defaults to `agent` for agent, group and channel recipients; when a person must\n  read its message it passes `--audience human`, or the desktop app hides the\n  message in a fold.\n\n## See also\n\n- `\u002Fhq-share` — share a vault path in your message\n- `\u002Fdelegate` — a DM alone doesn't transfer work; use this to hand a whole project over (access, branch, secrets, ownership, and the pickup prompt in one flow)\n- `\u002Fsignals` — see action items and commitments\n- `hq channels` — list named channels \u002F group DM ids for `hq dm channel`\n","# \u002Fdm — Send or read an HQ direct message\n\nSend a person-to-person notification through HQ, **or read** DMs from the CLI.\nOn send, the recipient gets it as a macOS notification in their HQ Desktop App;\nif you attach agent context they get a one-click **Copy prompt** action, and if\nyou attach details they get an **Open details** window. You can DM yourself\n(note-to-self \u002F reminders).\n\n`hq dm` is **send and read**. The HQ Desktop App still surfaces live\nnotifications; the CLI can also list your inbox, open a 1:1 thread, and show\nchannel \u002F group history. You can only DM someone you share an active company\nwith.\n\n## Usage\n\n### Send\n\n```\nhq dm \u003Crecipient> \u003Cmessage> [options]\n```\n\n- `\u003Crecipient>` — one of:\n  - a teammate's **email** (e.g. `stefan@example.com`),\n  - a **personUid** (`prs_…`) or **agentUid** (`agt_…`),\n  - a bare **name** (e.g. `stefan` or `Stefan Walsh`) — resolved to the exact\n    email before sending (see **Resolve recipients** below),\n  - a **comma-separated list** of any of the above — this opens a **group DM**\n    (every token is resolved independently). Your own email = a note-to-self, or\n  - a **named channel** — bare (`vyg-dev`), hash form (`#vyg-dev`), or\n    `--channel \u003Cname>` (see `hq channels`).\n- `\u003Cmessage>` — the notification body (the headline the recipient sees). Required.\n\nOptions (1:1 DMs only — not channels\u002Fgroups):\n\n| Option | Effect |\n|---|---|\n| `--prompt \u003Ctext>` \u002F `--prompt-file \u003Cpath>` | Agent-context prompt the recipient can one-click copy into their own agent session. Only when present does the banner show **Copy prompt**. |\n| `--details \u003Ctext>` \u002F `--details-file \u003Cpath>` | Longer text shown in the recipient's **Open details** window. |\n| `--at \u003Ciso>` | Schedule delivery at an ISO8601 time (store-and-forward — arrives even if you're offline at that time). |\n| `--in \u003Cduration>` | Schedule after a relative delay: `30s`, `10m`, `2h`, `1d`. |\n\nAudience (every send: 1:1, group, channel):\n\n| Option | Effect |\n|---|---|\n| *(none)* | From a person login: `audience: human` for every recipient. From a bot or agent identity: `human` to a person, `agent` to an agent, group or channel. |\n| `--audience human` (alias `--for-human`) | The message is for a person. It shows in their conversation, with a small CLI chip. |\n| `--audience agent` or `both` | Bots and agents only. From a person login the CLI refuses it, and the server answers 403 `person_cannot_send_agent_message`. |\n\nPeople never send agent-tagged messages. A session running under a person's\nlogin sends human messages, including handoffs with `--prompt`. Only a bot or\nagent identity tags machine status as `agent`.\n\n### Read\n\nDMs can be **read from the CLI** (hq-cli ≥ 5.70). Prefer these when the user\nasks to check messages, open a thread, list unread, or pull channel history —\ndo **not** tell them DMs are receive-only in the desktop app.\n\n```\nhq dm inbox [options]\nhq dm thread|read \u003Cperson> [options]\nhq dm channel|history \u003Ctarget> [options]\n```\n\n| Command | Effect |\n|---|---|\n| `hq dm inbox` | List recent **incoming** DMs. |\n| `hq dm thread \u003Cperson>` (alias `read`) | Show the two-way 1:1 conversation with a person (email, `prs_…`, or `agt_…`). Oldest-first; marks their messages read unless `--no-ack`. |\n| `hq dm channel \u003Ctarget>` (alias `history`) | Show recent messages in a named channel or group DM — by name, `#name`, or a channel id from `hq channels`. |\n\nRead options:\n\n| Option | Where | Effect |\n|---|---|---|\n| `--limit \u003Cn>` | all | Max messages to fetch (server-capped). |\n| `--unread` | `inbox` | Show only unread messages. |\n| `--mark-read` | `inbox`, `channel` | Mark fetched inbox messages read \u002F advance the channel read marker. |\n| `--no-ack` | `thread` | Do **not** mark incoming messages as read. |\n| `--json` | all | Raw JSON instead of the list \u002F transcript. |\n\nExamples:\n\n```bash\n# Unread inbox\nhq dm inbox --unread\n\n# Mark the page read after listing\nhq dm inbox --mark-read\n\n# 1:1 thread (alias: hq dm read …)\nhq dm thread stefan@example.com\nhq dm read prs_abc123 --no-ack --limit 50\n\n# Channel \u002F group history (alias: hq dm history …)\nhq dm channel vyg-dev\nhq dm history \"#launch\" --mark-read\nhq dm channel chn_…          # unnamed group DM — id from `hq channels`\n\n# Machine-readable\nhq dm inbox --json\nhq dm thread stefan@example.com --json\n```\n\nFor a bare name on `thread`\u002F`read`, resolve with `hq people resolve` first (same\nrules as send) — the read path only accepts email \u002F personUid \u002F agentUid.\n\n## Steps (send)\n\n1. **Resolve intent.** From the user's request, pull the recipient(s), the\n   message body, and any agent prompt \u002F details \u002F schedule. If the user said\n   \"send my agent context\" or \"so their agent can act,\" put that in `--prompt`.\n   If they want a longer writeup, use `--details`. If they want to **read**\n   messages instead, skip to the Read commands above.\n\n2. **Resolve & confirm recipient emails — never send blind.** `hq dm` only\n   accepts an **email** or a **personUid** — it does NOT look up names. So before\n   sending, turn every recipient token into a **confirmed** email. First split\n   the recipient on commas (a comma means a group DM); then resolve **each token\n   independently**:\n\n   - **Fast path — already an email or personUid → use it verbatim.** If the\n     token contains `@` (an email) or starts with `prs_` (a personUid), pass it\n     through unchanged. Do NOT look it up. This keeps every existing\n     email\u002FpersonUid invocation working exactly as before.\n\n   - **Name → resolve with `hq people resolve` (confirm before sending).**\n     Otherwise treat the token as a name and resolve it through the built-in\n     people lookup (hq-cli ≥ 5.47.16) instead of sending to an unconfirmed\n     recipient:\n\n     ```bash\n     hq people resolve \"\u003Ctoken>\" --json            # active company\n     hq people resolve \"\u003Ctoken>\" --json --company \u003Cslug>   # when scoping explicitly\n     ```\n\n     This is **single-company and tenancy-safe**: it reads the active company's\n     member roster (`companies\u002F\u003Cco>\u002Fpeople\u002F*\u002Fmeta.yaml`) and never looks across\n     company boundaries — HQ tenancy rules forbid cross-company member lookups.\n     The active company is the sole non-archived company in\n     `companies\u002Fmanifest.yaml`; pass `--company \u003Cslug>` to scope explicitly. Read\n     the JSON `status` field:\n\n     - **`status: \"found\"` → use the returned `email`.** Resolution is confirmed;\n       continue. (`hq people resolve \"\u003Ctoken>\"` without `--json` prints the bare\n       email if you just want the address.)\n     - **`status: \"ambiguous\"` → STOP and disambiguate.** Never guess. The result\n       carries a `matches[]` array (the same set `hq people search \"\u003Ctoken>\"`\n       returns); present those candidates (name · email · role) as a single\n       decision and let the user pick — use the runtime structured picker\n       (`AskUserQuestion` \u002F Codex `request_user_input`), one question, plain-text\n       numbered fallback if no picker is available (the decision-queue pattern).\n       Use the chosen person's email.\n     - **`status: \"no_email\"` → STOP.** The person was found but has no email on\n       record. Tell the user plainly and ask for the exact email\u002FpersonUid; do\n       not send.\n     - **`status: \"not_found\"` → STOP.** Say plainly that no teammate named\n       \"\u003Ctoken>\" was found in the company, and that they can pass the exact email\n       or personUid instead (or the person may not be in this company \u002F not yet\n       synced to this machine). Do not send a guessed recipient.\n     - **\"Multiple companies\" error (no `--company` given) → ask which company,**\n       then re-run `hq people resolve \"\u003Ctoken>\" --company \u003Cslug>`. Stay\n       single-company; never fan the lookup across every company.\n\n   After this step you hold a fully-resolved list of **confirmed**\n   emails\u002FpersonUids — one for a 1:1 DM, two or more for a group DM.\n\n3. **Humanize, then send.** Before sending, run the channel-aware humanize pass\n   on the message body (and any `--prompt` \u002F `--details` text) per\n   `core\u002Fknowledge\u002Fpublic\u002Fhq-core\u002Fhumanize-before-send.md` — channel `dm`,\n   default intensity `light`: strip the obvious AI tells but keep the message\n   terse and conversational. Never rewrite recipients, scheduling flags, or\n   anything that is not prose. Then run a single `hq dm` invocation with the\n   resolved recipient(s). For a group DM, join the resolved tokens back into one\n   comma-separated recipient string (a group needs at least 2 other people).\n   Examples:\n\n   ```bash\n   # Plain DM (email — fast path, unchanged)\n   hq dm stefan@example.com \"Heads up — prod deploy going out at 3pm\"\n\n   # By name — confirmed to the teammate's email via `hq people resolve` first, then sent\n   hq dm stefan \"Heads up — prod deploy going out at 3pm\"\n\n   # Group DM — comma-separated recipients (each token resolved independently)\n   hq dm \"stefan@example.com,corey,prs_abc123\" \"Sync on the launch at 4?\"\n\n   # With agent context (recipient gets a Copy-prompt action)\n   hq dm stefan@example.com \"Can your agent take this over?\" \\\n     --prompt \"You are Stefan's agent. Pick up the acme-web deploy: merge #178, run the deploy script, verify routes.\"\n\n   # With a details pane\n   hq dm stefan@example.com \"Review notes attached\" --details-file \u002Ftmp\u002Fnotes.md\n\n   # Scheduled\n   hq dm me@example.com \"Stand-up in 10\" --in 10m\n   hq dm corey@example.com \"EOD wrap-up reminder\" --at 2026-05-29T17:00:00Z\n   ```\n\n   For multi-line or special-character prompts\u002Fdetails, prefer `--prompt-file` \u002F\n   `--details-file` (write the text to a mktemp file first) over inline quoting.\n\n4. **Report.** Print the command's result — `DM sent to \u003Crecipient> (eventId …)`\n   or `Scheduled DM … for \u003Ctime>`. When you resolved a name, mention who it\n   resolved to (e.g. \"sent to Stefan Walsh \u003Cstefan@example.com>\") so the user can\n   confirm it reached the right person. On `Recipient not found or not reachable`,\n   tell the user they can only DM someone they share an active company with\n   (and to double-check the email \u002F personUid).\n\n## Notes\n\n- Name resolution is **read-only, local, and single-company** — `hq people\n  resolve` only reads the active company's `companies\u002F\u003Cco>\u002Fpeople\u002F*\u002Fmeta.yaml`\n  roster, never mutates anything, and never looks across companies (tenancy-safe\n  by construction). If a teammate isn't in that roster yet (not synced, or never\n  recorded), pass their exact email\u002FpersonUid; the name lookup is a confirm layer\n  over the same `hq dm`. Use `hq people search \"\u003Ctoken>\"` to browse candidates,\n  and `--company \u003Cslug>` to scope when you belong to more than one company.\n- Requires a signed-in HQ session (`\u002Fhq-login`). The CLI resolves the caller\n  identity from the Cognito token — a sent DM is always **from** the signed-in\n  user; read commands show **your** inbox \u002F threads.\n- **Read is first-class in the CLI** (`inbox`, `thread`\u002F`read`,\n  `channel`\u002F`history`). The Desktop App still delivers live notifications; use\n  the CLI when the agent or user needs to inspect messages without the app UI.\n- Scheduled DMs are promoted to live notifications within ~60s of their time\n  on the recipient's next inbox poll.\n- Never paste secrets into a DM body\u002Fprompt\u002Fdetails — DMs are stored server-side.\n- From a person login every send is `audience: human`. A bot or agent identity\n  defaults to `agent` for agent, group and channel recipients; when a person must\n  read its message it passes `--audience human`, or the desktop app hides the\n  message in a fold.\n\n## See also\n\n- `\u002Fhq-share` — share a vault path in your message\n- `\u002Fdelegate` — a DM alone doesn't transfer work; use this to hand a whole project over (access, branch, secrets, ownership, and the pickup prompt in one flow)\n- `\u002Fsignals` — see action items and commitments\n- `hq channels` — list named channels \u002F group DM ids for `hq dm channel`\n",{"name":5,"description":7,"allowed-tools":38},"Bash(hq:*), Read, Glob, Grep","main","205cf61728a27ef15e9153aa38df5856fc8d82f5",".claude\u002Fskills\u002Fdm",18,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core","https:\u002F\u002Fgithub.com\u002Findigoai-us","https:\u002F\u002Fhqforwork.com\u002F","The AI Context Layer for Teams","2026-11-12 06:53:38",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add indigoai-us\u002Fhq-core --skill dm",{"tool":54,"command":55},"bunx","bunx skills add indigoai-us\u002Fhq-core --skill dm",{"tool":57,"command":58},"pnpm","pnpm dlx skills add indigoai-us\u002Fhq-core --skill dm","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fdm\u002FSKILL.md",true,[62],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},"agents\u002Fopenai.yaml","REFERENCE","参考文档",125,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fdm\u002Fagents\u002Fopenai.yaml",[69,89,119,143,154,164],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":33},"01M71E4MQ04WPK1EVDS7VKJ3E8","social-graphic","Generate 1080x1080 HTML social graphics for HQ update posts.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fsocial-strategist\u002Fskills\u002Fsocial-graphic\u002FSKILL.md",[],[76,77,32,78,79,80,23,81,82,83,84,85,86,87,88],"social","social graphic","html","edit","write","update","generate","graphics","browser","open","agent-browser","for","posts",{"skillNo":90,"name":86,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":102,"publishedAt":33},"01M71E4H33K4P5H5M7ENPTMFSC","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002FSKILL.md",[94,99],{"categoryNo":95,"categoryName":96,"taxonomyType":97,"taxonomyTypeDesc":98},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":100,"categoryName":101,"taxonomyType":97,"taxonomyTypeDesc":98},"01JBSEEDCAT000000000000023","Skill与智能体开发",[103,84,104,105,106,107,32,108,109,110,111,112,85,113,86,114,115,116,117,118],"agent browser","click","ai agents","app","scrape","when","apps","actions","extracting","take a screenshot","testing","programmatic","browser automation","website","cli","interaction",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":33},"01M71E4FDBD7J8Y45JJ9KMMYGN","work-mesh","Work Mesh Live — automatic presence via hq mesh daemon; context reconcile\u002Forganize; manual session task-status, blocked, and note only.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fwork-mesh\u002FSKILL.md",[],[126,127,128,32,129,130,131,132,133,134,135,136,137,138,23,139,140,141,142],"work mesh","work","mesh","status","context","note","live","presence","automatic","reconcile","only","organize","task","session","manual","daemon","via",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":33},"01M71E4EGHNAAGWAPV6KGBMQ9W","review","Parity worker review skill (materialization fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fworker-materialization\u002Fparity-worker\u002Fskills\u002Freview\u002FSKILL.md",[],[145,150,151,152,153],"review skill","fixture","parity","worker",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":33},"01M71E4D1FZDJPDC15DRERKX8Y","run","Run or list HQ workers (parity fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fskills\u002Frun\u002FSKILL.md",[],[156,161,162,152,163,151],"parity fixture","workers","list",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":33},"01M71E4BF4MV5SEWZJZ4T1QPQW","handoff","Preserve session state for a follow-up agent (parity fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fskills\u002Fhandoff\u002FSKILL.md",[],[166,161,171,172,139,173,87,152,174,175,151],"up","preserve","session state","follow-up","state"]