Thank you for your interest in contributing to FigyTerm! This guide will help you get started.
- Code of Conduct
- Getting Started
- Development Setup
- Making Changes
- Commit Guidelines
- Pull Requests
- Adding Command Specs
- Reporting Bugs
- Feature Requests
This project follows a standard Code of Conduct. Be respectful, constructive, and inclusive in all interactions.
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/figyterm.git cd figyterm - Add upstream remote:
git remote add upstream https://github.com/code4mk/figyterm.git
| Tool | Version | Install |
|---|---|---|
| Node.js | 18+ | nodejs.org |
| Rust | 1.86+ | rustup.rs |
| Tauri CLI | 2.x | cargo install tauri-cli |
xcode-select --install# Install frontend dependencies
npm install
# Start development mode
npm run tauri devThis starts:
- Vite dev server with HMR (frontend)
- Rust compilation and Tauri window (backend)
# Type check frontend
npx tsc --noEmit
# Check Rust compilation
cd src-tauri && cargo check
# Production build
npm run tauri build
# Format Rust code
cd src-tauri && cargo fmt
# Lint Rust code
cd src-tauri && cargo clippyCreate a descriptive branch from main:
git checkout -b feat/split-pane-resize
git checkout -b fix/autocomplete-popup-position
git checkout -b docs/add-spec-guidePrefixes:
feat/— New featurefix/— Bug fixrefactor/— Code refactoringdocs/— Documentationchore/— Build, CI, dependency updates
TypeScript/React:
- Use functional components with hooks
- Prefer named exports
- Use Tailwind CSS for styling (no inline styles unless dynamic)
- Keep components focused — split large components into sub-components
Rust:
- Follow standard Rust conventions (
cargo fmt) - Use
Resultfor fallible operations - Document public functions
We follow conventional commit style:
<type>: <short description>
<optional body explaining why>
Types:
| Type | Usage |
|---|---|
feat |
New feature |
fix |
Bug fix |
refactor |
Code change that neither fixes a bug nor adds a feature |
docs |
Documentation changes |
style |
Formatting, missing semicolons (no code logic change) |
perf |
Performance improvement |
test |
Adding or updating tests |
chore |
Build process, CI, dependency updates |
Examples:
feat: Add split pane support with Cmd+D shortcut
fix: Resolve autocomplete popup appearing inside quoted strings
docs: Add spec authoring guide
- Keep PRs focused — one feature or fix per PR
- Update the README if your change affects user-facing behavior
- Add/update specs in
src/specs/if adding command support - Test your changes:
- Run
npm run tauri devand verify the feature works - Run
npx tsc --noEmitto ensure no type errors - Run
cd src-tauri && cargo checkfor Rust changes
- Run
- Write a clear PR description explaining what and why
## Summary
Brief description of changes.
## Changes
- Added X
- Fixed Y
- Updated Z
## Testing
How you verified the changes work correctly.
## Screenshots (if UI change)
Before/after screenshots.One of the easiest ways to contribute is adding autocomplete specs for new commands.
See the Spec Authoring Guide for detailed instructions.
Quick summary:
- Create
src/specs/yourcommand.ts - Define subcommands, options, and argument generators
- Register it in
src/specs/index.ts - Test with
npm run tauri dev
When filing a bug report, please include:
- FigyTerm version (from Settings or
package.json) - macOS version
- Shell (zsh, bash, fish)
- Steps to reproduce
- Expected behavior
- Actual behavior
- Screenshots (if visual bug)
Use the Bug Report issue template.
We welcome ideas! When requesting a feature:
- Check existing issues to avoid duplicates
- Describe the use case — what problem does it solve?
- Suggest an approach (optional) — how might it work?
Use the Feature Request issue template.
Understanding the codebase:
| Area | Location | Purpose |
|---|---|---|
| UI Components | src/components/ |
React components (Terminal, TabBar, Settings) |
| Autocomplete | src/services/figy-autocomplete-engine.ts |
Spec parsing & suggestion logic |
| Specs | src/specs/ |
Command definitions (git, docker, etc.) |
| State | src/stores/ |
Zustand stores for settings, themes |
| Rust Commands | src-tauri/src/commands/ |
IPC handlers for PTY, filesystem, shell |
| PTY | src-tauri/src/commands/terminal.rs |
Shell session management |
User types → xterm.js onData → inputBuffer → triggerAutocomplete()
→ figy-autocomplete-engine (parse tokens, match spec)
→ SuggestionPopup (rendered via floating-ui)
→ User selects → acceptSuggestion() → write to PTY
Open a Discussion or reach out in issues. We're happy to help!