{"id":51653075,"url":"https://github.com/baigaoa/ink-cartridge","last_synced_at":"2026-07-14T06:00:31.957Z","repository":{"id":358422458,"uuid":"1241215288","full_name":"BAIGAOa/ink-cartridge","owner":"BAIGAOa","description":"A framework and toolset for complex React Ink applications","archived":false,"fork":false,"pushed_at":"2026-07-08T16:21:47.000Z","size":3148,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-08T18:13:25.707Z","etag":null,"topics":["cli","ink","react","router","screen","typescrpt"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BAIGAOa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-17T05:13:52.000Z","updated_at":"2026-07-08T16:22:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/BAIGAOa/ink-cartridge","commit_stats":null,"previous_names":["baigaoa/ink-trc","baigaoa/ink-kit","baigaoa/ink-router-kit","baigaoa/ink-cartridge"],"tags_count":50,"template":false,"template_full_name":null,"purl":"pkg:github/BAIGAOa/ink-cartridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BAIGAOa%2Fink-cartridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BAIGAOa%2Fink-cartridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BAIGAOa%2Fink-cartridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BAIGAOa%2Fink-cartridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BAIGAOa","download_url":"https://codeload.github.com/BAIGAOa/ink-cartridge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BAIGAOa%2Fink-cartridge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35448565,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-14T02:00:06.603Z","response_time":114,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","ink","react","router","screen","typescrpt"],"created_at":"2026-07-14T06:00:18.726Z","updated_at":"2026-07-14T06:00:31.948Z","avatar_url":"https://github.com/BAIGAOa.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n        \u003cbr\u003e\n        \u003cbr\u003e\n        \u003cimg width=\"440\" alt=\"cartridge\" src=\"static/cartridge.png\"\u003e\n        \u003cbr\u003e\n        \u003cbr\u003e\n        \u003cbr\u003e\t\t\t\t\t \n\u003c/div\u003e\n\n\u003ch1 align=\"center\"\u003eCartridge\u003c/h1\u003e\n\n\u003eA component kit for rapidly building complex, multi-page, interaction-heavy terminal applications — filling the critical gaps Ink leaves open.\n\n[![CI](https://github.com/BAIGAOa/ink-cartridge/actions/workflows/ci.yml/badge.svg)](https://github.com/BAIGAOa/ink-trc/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/ink-cartridge.svg)](https://www.npmjs.com/package/ink-cartridge)\n[![npm version](https://img.shields.io/npm/v/@cartridge-engine/keyboard-engine.svg?label=keyboard-engine)](https://www.npmjs.com/package/@cartridge-engine/keyboard-engine)\n[![coverage](https://img.shields.io/badge/coverage-90%25-brightgreen)](https://github.com/BAIGAOa/ink-cartridge)\n[![coverage](https://img.shields.io/badge/keyboard--engine%20coverage-90%25-brightgreen)](https://github.com/BAIGAOa/ink-cartridge)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## Table of Contents\n\n- [Design Philosophy](#design-philosophy)\n- [Installation](#installation)\n- [Scaffold](#scaffold)\n- [Documentation](#documentation)\n- [For AI](#for-ai)\n- [Other](#other)\n- [License](#license)\n\n## Design Philosophy\n\nInk gives you `useInput` and `render`. Everything else — screen navigation, layered keyboard events, focus management, cross-component communication — you build yourself. ink-cartridge provides all of that, designed for **multi-page, interaction-dense terminal apps** where a single global `useInput` with `if-else` chains breaks down.\n\nTWO pillars:\n\n- **Screen as component** — Every React component is a screen. Register them into a tree, navigate with `skip` / `back` / `gotoScreen`. No hand-written conditional rendering.\n- **Layered keyboard engine** — Each screen owns its key bindings. A 9-stage pipeline resolves conflicts between modals, overlays, global keys, and the screen stack. Focus system partitions keys within the same layer.\n\n\n## Installation\n\n```bash\nnpm install ink-cartridge\n```\n\n## Scaffold\n\n```bash\nnpx ink-cartridge init my-tui\n```\n\n## Install the keyboard engine\n\n```bash\nnpm install @cartridge-engine/keyboard-engine\n```\n\n\n## Documentation\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ekeyboard/\u003c/b\u003e — Architecture \u0026amp; API index\u003c/summary\u003e\n\n- [README](docs/keyboard/README.md) — Architecture \u0026amp; API index\n- [KeyboardProvider](docs/keyboard/KeyboardProvider-API.md)\n- [useKeyboard](docs/keyboard/useKeyboard-API.md)\n- [boundKeyboard](docs/keyboard/boundKeyboard-API.md)\n- [boundSequence](docs/keyboard/boundSequence-API.md)\n- [penetration](docs/keyboard/penetration-API.md)\n- [stop](docs/keyboard/stop-API.md)\n- [compositionEngine](docs/keyboard/compositionEngine-API.md)\n- [setValueSchema](docs/keyboard/setValueSchema-API.md)\n- [globalKeys](docs/keyboard/globalKeys-API.md)\n- [globalSequence](docs/keyboard/globalSequence-API.md)\n- [focus system](docs/keyboard/focus-system-API.md)\n- [shortcut actions](docs/keyboard/shortcut-actions-API.md)\n- [sequence actions](docs/keyboard/sequence-actions-API.md)\n- [allowModal](docs/keyboard/allowModal-API.md)\n- [useModalMissListener](docs/keyboard/useModalMissListener-API.md)\n- [enableWildcardPriority](docs/keyboard/enableWildcardPriority-API.md)\n- [Mode System](docs/keyboard/mode-system-API.md)\n- [addProcessor](docs/keyboard/addProcessor-API.md)\n- [removeProcessor](docs/keyboard/removeProcessor-API.md)\n- [thereGlobalQueueWaiting](docs/keyboard/thereGlobalQueueWaiting-API.md)\n- [currentScreenHasSequenceWaiting](docs/keyboard/currentScreenHasSequenceWaiting-API.md)\n- [advanced](docs/keyboard/advanced.md)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003escreen/\u003c/b\u003e — Architecture \u0026amp; API index\u003c/summary\u003e\n\n- [README](docs/screen/README.md) — Architecture \u0026amp; API index\n- [registerComponent](docs/screen/registerComponent-API.md)\n- [ScenarioManagementProvider](docs/screen/ScenarioManagementProvider-API.md)\n- [CurrentScreen](docs/screen/CurrentScreen-API.md)\n- [useScreenSystem](docs/screen/useScreenSystem-API.md)\n- [skip](docs/screen/skip-API.md)\n- [back](docs/screen/back-API.md)\n- [gotoScreen](docs/screen/gotoScreen-API.md)\n- [overlay](docs/screen/overlay-API.md)\n- [modal](docs/screen/modal-API.md)\n- [ModalContext](docs/screen/ModalContext-API.md)\n- [advanced](docs/screen/advanced.md)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eevent/\u003c/b\u003e — Architecture \u0026amp; API index\u003c/summary\u003e\n\n- [README](docs/event/README.md) — Architecture \u0026amp; API index\n- [createEventBus](docs/event/createEventBus-API.md)\n- [EventProvider](docs/event/EventProvider-API.md)\n- [useEmitter](docs/event/useEmitter-API.md)\n- [useSubscribe](docs/event/useSubscribe-API.md)\n- [useEventBus](docs/event/useEventBus-API.md)\n- [EventBus](docs/event/EventBus-API.md)\n- [advanced](docs/event/advanced.md)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ecomponents/\u003c/b\u003e — Component index\u003c/summary\u003e\n\n- [README](docs/components/README.md) — Component index\n- [SelectInput](docs/components/SelectInput/SelectInput-API.md)\n- [SelectRow](docs/components/SelectRow/SelectRow-API.md)\n- [MultiSelectInput](docs/components/MultiSelectInput/MultiSelectInput-API.md)\n- [TextInput](docs/components/TextInput/TextInput-API.md)\n- [UncontrolledTextInput](docs/components/TextInput/UncontrolledTextInput-API.md)\n- [NumberInput](docs/components/NumberInput/NumberInput-API.md)\n- [SearchBar](docs/components/SearchBar/SearchBar-API.md)\n- [SearchInput](docs/components/SearchInput/SearchInput-API.md)\n- [ConfirmDialog](docs/components/ConfirmDialog/ConfirmDialog-API.md)\n- [Spinner](docs/components/Spinner/Spinner-API.md)\n- [ProgressBar](docs/components/ProgressBar/ProgressBar-API.md)\n- [Divider](docs/components/Divider/Divider-API.md)\n- [Badge](docs/components/Badge/Badge-API.md)\n- [KeyHint](docs/components/KeyHint/KeyHint-API.md)\n- [Tabs](docs/components/Tabs/Tabs-API.md)\n- [Fold](docs/components/Fold/Fold-API.md)\n- [Form](docs/components/Form/Form-API.md)\n- [Field](docs/components/Form/Field-API.md)\n- [useFormContext](docs/components/Form/useFormContext-API.md)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003etheme/\u003c/b\u003e\u003c/summary\u003e\n\n- [README](docs/theme/README.md)\n- [ThemeProvider](docs/theme/ThemeProvider-API.md)\n- [useTheme](docs/theme/useTheme-API.md)\n- [advanced](docs/theme/advanced.md)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003elanguage/\u003c/b\u003e\u003c/summary\u003e\n\n- [README](docs/language/README.md)\n- [LanguageProvider](docs/language/LanguageProvider-API.md)\n- [useI18n](docs/language/useI18n-API.md)\n- [advanced](docs/language/advanced.md)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003edev-tool/\u003c/b\u003e\u003c/summary\u003e\n\n- [README](docs/dev-tool/README.md)\n- [openDevTool](docs/dev-tool/openDevTool-API.md)\n- [closeDevTool](docs/dev-tool/closeDevTool-API.md)\n\u003c/details\u003e\n\n## For AI\n\nWe actively support human-AI collaborative development — AI writes, humans lead and review. Every AI-generated change must be understood, verified, and signed off by a person.\n\nThe project ships with specifications and workflows purpose-built for AI coding agents:\n\n- **[AGENTS.md](AGENTS.md)** — project conventions: stack, architecture, coding rules, testing principles\n- **[agents/rules/](agents/rules/)** — conditional rules auto-loaded by file path (testing, components, public API, comments, examples)\n- **[skills/](skills/README.md)** — custom AI skills for project-specific workflows (`write-test`, `write-docs`)\n\nSee also [docs-agents/](docs-agents/) for agent reference material (test patterns, coding patterns, React guidelines, comment conventions).\n\n**This does not mean that we will maintain unlimited tolerance for the code produced by AI. Like many projects, we do not accept the junk code produced by AI.**\n\n## Examples\n\nRunnable demos for every component. See [examples/README.md](examples/README.md) for the full list and run commands.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaigaoa%2Fink-cartridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaigaoa%2Fink-cartridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaigaoa%2Fink-cartridge/lists"}