From 087227a07fd2ab1d06e62e048037efc734605843 Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Wed, 9 Sep 2026 16:23:41 -0700 Subject: [PATCH 1/7] Say that every rich-text field is Markdown-converted, todos and cards included MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The skill told agents that todo, document and card content is sent as-is, which sent them hand-writing HTML — and any HTML tag in a field skips the Markdown path entirely, inline image upload with it. The CLI has converted Markdown for all of those for a while; the invariant now names every field that is converted, the all-or-nothing rule for raw HTML, and the titles that stay plain text. Fixes #674 --- skills/basecamp/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 94a5fb71..5052d671 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -91,12 +91,12 @@ Full CLI coverage: 189 tracked in-scope endpoints across todos, cards, messages, 2. **Parse URLs first** with `basecamp url parse ""` to extract IDs 3. **Comments are flat** - reply to parent recording, not to comments 4. **Check context** via `.basecamp/config.json` before assuming project -5. **Content fields accept Markdown and @mentions** — message body and comment content accept Markdown syntax; the CLI converts to HTML automatically. Use Markdown formatting (lists, bold, links, code blocks, tables) for rich content. Four mention syntaxes are available (prefer deterministic for agents): +5. **Content fields accept Markdown and @mentions** — every rich-text field is converted from Markdown to HTML by the CLI: message and document bodies, comment content, todo, card, schedule-entry and upload descriptions, chat lines, check-in answers and notes. Use Markdown formatting (lists, bold, links, code blocks, tables) for rich content. Four mention syntaxes are available (prefer deterministic for agents): - **`[@Name](mention:SGID)`** — zero API calls, embeds SGID directly (preferred for agents) - **`[@Name](person:ID)`** — one API call, resolves person ID to SGID via pingable set - **`@sgid:VALUE`** — inline SGID embed for pipeline composability - **`@Name` / `@First.Last`** — fuzzy name resolution (may be ambiguous) - For todos, documents, and cards, content is sent as-is — use plain text or HTML directly. + Raw HTML is also accepted and passes through unchanged, but it is all-or-nothing per field: any HTML tag outside a code span or fence skips Markdown conversion for the whole field, including inline image upload, which only works from Markdown `![alt](/local/path)` syntax. Titles (a todo's content argument, card and message titles) are plain text and never converted. **Table boundary:** GFM tables round-trip: they render in message/comment bodies, display converts them back to pipe tables, and the TUI in-place From eb14fcf306cbfcfe99fee2e67067c9f3d7d76b60 Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Wed, 9 Sep 2026 16:34:25 -0700 Subject: [PATCH 2/7] Set the raw-HTML rule off from the mention list --- skills/basecamp/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 5052d671..9abdf9af 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -96,6 +96,7 @@ Full CLI coverage: 189 tracked in-scope endpoints across todos, cards, messages, - **`[@Name](person:ID)`** — one API call, resolves person ID to SGID via pingable set - **`@sgid:VALUE`** — inline SGID embed for pipeline composability - **`@Name` / `@First.Last`** — fuzzy name resolution (may be ambiguous) + Raw HTML is also accepted and passes through unchanged, but it is all-or-nothing per field: any HTML tag outside a code span or fence skips Markdown conversion for the whole field, including inline image upload, which only works from Markdown `![alt](/local/path)` syntax. Titles (a todo's content argument, card and message titles) are plain text and never converted. **Table boundary:** GFM tables round-trip: they render in message/comment From 6a6cfd9d688467fe162d9e8108aaa2be6afe0034 Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Wed, 9 Sep 2026 16:39:01 -0700 Subject: [PATCH 3/7] Name where mentions resolve, that chat posts stay plain text, and which tags trip the HTML rule --- skills/basecamp/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skills/basecamp/SKILL.md b/skills/basecamp/SKILL.md index 9abdf9af..241ed6e8 100644 --- a/skills/basecamp/SKILL.md +++ b/skills/basecamp/SKILL.md @@ -91,13 +91,13 @@ Full CLI coverage: 189 tracked in-scope endpoints across todos, cards, messages, 2. **Parse URLs first** with `basecamp url parse ""` to extract IDs 3. **Comments are flat** - reply to parent recording, not to comments 4. **Check context** via `.basecamp/config.json` before assuming project -5. **Content fields accept Markdown and @mentions** — every rich-text field is converted from Markdown to HTML by the CLI: message and document bodies, comment content, todo, card, schedule-entry and upload descriptions, chat lines, check-in answers and notes. Use Markdown formatting (lists, bold, links, code blocks, tables) for rich content. Four mention syntaxes are available (prefer deterministic for agents): +5. **Content fields accept Markdown, and most accept @mentions** — every rich-text field is converted from Markdown to HTML by the CLI: message and document bodies, comment content, todo, card, schedule-entry and upload descriptions, check-in answers and notes. Chat is the exception: `chat post` sends plain text unless you pass `--content-type text/html` or the line carries a mention. Use Markdown formatting (lists, bold, links, code blocks, tables) for rich content. @mentions resolve in message bodies, comment content, card bodies, schedule descriptions and chat lines — not in todo descriptions, documents, uploads, check-ins or notes. Four mention syntaxes are available (prefer deterministic for agents): - **`[@Name](mention:SGID)`** — zero API calls, embeds SGID directly (preferred for agents) - **`[@Name](person:ID)`** — one API call, resolves person ID to SGID via pingable set - **`@sgid:VALUE`** — inline SGID embed for pipeline composability - **`@Name` / `@First.Last`** — fuzzy name resolution (may be ambiguous) - Raw HTML is also accepted and passes through unchanged, but it is all-or-nothing per field: any HTML tag outside a code span or fence skips Markdown conversion for the whole field, including inline image upload, which only works from Markdown `![alt](/local/path)` syntax. Titles (a todo's content argument, card and message titles) are plain text and never converted. + Raw HTML is also accepted and passes through unchanged, but it is all-or-nothing per field: a recognized HTML tag (`

`, `