---
alwaysApply: true
---
プロジェクトルール
===

## 0. 規範表現（RFC 2119）と Lint方針

このドキュメントの規範キーワードは以下の意味で扱う。
- **MUST**: 必須。違反はレビューで差し戻し対象
- **SHOULD**: 強い推奨。逸脱時は理由を記録する
- **MAY**: 任意。採用時は周辺整合性を優先する
- **MUST NOT**: 禁止。明示的な合意なしに導入してはならない

各ルールには Rule ID を付与する。
- 形式: `SYW-<DOMAIN>-<NNN>`
- 併記形式: `[ID][LEVEL][CHECK]`
- `CHECK` の意味:
  - `grep`: 文字列や配置で確認しやすい
  - `manual`: レビューで確認する
  - `test`: テストで確認する
  - `doc`: 文書整合の確認

本文とルール一覧が矛盾した場合は、ルール一覧を優先する。

### 0.1 ルール一覧（要約）

| ID | LEVEL | CHECK | 対象 | 要件（要約） |
|---|---|---|---|---|
| SYW-GOAL-001 | MUST | manual | 全体 | 本リポジトリは Nim による RDB 向け query builder / migration / seeder を中核成果物とする |
| SYW-GOAL-002 | MUST | manual | API | Laravel Query Builder / Orator に学んだ直感的で連鎖可能な API を保つ |
| SYW-ARCH-001 | MUST | manual | 設計 | DB差分は driver 実装へ閉じ込め、公開 API は可能な限り共通化する |
| SYW-ARCH-002 | MUST NOT | manual | 設計 | 一時的な場当たり分岐を公開 API に持ち込まない |
| SYW-QB-001 | MUST | test | Query Builder | SQL 生成は決定的で、同じ入力に対し同じクエリ文字列・束縛順序を返す |
| SYW-QB-002 | MUST | manual | Query Builder | メソッドチェーンは可読性を優先し、Laravel/Orator 利用者が推測可能な命名を採用する |
| SYW-QB-003 | MUST NOT | manual | Query Builder | RDB 向け API に暗黙の破壊的副作用を持たせない |
| SYW-SCHEMA-001 | MUST | test | Migration | migration は冪等に再実行判定でき、履歴テーブルと整合する |
| SYW-SCHEMA-002 | MUST | test | Schema Builder | create / alter / drop は DB ごとの差異を吸収しつつ意味論を維持する |
| SYW-SEED-001 | MUST | test | Seeder | seeder は空判定または条件判定に基づき安全に再実行できる |
| SYW-COMPAT-001 | MUST | manual | 互換性 | 既存公開 API の破壊的変更は、必要性・移行方針・影響範囲を文書化する |
| SYW-TEST-001 | MUST | test | テスト | 修正した機能レイヤに対応するテストを追加または更新する |
| SYW-TEST-002 | SHOULD | test | テスト | DB 横断の共通仕様は複数 driver で検証する |
| SYW-DOC-001 | MUST | doc | ドキュメント | README / documents / ルール文書は、公開仕様変更時に同期する |
| SYW-SCOPE-001 | MUST NOT | manual | スコープ | ORM 全面実装を前提にせず、query builder・schema builder の完成度を優先する |

## 1. 目的・スコープ

### 1.1 達成目標

[SYW-GOAL-001][MUST][manual]
このプロジェクトの達成目標は、**Nim 言語で Laravel の Query Builder / ORM 的な記述感と Python Orator の使いやすさを参考にした、RDB 向け query builder を実装・改善・保守すること**である。

[SYW-GOAL-002][MUST][manual]
中核機能は以下の 3 系統である。
- Query Builder
- Migration / Schema Builder
- Seeder

[SYW-GOAL-003][MUST][manual]
利用者は「生 SQL を毎回手で組み立てなくても、読みやすいメソッドチェーンで安全に RDB を扱える」ことを期待している。実装判断は常にこの期待を優先する。

### 1.2 主要スコープ

[SYW-SCOPE-001][MUST][manual]
主要スコープは以下である。
- SQLite / PostgreSQL / MySQL / MariaDB などの RDB 向け query builder
- create / alter / drop を扱う schema builder
- migration 履歴管理
- 初期データ投入用 seeder
- 非同期実行を前提とした接続・実行モデル

[SYW-SCOPE-002][SHOULD][manual]
既存コードベースに SurrealDB 実装が存在していても、判断に迷った場合はまず RDB 向け API 品質を優先する。

### 1.3 非スコープ

[SYW-SCOPE-003][MUST NOT][manual]
以下は明示的な要件がない限り優先しない。
- Active Record 的な重い ORM 機能の全面拡張
- マジックに依存した暗黙変換の追加
- driver ごとに大きく振る舞いが異なる独自 API の増殖

## 2. 設計原則

### 2.1 API 原則

[SYW-ARCH-001][MUST][manual]
公開 API は driver 差分より先に、利用者の記述体験を基準に設計する。各 driver の都合は内部実装で吸収する。

[SYW-QB-002][MUST][manual]
メソッド名・引数順・返り値は、Laravel Query Builder / Orator を知る利用者が高い確率で推測できる形を優先する。

