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
{{ message }}
Repository navigation
feat(amico-run): ship amico-slack as the package's Slack client bin (unified-fleet slice 2) #429
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.
Target-package check (2026-08-20, Aaron flagged a concern):@amicode/amico-run is not being retired — the depth-1 redesign dissolves the orchestrator personas and explicitly names "the amico-run lineage" as the CLI spine (spec-20260708-112732 §7.3); the installation-architecture spec (2026-08-17) and the standalone-app RFC #302 both carry it as the VS Code-independent spine. Actual retirements in flight — the vendored opencode fork binary (#451) and the pulse-designer agent shell (#389) — don't touch this package. The port stands as scoped; if a newer decision says otherwise, re-home before starting and update this issue.
Closing — superseded by the amico-run sunset (#852). The amico-slack CLI exists as a standalone skill and is tracked separately via PR #754. Shipping it inside the amico-run package is no longer the plan since amico-run itself is being dissolved.
Activity
aarontrowbridge commentedon Aug 20, 2026
Target-package check (2026-08-20, Aaron flagged a concern):
@amicode/amico-runis not being retired — the depth-1 redesign dissolves the orchestrator personas and explicitly names "the amico-run lineage" as the CLI spine (spec-20260708-112732 §7.3); the installation-architecture spec (2026-08-17) and the standalone-app RFC #302 both carry it as the VS Code-independent spine. Actual retirements in flight — the vendored opencode fork binary (#451) and the pulse-designer agent shell (#389) — don't touch this package. The port stands as scoped; if a newer decision says otherwise, re-home before starting and update this issue.jeonghun-jj-lee commentedon Sep 12, 2026
Closing — superseded by the amico-run sunset (#852). The amico-slack CLI exists as a standalone skill and is tracked separately via PR #754. Shipping it inside the amico-run package is no longer the plan since amico-run itself is being dissolved.