본문으로 건너뛰기
cccskills
무료GitHub에 공개

write-tui

Use when writing or modifying the pythinker-code terminal UI in apps/pythinker-code/src/tui — components, dialogs/selectors, slash commands, themes, streaming render, or the PythinkerTUI controllers. Covers the architecture, where new features go, test placement, the theme system mechanics, and the dialog interaction/visual spec (DESIGN.md).

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(2)

  • SKILL.md8.3 KB
  • DESIGN.md12.8 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Write TUI (apps/pythinker-code)

The terminal UI lives in apps/pythinker-code/src/tui. Before writing TUI code, read apps/pythinker-code/AGENTS.md for the always-on map, module boundaries, and hard constraints (printable-key decoding, no chalk named colors, etc.). This skill is the how-to: architecture orientation, feature routing, test placement, theme mechanics, and the dialog spec.

For any list dialog, selector, input box, or status/toggle list, the interaction and visual rules are normative — see DESIGN.md in this folder and follow its self-check list before submitting.

Architecture

PythinkerTUI is a coordinator that wires state, layout, session, and dialogs together and delegates heavy logic to controllers.

  • src/tui/pythinker-tui.ts — the PythinkerTUI coordinator. Holds state, owns startup/shutdown order, layout/editor wiring, user-input entry, sending/queueing, session lifecycle, and the slash-command handler dispatch. It should not accumulate event-routing or rendering logic — those live in controllers.
  • src/tui/tui-state.ts — TUIState, createTUIState, createInitialAppState. The single global UI state shape. Before adding a new global field, decide whether it truly belongs here vs. local component state.
  • src/tui/controllers/ — the independently-testable responsibilities. Each controller owns one slice:
    • session-event-handler.ts — routes SDK session events (handleEvent dispatch + the per-event handleXxx). Concrete event handling goes here, not in PythinkerTUI.
    • streaming-ui.ts — streaming render: assistant delta, thinking, tool call / result, compaction, subagent, background agent, transcript aggregation.
    • session-replay.ts — resume/replay orchestration; drives replay records through the same live render hooks. Stateless replay parsing/limiting/projection helpers belong in src/tui/utils/message-replay.ts.
    • tasks-browser.ts — the tasks browser controller.
    • editor-keyboard.ts — editor keyboard handling, exit shortcuts, external editor, clipboard image.
    • auth-flow.ts — login/auth orchestration (refreshConfigAfterLogin, etc.).
  • src/tui/commands/ — slash-command declaration, parsing, ordering, and dynamic skill-command generation. Parsing and types only; execution is dispatched from PythinkerTUI's slash-command handler section, and complex execution sinks into utils or focused components.
  • src/tui/components/ — pi-tui components by UI type: chrome/ (footer, todo, welcome, loader, device code), dialogs/ (selectors, approval/question panels, settings popups that replace the editor), editor/ (input box + mention provider), media/ (image, diff, code highlight), markdown/ (the app's Markdown wrapper and mermaid art), messages/ (transcript blocks + tool-renderers), panes/ (activity, queue).
  • src/tui/reverse-rpc/ — adapts SDK approval/question callbacks into UI panel data and the user's choice back into an SDK response.
  • src/tui/theme/ — themes, color tokens, style helpers, pi-tui markdown theme, terminal-background detection. The single source of truth for color.
  • src/tui/utils/ — TUI-only utilities (need TUIState or a component). App-wide, UI-independent helpers go in src/utils/.

When a controller or PythinkerTUI section keeps growing, split pure functions, state projections, and presentation components into the matching directory rather than expanding the file.

Where new features go

The feature type decides the landing spot:

  • CLI arguments → src/cli/commands.ts / src/cli/options.ts, passed into the TUI via src/cli/run-shell.ts. The CLI never operates on the session directly.
  • CLI subcommands → src/cli/sub/, non-interactive only; reach core via @pymodel/pythinker-code-sdk.
  • Slash commands → declare/parse/type under src/tui/commands/; add the execution entry in PythinkerTUI's slash-command handler section; sink complex logic into utils or a focused component.
  • Skill-derived commands → hook into buildSkillSlashCommands / the skill command map; do not hard-code a single skill.
  • Transcript message types → define the shape in src/tui/types.ts, add/extend a components/messages/ component, register the renderer in the transcript builder.
  • Tool-result display → extend components/messages/tool-renderers/registry.ts and the renderer; do not stack branches inside ToolCallComponent.
  • Popup / selector → components/dialogs/, mounted via mountEditorReplacement; follow DESIGN.md. If triggered by an SDK callback, check whether reverse-rpc/ needs an adapter/controller/handler.
  • SDK event handling → add the dispatch in session-event-handler.ts's handleEvent, then the matching handleXxx.
  • Streaming render → controllers/streaming-ui.ts.
  • Session start / resume behavior → the session-management section of PythinkerTUI; replay behavior → controllers/session-replay.ts, reusing live render paths.
  • Status bar / activity / queue → chrome/footer, panes/activity, panes/queue, and the matching updateXxx.
  • Configuration option → read/write + schema in src/tui/config.ts, then the settings UI; persist through saveTuiConfig (a component never writes the config file itself).
  • Constants → shared CLI/TUI non-copy constants in src/constant/; TUI-only non-copy constants in src/tui/constant/. Component-local copy, option labels, help text, dialog titles/footers stay next to their component — do not centralize copy into a global module.
  • General capability → no TUI-state dependency → src/utils/; depends on TUI state or a component → src/tui/utils/.

Test placement

  • Component behavior tests sit next to the component's existing tests (test/tui/components/...).
  • Command parsing tests → test/tui/commands/.
  • reverse-rpc tests → test/tui/reverse-rpc/.
  • Pure utility tests → next to the corresponding utils tests.
  • Do not create a generic some-feature.test.ts just to land a small feature; extend the nearest existing test file.

Theme system mechanics

Themes are managed centrally under src/tui/theme/:

  • colors.ts — semantic tokens: ColorPalette, darkColors, lightColors.
  • styles.ts — common chalk helpers built on top of ColorPalette.
  • pi-tui-theme.ts — the markdown/pi-tui theme config.
  • terminal-background.ts — terminal background detection used by auto resolution.
  • bundle.ts — packs colors, styles, markdownTheme into a PythinkerTUIThemeBundle.
  • index.ts / detect.ts — theme type and auto/dark/light resolution.

Keep the color-token set in sync. ColorPalette in colors.ts is the source of truth for color tokens. When you add, rename, or remove one, update its mirrors in the same change: the custom-theme JSON schema (apps/pythinker-code/src/tui/theme/theme-schema.json), the token table in the custom-theme docs (docs/customization/themes.md), and the token table in the custom-theme built-in skill (packages/agent-core/src/skill/builtin/custom-theme.md).

Apply / switch flow:

  • UI entry: ThemeSelectorComponent → handleThemeCommand → applyThemeChoice.
  • The real apply step is PythinkerTUI.applyTheme: it updates state.theme, state.appState.theme, and notifies components to refresh their palette.
  • Persist the choice through saveTuiConfig — a component must not write the config file itself.

The hard color rules (no chalk named colors, contrast ratios, no module-top-level cached styled functions, add a ColorPalette token before inventing a color) are normative and guard-enforced — they live in apps/pythinker-code/AGENTS.md. This skill only covers the mechanics.

Before you submit

  • Run lint / format / test on the files you changed.
  • For any dialog/selector/input/toggle list, walk the self-check list at the end of DESIGN.md.
  • Keep printableChar() for printable-key comparisons (CI guard) and chalk.hex(colors.<token>) for color (CI guard).

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

PyModel/pythinker-code292026년 10월 18일 업데이트

Use when developing in packages/agent-core-v2 (the DI × Scope agent engine) — adding or modifying a domain Service, choosing a LifecycleScope, wiring DI dependencies, splitting a domain across scopes, owning or migrating a config section, gating behavior behind an experimental flag, raising coded errors, working on the permission system, writing DI/Scope tests, porting business logic from agent-core (v1) to v2, triaging a main-branch commit against v2, or exposing a v2 domain over server-v2 while keeping the /api/v1 wire contract compatible with released clients. Self-contained guide organized by development stage (orient → design → implement → test → verify) plus align workflows for v1→v2 migration, main-branch commit triage, and server-v2 wire exposure; each file carries the rules, examples, and red lines for its step.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

PyModel/pythinker-code292026년 10월 18일 업데이트

Apply an approved sub-skill grouping by moving user-specified skills into a parent bundle, with timestamped backups of every modified directory.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

PyModel/pythinker-code292026년 10월 18일 업데이트

dogfood

무료

Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to "dogfood", "QA", "exploratory test", "find issues", "bug hunt", "test this app/site/platform", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

PyModel/pythinker-code292026년 10월 18일 업데이트

electron

무료

Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include "automate Slack app", "control VS Code", "interact with Discord app", "test this Electron app", "connect to desktop app", or any task requiring automation of a native Electron application.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

PyModel/pythinker-code292026년 10월 18일 업데이트

Use when generating changesets in the pythinker-code repository — deciding whether to write one, which package to list, the bump level, the wording, and the confirmation workflow.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

PyModel/pythinker-code292026년 10월 18일 업데이트

PyModel의 스킬 모두 보기

이 스킬의 문제 신고