docyrus-app-dev について
docyrus-app-devは、Docyrusをバックエンドに使うReact TypeScript製Webアプリの開発スキルです。OAuth2 PKCE認証、生成済みコレクションフック、テナントのデータソース検索を扱います。
主な機能
- 01OAuth2 PKCE認証
- 02生成済みReactコレクションフック
- 03フィルターと集計を使うデータ検索
- 04データソースレコードのCRUD操作
- 05TanStack Queryのパターン
活用シーン
- 01Docyrusアプリの認証設定
- 02テナントデータの検索とページ分割
- 03データソースレコードの作成・更新
MCP 対応
スキーマ変更後にdocyrus-architect MCPツールでテナントのOpenAPI仕様を再生成し、コレクションを更新する手順を説明します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ docyrus/ agent-skills --skill docyrus-app-devインストール後、Claude Code で/docyrus-app-devを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-client-and-auth.mdcollections-and-patterns.mddata-source-query-guide.mdformula-design-guide-llm.mdquery-guide.md詳細
Docyrus App Developer
Docyrus をバックエンドとして、React TypeScript の Web アプリを構築します。OAuth2 PKCE で認証し、高度なフィルタリングや集計を使ってデータソースをクエリし、確立されたパターンに従います。
技術スタック
- React 19 + TypeScript + Vite
- TanStack Router(コードベース)、TanStack Query(サーバー状態)
- Tailwind CSS v4、shadcn/ui コンポーネント
@docyrus/api-client(REST クライアント)+@docyrus/signin(認証プロバイダー)- OpenAPI 仕様から自動生成されるコレクション
クイックスタート:新しいアプリのセットアップ
- ルートを
DocyrusAuthProviderでラップします:
import { DocyrusAuthProvider } from '@docyrus/signin'
<DocyrusAuthProvider
apiUrl={import.meta.env.VITE_API_BASE_URL}
clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
callbackPath="/auth/callback"
>
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
</DocyrusAuthProvider>
- App.tsx で認証状態を確認し、コレクションフックを使います:
const { status } = useDocyrusAuth()
const { getMyInfo } = useUsersCollection()
if (status === 'loading') return <Spinner />
if (status === 'unauthenticated') return <SignInButton />
- コンポーネントでコレクションフックを使います:
const { list } = useBaseProjectCollection()
const { data: projects } = useQuery({
queryKey: ['projects'],
queryFn: () => list({
columns: ['name', 'status', 'record_owner(firstname,lastname)'],
filters: { rules: [{ field: 'status', operator: '!=', value: 'archived' }] },
orderBy: 'created_on DESC',
limit: 50,
}),
})
重要なルール
.list()と.get()の呼び出しでは、必ずcolumnsを指定してください。指定しない場合、idのみが返されます。- コレクションは React フックです — React コンポーネント内で
useBaseProjectCollection()、useUsersCollection()などを呼び出してください。これらは内部でuseDocyrusClient()を使い、認証済みの API アクセスを行います。 - データソースのエンドポイントは動的です — テナントの OpenAPI 仕様でデータソースが定義されている場合にのみ存在します。
countの計算にはidフィールドを使ってください。sum、avg、min、maxには実際のフィールドスラッグを使ってください。- 子クエリのキーは
columnsに含める必要があります — たとえば、childQuery のキーがordersの場合、columns配列に'orders'を含めてください。 - 数式のキーは
columnsに含める必要があります — たとえば、数式のキーがtotalの場合、columns配列に'total'を含めてください。 - 現在のユーザープロフィールには、直接 API を呼び出すのではなく、
useUsersCollection().getMyInfo()を使ってください。
スキーマ変更後のコレクション再生成
docyrus-architect MCP ツールを使ってデータソースやフィールドを作成、更新、削除すると、アプリの自動生成コレクションは古くなります。再同期するには:
regenerate_openapi_spec(architect MCP)を呼び出して、テナントの OpenAPI 仕様を再構築し、アップロードします- 新しい仕様をリポジトリにダウンロードし、既存のファイルを上書きします:
curl -o openapi.json "<publicUrl returned from step 1>" - コレクションを再生成します:
pnpx @docyrus/tanstack-db-generator openapi.json
必ず3つの手順をまとめて実行してください。古い openapi.json や古いコレクションがあると、実行時にエンドポイントが見つからなかったり、誤ったエンドポイントが使われたりします。
コレクションの CRUD メソッド
生成されるコレクションはすべて、CRUD メソッドを返す React フックです:
const { list, get, create, update, delete: deleteOne, deleteMany } = useBaseProjectCollection()
list(params?: ICollectionListParams) // Query with filters, sort, pagination
get(id, { columns }) // Single record
create(data) // Create
update(id, data) // Partial update
deleteOne(id) // Delete one
deleteMany({ recordIds }) // Delete many
API エンドポイントのパターン:/v1/apps/{appSlug}/data-sources/{slug}/items
クエリ機能の概要
.list() メソッドは次の機能をサポートします:
| 機能 | 目的 |
|---|---|
columns | フィールドの選択、リレーションの展開 field(subfields)、エイリアス alias:field、スプレッド ...field() |
filters | 50種類以上の演算子(比較、日付の簡易指定、ユーザー関連)を使った入れ子の AND/OR グループ |
filterKeyword | 全文検索 |
orderBy | 関連フィールドを含むフィールドの方向指定付き並べ替え |
limit/offset | ページネーション(デフォルトは100) |
fullCount | 結果とともに合計件数を返す |
calculations | グループ化を伴う集計:count、sum、avg、min、max |
formulas | 計算される仮想列(単純な関数、ブロック AST、相関サブクエリ) |
childQueries | 関連する子レコードをネストされた JSON 配列として取得 |
pivot | 日付範囲の系列を含むクロス集計マトリクスクエリ |
expand | リレーション/ユーザー/列挙型フィールドについて、ID の代わりに完全なオブジェクトを返す |
クエリと数式の詳細については、以下をお読みください:
references/data-source-query-guide.mdreferences/formula-design-guide-llm.md
TanStack Query のパターン
// Query hook — call collection hook inside the component, pass methods to TanStack Query
function useProjects(params?: ICollectionListParams) {
const { list } = useBaseProjectCollection()
return useQuery({
queryKey: ['projects', 'list', params],
queryFn: () => list({ columns: PROJECT_COLUMNS, ...params }),
})
}
// Mutation hook
function useCreateProject() {
const { create } = useBaseProjectCollection()
const qc = useQueryClient()
return useMutation({
mutationFn: (data: Record<string, unknown>) => create(data),
onSuccess: () => { void qc.invalidateQueries({ queryKey: ['projects'] }) },
})
}
参考資料
詳しい情報が必要な場合は、以下のファイルをお読みください。
references/api-client-and-auth.md— RestApiClient API、@docyrus/signin フック、認証プロバイダーの設定、インターセプター、エラー処理、SSE/ストリーミング、ファイルのアップロード/ダウンロードreferences/data-source-query-guide.md— 最新のクエリペイロードガイド:列、フィルター、orderBy、ページネーション、計算、数式、子クエリ、ピボット、演算子のリファレンスreferences/formula-design-guide-llm.md—formulasペイロードの作成と検証に関する最新の数式設計ガイドreferences/collections-and-patterns.md— 生成されたコレクションフック、useUsersCollection、TanStack Query/ミューテーションフックのパターン、クエリーキーファクトリー、アプリのブートストラップフロー、ルーティングの設定、API エンドポイント