You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The only usable Slack poster (~/.local/bin/amico-slack, Python) is hand-planted on one machine with no versioned source — the product has no Slack client, and the unified-fleet spec's slice 2 ships one.
Approach
Port the CLI into @amicode/amico-run as a zero-dep Node bin (node:https, the existing launcher/bin pattern), absorbing the DM path as a dm command so the internal httpx client can retire. One client — the Python script becomes the executable reference, then yields authority the moment the bin lands.
Approaches Considered
Ship the Python script inside the extension — rejected: Python runtime friction on user machines; the Node bin matches amico-run's launcher pattern.
Keep both clients indefinitely — rejected: two clients is the disease being cured.
(chosen) Node bin port with ported tests.
Acceptance Criteria
The bin supports send (incl. --file, --thread, --as-user), read, whois, delete, status, and new dm <email|@handle>.
Voice contract intact: default posts as the app with no footer; --as-user appends _de Amico_; legacy Authored by Amico stripped idempotently (ported tests prove it).
Token layering: credential store → ~/.amico/slack/token (0600) → SLACK_BOT_TOKEN env; absent all → clean "no Slack configured" exit, never a crash.
~/.local/bin/amico-slack becomes a symlink to the shipped bin; the SKILL.md cli_tool resolves from PATH.
The papers-digest verb and morning-brief workflow post through the bin; the internal httpx SlackClient retires to the email-lookup only, or fully if dm covers it.
With no Slack configured anywhere, the extension and verbs are inert and silent (product guarantee).
Key Decisions
Port, not rewrite: the Python script is the executable reference; port its test cases (footer idempotence, mrkdwn flattening, mention resolution) alongside.
Important
Problem
The only usable Slack poster (
~/.local/bin/amico-slack, Python) is hand-planted on one machine with no versioned source — the product has no Slack client, and the unified-fleet spec's slice 2 ships one.Approach
Port the CLI into
@amicode/amico-runas a zero-dep Node bin (node:https, the existing launcher/bin pattern), absorbing the DM path as admcommand so the internal httpx client can retire. One client — the Python script becomes the executable reference, then yields authority the moment the bin lands.Approaches Considered
Acceptance Criteria
send(incl.--file,--thread,--as-user),read,whois,delete,status, and newdm <email|@handle>.--as-userappends_de Amico_; legacyAuthored by Amicostripped idempotently (ported tests prove it).~/.amico/slack/token(0600) →SLACK_BOT_TOKENenv; absent all → clean "no Slack configured" exit, never a crash.~/.local/bin/amico-slackbecomes a symlink to the shipped bin; the SKILL.mdcli_toolresolves from PATH.dmcovers it.Key Decisions
dmabsorbsusers.lookupByEmail→conversations.open→chat.postMessage(needsusers:read.email— added in slice 0).Source
specs/spec-20260818-150711-unified-amico-fleet-slack.md(personal vault, rev 2) — slice 2.