[SYW-QB-003][MUST NOT][manual]
`select`, `where`, `join`, `insert`, `update`, `delete`, `first`, `find`, `get` などの基本操作に、利用者が予期しない破壊的副作用を持ち込んではならない。

[SYW-COMPAT-001][MUST][manual]
公開 API の破壊的変更を行う場合は、少なくとも以下を変更箇所に残す。
- 何が壊れるか
- なぜ必要か
- 既存利用者の移行方法

### 2.2 実装分離

[SYW-ARCH-002][MUST NOT][manual]
「特定 driver だけ通すための場当たり的 if 文」を上位 API 層へ散在させてはならない。分岐は generator / lib / model など責務のある層へ閉じ込める。

[SYW-ARCH-003][MUST][manual]
責務分離の目安は以下とする。
- 接続管理: `connection` 系
- API 入口と共通操作: `query_builder` / `schema_builder`
- DB 方言差分: `models/*/query/*`, `libs/*`
- 実行・変換: `*_exec`, `*_types`, `*_query`

[SYW-ARCH-004][SHOULD][manual]
新機能は、まず共通仕様を言語化してから driver 差分へ展開する。最初に 1 driver だけ特殊実装へ逃がさない。

## 3. Query Builder ルール

[SYW-QB-001][MUST][test]
同じ builder 入力は、同じ SQL 文字列と同じ bind 順序を生成しなければならない。出力が非決定的になる変更は禁止する。

[SYW-QB-004][MUST][manual]
where 句、join、group by、order by、limit / offset、paginate などの句の結合順は、利用者の記述順と SQL としての自然順を壊さない。

[SYW-QB-005][SHOULD][manual]
値の埋め込みよりも、既存のプレースホルダ・エスケープ・型変換の仕組みを優先して使う。

[SYW-QB-006][MUST][test]
`first` / `find` / `get` の空結果時の振る舞いは既存仕様を維持する。`Option` や空シーケンスの扱いを無言で変えてはならない。

[SYW-QB-007][SHOULD][manual]
ログ出力やデバッグ補助を追加する場合は、通常経路の性能や API 純度を汚さない。

## 4. Migration / Schema Builder ルール

[SYW-SCHEMA-001][MUST][test]
migration は履歴テーブルにより再実行可否を判定できなければならない。二重適用や履歴不整合を起こす変更は禁止する。

[SYW-SCHEMA-002][MUST][test]
`create`, `alter`, `drop`, `rename`, `add column`, `change column`, `drop column` は、DB ごとの差異があっても利用者にとって一貫した意味を維持する。

[SYW-SCHEMA-003][MUST][manual]
破壊的な schema 操作を追加・変更する場合は、ロールバック不能性やデータ移行影響を必ず確認する。

[SYW-SCHEMA-004][SHOULD][manual]
column 定義 API は Laravel ライクな表現を優先し、命名やオプションの意味が直感に反しないようにする。

## 5. Seeder ルール

[SYW-SEED-001][MUST][test]
seeder は再実行時に重複データを無制限に増やさないよう、空テーブル判定または列条件判定を用いる既存思想を維持する。

[SYW-SEED-002][SHOULD][manual]
サンプル seeder と実装が乖離した場合は、利用者が最初に触れる example を優先して同期する。

## 6. テスト・品質保証

[SYW-TEST-001][MUST][test]
コード変更時は、影響する最小レイヤのテストを追加または更新する。
- query 生成を変えたら query テスト
- schema 操作を変えたら schema / create_schema テスト
- トランザクションを変えたら transaction テスト
- utility を変えたら utils テスト

[SYW-TEST-002][SHOULD][test]
共通 API の変更は、可能な限り SQLite だけでなく PostgreSQL / MySQL / MariaDB 系にも同種の検証を広げる。

[SYW-TEST-003][MUST][manual]
テスト追加が難しい場合は、その理由と未検証リスクを作業記録へ残す。

## 7. ドキュメント・例・後方互換

[SYW-DOC-001][MUST][doc]
公開仕様を変えたら、必要に応じて以下を同期する。
- `README.md`
- `documents/rdb/*.md`
- `example/`
- `.cursor/rules/*.mdc`

[SYW-DOC-002][SHOULD][doc]
サンプルコードは「最短で使い方が伝わる」ことを優先し、実装とズレた古い記法を放置しない。

## 8. 実装判断の優先順位

[SYW-PRIO-001][MUST][manual]
判断に迷った場合の優先順位は以下とする。
1. 利用者にとって API が自然か
2. 既存公開仕様を壊さないか
3. 複数 RDB で意味が揃うか
4. 内部実装が責務分離されているか
5. テストと文書で保守できるか

## 9. このプロジェクトで避けること

[SYW-ANTI-001][MUST NOT][manual]
以下は避ける。
- 一部 driver だけを通すための公開 API 汚染
- テストなしの SQL 生成変更
- migration 履歴や seeder 冪等性を壊す変更
- README と実装の乖離放置
- Nim らしさよりも複雑なマジックを優先すること
