artcraftx/CLAUDE.md

3.8 KiB

CLAUDE.md

This file provides guidance for Claude Code when working with the ArtCraftX monorepo.

Project Overview

ArtCraftX is a pared-down desktop application for generating AI image and video. It is written in Rust (Tauri) and TypeScript (React) and contains desktop and frontend components.

Project Structure

artcraftx/
├── crates/                              # Rust workspace
│   ├── api_clients/                     # HTTP clients for calling internal and 3rd party services
│   ├── artcraftx/                       # (Important) ArtCraftX, the Tauri desktop app
│   ├── core_types/                      # Highest-level shared types: GenerationSource, CredentialId, ...
│   ├── lib/                             # Various utility libraries
│   ├── router/                          # Provider routing for generation requests (Artcraft, Fal, ...)
│   ├── schema/                          # Data definition layer
│   │   ├── local_files_database/        # Separate SQLite DB: content-hash index of local files (thumbnails, dedup)
│   │   ├── sqlite_database/             # Desktop app's "tasks" SQLite database: queries + embedded migrations
│   │   └── sqlite_identifiers/          # Enums and IDs used in sqlite queries as enums or keys
│   ├── testing/                         # Test data and test utilities
│   └── vendor/                          # Vendored third-party crates (eg. tauri-plugin-http)
├── frontend/                            # Nx typescript monorepo for the Tauri desktop app frontend
│   ├── apps/
│   │   └── artcraft/                    # ArtCraftX the Tauri app's frontend. Used with the `artcraftx` Rust crate.
│   └── libs/                            # Support libraries, reusable React components, etc.
├── script/
│   └── artcraftx/                       # Launch and build scripts for the desktop app
└── Cargo.toml                           # Rust monorepo workspace

Code Style

  • Rust with no minimum supported version
  • A mix of wreq and reqwest for Rust HTTP clients
  • SQLx for SQLite (the desktop app's local task database in sqlite_database)
  • Never use println! or eprintln! outside of tests; use log crate macros instead
  • When two crates export the same type name, alias imports with a suffix: use foo::Bar as BarFoo;
  • Prefer use imports over inline fully-qualified paths; only qualify inline for true one-offs or std collisions
  • TypeScript with Nx, React, Vite, Zustand, and Three.js
  • Use two spaces for indentation

File Layout

Organize for top-to-bottom reading. Important things first, details later.

  • Constants at the top (after imports)
  • Structs/enums next; outer structs above inner sub-structs
  • API types in order: Request, Response, Error
  • In impl blocks: constructors first, then public methods, then private helpers
  • Private helpers go below the methods that call them
  • Among helpers: meatier logic above leaf-level formatters
  • In test modules: constants first, then test cases (grouped into sub-modules when 2+), then helper functions last

Markdown

  • Tables must be space-padded so columns align in plain text. Markdown tables are read raw (terminals, diffs, editors) at least as often as rendered, and condensed tables are unreadable there. Pad every cell to its column width:

    | Model        | Configuration | Credits    | Speed | Score   |
    |--------------|---------------|--------------------|---------|
    | Meshy 6      | text or image | 104        | 80.0  | +24     |
    | Rodin 2.5    | text or image | 13         | 10.0  | +3      |
    

    Not: | Model | Configuration | Credits | Speed | Score | packed tight with varying widths per row.