Scira
Contributing

Contributing

Set up a development environment and send a pull request to Scira.

Contributions are welcome. This guide covers everything from cloning the repo to opening a PR.

Prerequisites

  • Bun ≥ 1.2 — bun.sh (used for everything: install, test, build, run)
  • Node.js ≥ 20 — required as a runtime peer for some dependencies
  • Git — to clone and branch

Verify your setup:

 bun --version  # 1.2+
 node --version # 20+

Clone and install

 git clone https://github.com/zaidmukaddam/scira-cli.git
 cd scira-cli
 bun install

Set up credentials

The CLI needs at least one LLM key and one search key to run. Copy the example env file and fill in what you have:

 cp .env.example .scira/.env
 $EDITOR .scira/.env

Verify everything is detected:

 bun run dev -- doctor

Run in development

 bun run dev          # start the TUI in watch mode
 bun run dev -- init  # run a CLI command in dev mode
 bun run dev -- "what is a Merkle tree?"

bun run dev runs the CLI directly from src/ via tsx — no build step needed. Changes to any source file reload automatically.

Build

 bun run build   # compiles to dist/
 bun link        # registers scira globally so you can call it as `scira`

Run tests

 bun test                         # run all tests once
 bun test --watch                 # watch mode
 bun test src/tools/workspace     # run a specific file or directory

Tests use Vitest (configured in vitest.config.ts). No mocks hit the real network — anything that calls an external service is integration-tested via recorded fixtures or needs credentials in .scira/.env.

Project structure

src/
├── agent/
│   └── research-agent.ts   # main agent loop (tool calls, turn management)
├── cli/
│   ├── index.ts             # CLI entry point (command definitions)
│   └── commands/            # one file per CLI command
├── config/
│   ├── env-store.ts         # reads ~/.scira/.env and .scira/.env
│   └── env-guide.ts         # per-key signup links and descriptions
├── tools/
│   ├── search-web.ts        # Exa / Parallel / Firecrawl adapters
│   ├── file-tools.ts        # readUrl, writeFile, readFile
│   ├── workspace.ts         # run directory management
│   ├── todos.ts             # plan.md / claims.jsonl helpers
│   └── agent-tools.ts       # tool definitions exposed to the agent
└── ui/
    └── ink/
        ├── SciraApp.tsx      # root TUI component
        ├── hooks/            # useAgentTurn, useSession, useSubmit, …
        ├── components/       # overlays, spinners, source list
        └── theme.ts          # theme tokens and dark/light logic
docs/                         # this Next.js documentation site

Code style

  • TypeScript throughout — no any unless genuinely unavoidable
  • Prettier for formatting (run bun run format before committing)
  • ESLint for linting (run bun run lint)
  • Prefer async/await over .then() chains
  • Keep tool adapters stateless — they receive config, call a network API, return structured data

Areas that need help

If you're looking for somewhere to start, these are the most useful contributions:

  • Search provider adapters — new backends for src/tools/search-web.ts (see the banned list below before you start)
  • Export formats — PDF, HTML, or Obsidian-flavored markdown in the scira export command
  • TUI improvements — keyboard shortcuts, better source display, inline diff for claims
  • Test coveragesrc/tools/ is well-covered; src/agent/ and src/cli/commands/ need more tests
  • Windows support — the TUI currently assumes a POSIX terminal; PRs that improve Windows compatibility are appreciated
  • Documentation — typos, missing examples, unclear descriptions

Banned search providers

Scira does not accept adapters for Tavily, Brave Search, or Perplexity. PRs adding them will be closed. Stick to the supported backends — Exa, Parallel, and Firecrawl — or open an issue to discuss a new one first.

Opening a pull request

  1. Fork the repo and create a branch: git checkout -b feat/my-change
  2. Make your changes, write or update tests, and confirm bun test passes
  3. Run bun run lint and bun run format
  4. Push and open a PR against main
  5. Describe what changed and why — link to any relevant issues

Keep PRs focused

One logical change per PR makes review faster and merge conflicts rarer. If you're fixing a bug and also want to refactor something nearby, split them.

Reporting issues

Open an issue at github.com/zaidmukaddam/scira-cli/issues. Include:

  • Scira version (scira --version)
  • Operating system and shell
  • The exact command or TUI action that triggered the problem
  • Any error output (from ~/.scira/logs/ if available)

On this page