mirror of
https://github.com/qwibitai/nanoclaw.git
synced 2026-06-12 18:11:51 +08:00
9b7d4d50e4
auto.ts had grown to 923 lines with ~10 interleaved responsibilities.
Split into three focused modules, keeping auto.ts as a pure step
sequencer:
- setup/lib/runner.ts (325 lines) — spawn + stream-parse + spinner-wrap
primitives. Exports: spawnStep, spawnQuiet, runQuietStep,
runQuietChild, runUnderSpinner (internal), StatusStream, types
(Fields, Block, StepResult, SpinnerLabels, QuietChildResult),
writeStepEntry, summariseTerminalFields, dumpTranscriptOnFailure,
fail(), ensureAnswer().
- setup/lib/theme.ts (39 lines) — brand palette (brand, brandBold,
brandChip) with USE_ANSI / TRUECOLOR gating, so both auto.ts and
channel flows can render the NanoClaw cyan without duplicating the
detection.
- setup/channels/telegram.ts (277 lines) — runTelegramChannel(displayName)
owns the full flow: BotFather instructions, token paste + validation
(via getMe), install script, pair-telegram streaming UI (code card +
attempt checkpoints), agent-name prompt, init-first-agent wiring.
auto.ts drops to 376 lines. main() reads as a clean sequence of
`if (!skip.has(X)) await Xstep(...)` blocks.
fail() now takes the step name explicitly — no module-level
failingStep state. Every call site is grep-friendly and self-contained
(fail('container', msg, hint)).
Typechecks clean. Smoke-tested end-to-end: intro, mounts step,
progression log, and outro all render the same as before the split.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
/**
|
|
* NanoClaw brand palette for the terminal.
|
|
*
|
|
* Colors pulled from assets/nanoclaw-logo.png:
|
|
* brand cyan ≈ #2BB7CE — the "Claw" wordmark + mascot body
|
|
* brand navy ≈ #171B3B — the dark logo background + outlines
|
|
*
|
|
* Rendering gates:
|
|
* - No TTY (piped / redirected) → plain text, no ANSI
|
|
* - NO_COLOR set → plain text, no ANSI
|
|
* - COLORTERM truecolor/24bit → 24-bit ANSI (exact brand cyan)
|
|
* - Otherwise → kleur's 16-color cyan (closest fallback)
|
|
*/
|
|
import k from 'kleur';
|
|
|
|
const USE_ANSI = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
|
|
const TRUECOLOR =
|
|
USE_ANSI &&
|
|
(process.env.COLORTERM === 'truecolor' || process.env.COLORTERM === '24bit');
|
|
|
|
export function brand(s: string): string {
|
|
if (!USE_ANSI) return s;
|
|
if (TRUECOLOR) return `\x1b[38;2;43;183;206m${s}\x1b[0m`;
|
|
return k.cyan(s);
|
|
}
|
|
|
|
export function brandBold(s: string): string {
|
|
if (!USE_ANSI) return s;
|
|
if (TRUECOLOR) return `\x1b[1;38;2;43;183;206m${s}\x1b[0m`;
|
|
return k.bold(k.cyan(s));
|
|
}
|
|
|
|
export function brandChip(s: string): string {
|
|
if (!USE_ANSI) return s;
|
|
if (TRUECOLOR) {
|
|
return `\x1b[48;2;43;183;206m\x1b[38;2;23;27;59m\x1b[1m${s}\x1b[0m`;
|
|
}
|
|
return k.bgCyan(k.black(k.bold(s)));
|
|
}
|