Background
Surfaced as follow-up #1 in #146 (and PR #147 lands the doc fix that's the immediate-scope half of that issue).
Linear's API rejects raw unicode emoji on icon fields (🔁, ⭐, 📦 → INVALID_INPUT) but accepts the equivalent colon-wrapped shortcode (:repeat:, :star:, :package:). #146 documents this; this issue tracks making lineark paper over the gap so users don't have to know.
Proposal
When --icon receives a value containing non-ASCII chars, translate it to its standard emoji shortcode before sending to Linear. So:
lineark projects create "Demo" --team ENG --icon "🔁"
# lineark internally rewrites to --icon ":repeat:" and the API accepts it
The standard emoji↔shortcode mapping is well-defined and shared across Slack, GitHub, Discord, and emojibase — picking any one of those tables (or the emojis crate, which exposes Slack/GitHub shortcodes from a generated table) gets us coverage of the common set.
Behavior
- Input is pure ASCII → pass through unchanged (named icons, existing shortcodes).
- Input contains a recognized unicode emoji → rewrite to
:shortcode: and proceed.
- Input contains an unrecognized non-ASCII char → pass through unchanged; let Linear reject it. Rationale: don't silently discard data we don't understand.
Escape hatch
--icon-raw (or --no-translate) for users who genuinely want to send raw bytes — useful if Linear ever fixes the validator and we need a way to test without lineark "helping."
Scope
Why this isn't speculative
Acceptance criteria
Background
Surfaced as follow-up #1 in #146 (and PR #147 lands the doc fix that's the immediate-scope half of that issue).
Linear's API rejects raw unicode emoji on icon fields (
🔁,⭐,📦→INVALID_INPUT) but accepts the equivalent colon-wrapped shortcode (:repeat:,:star:,:package:). #146 documents this; this issue tracks making lineark paper over the gap so users don't have to know.Proposal
When
--iconreceives a value containing non-ASCII chars, translate it to its standard emoji shortcode before sending to Linear. So:The standard emoji↔shortcode mapping is well-defined and shared across Slack, GitHub, Discord, and emojibase — picking any one of those tables (or the
emojiscrate, which exposes Slack/GitHub shortcodes from a generated table) gets us coverage of the common set.Behavior
:shortcode:and proceed.Escape hatch
--icon-raw(or--no-translate) for users who genuinely want to send raw bytes — useful if Linear ever fixes the validator and we need a way to test without lineark "helping."Scope
projects create,projects update(the two paths docs(projects): --icon help text claims emoji are accepted but Linear API rejects them #146 fixed the help text on).iconfields (teams, custom views, dashboards, documents, project templates) — only after each is verified to behave the same way at the API.Why this isn't speculative
parse_priority/resolve_*).:repeat:form remains a valid input format, and the named-icon form remains the discoverable-without-shortcode-knowledge form. The new help text would just stop saying "rejects raw unicode emoji."Acceptance criteria
--icon "🔁"translates to:repeat:and succeeds against Linear's API--icon "Computer"(named icon) passes through unchanged--icon ":repeat:"(already-shortcode) passes through unchanged--icon "<unrecognized unicode>"passes through unchanged and surfaces Linear's rejectioncrates/lineark/tests/online.rscovers the unicode→shortcode happy path against a real project--iconhelp text updated to remove the "rejects raw unicode emoji" warning (since lineark now handles it)