This project, "iris," is an ILR (Individualised Learner Record) toolkit that replaces Founders and Coders' existing Electron-based export tool. Its primary function is to convert learner data from CSV exports into ILR-compliant XML suitable for submission to the ESFA (Education and Skills Funding Agency).
The project is built with a TUI-first philosophy, meaning the primary interface is a beautiful, full-screen interactive terminal application. This is complemented by scriptable direct commands for automation and a cross-platform desktop GUI for users who prefer it.
All interfaces are powered by a shared core TypeScript library, ensuring that all transformation, validation, and business logic is consistent across the TUI, CLI, and desktop app.
- Runtime: Bun
- TUI Framework: @opentui/core
- Desktop Framework: Tauri (with a Rust backend that requires no custom Rust code)
- Frontend: SvelteKit with TypeScript
- Testing: Vitest
- Storage: File-based (local filesystem, no database)
- XML Generation: Native TypeScript
The architecture is centered around a shared core library in src/lib/ which handles all business logic (parsing, validation, generation, storage). This ensures consistency and avoids logic duplication.
As detailed in ADR 002, Iris follows a TUI-First Interface Design.
- Primary Interface (TUI): The default command (
iris) launches a full-screen, interactive terminal application. This is the main UX for all users. - Automation Layer (Direct Commands): Commands like
iris convert <file>can be run directly from the shell for scripting and automation, providing pretty output without launching the TUI. - Secondary Interface (Desktop GUI): A Tauri-based desktop app provides a familiar GUI experience, but its development follows the TUI.
This approach was chosen over a simple CLI or a GUI-first model to provide a rich, keyboard-centric user experience that is both powerful for technical users and discoverable for non-technical users, while being easier to distribute than a traditional desktop application.
-
Install Dependencies:
bun install
-
Run the TUI (development):
bun run src/cli.ts # Or, after linking: iris -
Run Direct Commands:
iris convert file.csv iris validate file.xml
-
Run Tests:
bun test -
Run the Desktop App (Development Mode):
bun tauri dev
-
Build the Desktop App (Production):
bun tauri build
-
Link for global development access:
bun link
IMPORTANT: Do not edit files directly unless explicitly asked. Instead:
- Show the proposed code to the user.
- Wait for the user to make the edit themselves or explicitly approve the change.
- Branch Naming:
<prefix>/<short-description>(e.g.,feat/add-validation-rules). Prefixes includefeat/,fix/,enhance/,refactor/,test/,docs/,config/. - Granularity: Branches and commits should represent minimal, tangible improvements. A single feature on the roadmap is often broken into many small, merge-ready branches.
- Verification: Never commit code that hasn't been verified to work. Run tests (
bun test) or verify functionality manually before every commit.
- Conventional Commits: The project uses conventional commits for automatic semantic versioning via
svu.fix:bumps the patch version.feat:bumps the minor version.feat!:or aBREAKING CHANGEfooter bumps the major version.
- Process: After merging to main, use
svu nextto determine the next version andgit tagto apply it.
- Fixtures Pattern: Test data is kept separate from test logic. For a module like
parser.ts, test data lives intests/fixtures/parser.tsand is imported usingimport * as fixtures from '../fixtures/parser'. This improves readability and reusability.
- File-based Storage: No database. Data is stored in
~/.iris/(e.g.,~/.iris/submissions/). - Portfolio Evidence: Every commit with KSB-relevant work is automatically tracked via git hooks in
.claude/docs/evidence-tracker.md.
iris/
├── src/
│ ├── lib/ # Shared core logic (parser, validator, generator, storage)
│ ├── tui/ # TUI interface (screens, components, workflows)
│ ├── commands/ # Direct command implementations (non-TUI)
│ ├── cli.ts # Entry point (routes to TUI or commands)
│ └── routes/ # SvelteKit desktop UI
├── src-tauri/ # Tauri Rust backend (mostly auto-generated)
├── docs/ # Documentation, roadmaps, ADRs, technical specs
│ ├── adrs/
│ ├── dev-log/
│ └── roadmaps/
├── tests/
│ ├── fixtures/ # Shared test data for different modules
│ └── lib/ # Unit tests for the core library
└── .claude/ # Internal configuration for the AI assistant