Files
artcraft/AGENTS.md
FredApps dc6006f625 Copy the shared house rules into AGENTS.md (#2749)
## Summary
- Puts the shared house-rules blocks at the top of `AGENTS.md`, copied
from craft-contrib `dde09ea31e2e457f5b4653a6e76f7cdf55944bdf`.
- Adds `.github/workflows/house-rules.yml`, which calls the shared
check.

Artcraft is the Tauri product, so it gets the core block only. The Rust
rules are for native Craft apps and shared Rust libraries.
- `CLAUDE.md` was a symlink to `AGENTS.md` and is now `@AGENTS.md`.
- No local paragraph was removed. The Tauri and TypeScript description
stays.

## Sizes
- Core block: 3,052 bytes.
- Root `AGENTS.md`: 6,934 bytes.
2026-11-06 18:44:42 +01:00

6.8 KiB

House rules

These apply in every Craft repository. A later rule may be stricter, not weaker. The source is standards/house-rules-core.md in storytold/craft-contrib. Propose changes there, not in a copy.

  1. A person is accountable. Whoever runs an agent answers for what it opens and for its review comments.
  2. Check, then claim. Before writing code, read the issue comments, search pull requests for #N and the keywords, and check recent commits on main. Comment on the issue first. Release a claim you will not finish.
  3. Verify, don't guess. Open a definition before using it. Confirm the cause in the code, even when someone names a location.
  4. Keep fixes narrow and tested. Fix what the issue describes, where the bug is. Add a test that fails without the fix.
  5. Review the diff before opening a pull request. Identifiers exist as used, the test fails without the fix, nothing unrelated changed, and the description is true.
  6. Look for a better pull request. If another fixes the same thing, close yours when it is better or equal, and say why.
  7. Report only what ran. Say what you tested and what you could not run. Without a local build or test, say so and rely on CI before marking ready.
  8. main changes through a pull request. Do not push to it. Branch protection enforces this. There is no exception.
  9. Stop and ask only about licensing outside the allowlist, publishing, releases, a new remote, secrets, spending money, destructive git, and anything else hard to undo. Otherwise keep working. plan/ is a gitignored notebook, not rules. Without it, do not ask for it and do not stop.
  10. Keep secrets and personal details out of the repository, logs and requests.
  11. CI stays shared. Workflows call storytold/craft-common-actions. Do not change CI in a feature or fix pull request. If CI cannot cover a change, open an issue there.
  12. Guards say why. A check that looks removable says what it prevents. Read that before changing it.
  13. Instructions must be readable by everyone. No notes about one machine, and no links to files a reader cannot open. craftrules is retired. Do not link to it.
  14. Keep pull requests moving. Concurrent pull requests are fine; unanswered actionable feedback is not. Respond in 7 days, a reminder at 14, closure eligible at 30, from when an actionable request waits on the author. Suggestions and unconfirmed bot findings do not start the clock. A fix, explanation or agreed plan resets it; unrelated activity does not. Waiting on a reviewer or maintainer pauses it and does not count against the author. A maintainer decides closure; it is never automatic. Reuse search results, do not poll, and stop at a rate limit.
  15. No agent attribution. A pull request does not say an agent wrote it. A repository rule may not require that.

AGENTS.md

This file provides guidance for coding agents when working with the Artcraft monorepo.

Project Overview

Artcraft is a public-facing Tauri desktop app for generating AI images and video. It uses Rust and TypeScript. Backend services, company tooling, and website builds live in the separate artcraft-services repository.

Project Structure

artcraft/
├── _database/sql/artcraft_migrations/  # Embedded SQLite task database migrations
├── .sqlx/                             # SQLite query metadata for offline builds
├── crates/
│   ├── desktop/artcraft/              # Tauri app, configuration, capabilities, icons
│   ├── api_clients/                  # Desktop provider clients and shared API types
│   ├── lib/                          # Desktop support libraries
│   ├── schema/database/sqlite_tasks/ # Desktop task persistence
│   ├── schema/public/                # Shared wire-format enums and identifiers
│   ├── testing/                      # Shared test helpers
│   └── vendor/tauri-plugin-http/      # HTTP plugin fork with cookie access
├── frontend/
│   ├── apps/artcraft/                # Tauri app frontend and public resources
│   └── libs/                         # Shared frontend libraries
├── script/artcraft/                  # Desktop development and build scripts
├── test_data/                        # Fixtures used by retained crate tests
└── Cargo.toml                        # Desktop dependency workspace

Keep external/ and secrets/ untouched. Repository pruning must preserve untracked and ignored local files; delete only Git-tracked paths unless the user explicitly authorizes a cache cleanup.

Code Style

  • Rust with no minimum supported version
  • SQLx for SQLite; prefer sqlx::query! / sqlx::query_as! compile-time checked macros over runtime sqlx::query() whenever possible
  • A mix of wreq and reqwest for Rust HTTP clients
  • 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
  • Each Tauri command belongs in its own file module, named after the command. Keep shared state, types, and helpers in separate support modules; see the Storyteller command conventions.

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.