feat(setup): add "Other…" option to channel picker

The first-time setup picker only listed seven channels with bash
installers. Users wanting to install one of the other channels (matrix,
github, linear, webex, etc.) had no entry point from the picker and had
to know to run /add-<name> from Claude Code afterwards.

Add an "Other…" option that prompts for a free-text name, normalizes it
(accepts "matrix", "add-matrix", or "/add-matrix"), and prints a hint
telling the user to run /add-<name> from Claude Code after setup
finishes. The verify step's "What's left" panel already covers the
empty-channels case, so the user is not left thinking the channel was
wired.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
javexed
2026-05-03 01:03:38 -04:00
parent 953264e0d3
commit 58fc5728db

View File

@@ -60,7 +60,7 @@ import { isValidTimezone } from '../src/timezone.js';
const CLI_AGENT_NAME = 'Terminal Agent';
const RUN_START = Date.now();
type ChannelChoice = 'telegram' | 'discord' | 'whatsapp' | 'signal' | 'teams' | 'slack' | 'imessage' | 'skip';
type ChannelChoice = 'telegram' | 'discord' | 'whatsapp' | 'signal' | 'teams' | 'slack' | 'imessage' | 'other' | 'skip';
async function main(): Promise<void> {
// Make sure ~/.local/bin is on PATH for every child process we spawn.
@@ -441,7 +441,7 @@ async function main(): Promise<void> {
if (!skip.has('channel')) {
channelChoice = await askChannelChoice();
if (channelChoice !== 'skip') {
if (channelChoice !== 'skip' && channelChoice !== 'other') {
await resolveDisplayName();
}
if (channelChoice === 'telegram') {
@@ -458,6 +458,8 @@ async function main(): Promise<void> {
await runSlackChannel(displayName!);
} else if (channelChoice === 'imessage') {
await runIMessageChannel(displayName!);
} else if (channelChoice === 'other') {
await askOtherChannelName();
} else {
p.log.info(
brandBody(
@@ -1076,6 +1078,7 @@ async function askChannelChoice(): Promise<ChannelChoice> {
hint: 'needs public URL',
},
{ value: 'teams', label: 'Yes, connect Microsoft Teams', hint: 'complex setup' },
{ value: 'other', label: 'Other…', hint: 'install via /add-<name> after setup' },
{ value: 'skip', label: 'Skip for now', hint: "I'll just use the terminal" },
],
}),
@@ -1085,6 +1088,26 @@ async function askChannelChoice(): Promise<ChannelChoice> {
return choice;
}
async function askOtherChannelName(): Promise<void> {
const answer = ensureAnswer(
await p.text({
message: 'Which channel would you like to install?',
placeholder: 'e.g. matrix, github, linear, webex',
}),
);
const name = (answer as string).trim().toLowerCase().replace(/^\/?(add-)?/, '');
setupLog.userInput('other_channel', name);
phEmit('channel_other_named', { channel: name });
p.log.info(
brandBody(
wrapForGutter(
`No bash installer for ${k.bold(name)} — open Claude Code after setup and run ${k.bold(`/add-${name}`)} to install it.`,
4,
),
),
);
}
// ─── interactive / env helpers ─────────────────────────────────────────
function ensureLocalBinOnPath(): void {