adonisjs
AdonisJSは、ORMや認証機能、バリデーション、メール機能などを標準搭載したNode.jsのフルスタックフレームワークで、Webアプリケーション開発を効率化するSkill。
📜 元の英語説明(参考)
Build full-stack web applications with AdonisJS — a batteries-included Node.js framework with ORM, auth, validation, and mailer built-in. Use when someone asks to "build a web app with Node.js", "Laravel for Node.js", "full-stack Node framework", "AdonisJS", "batteries-included backend", or "Node.js with built-in ORM and auth". Covers Lucid ORM, auth (sessions, tokens, social), VineJS validation, Edge templates, and deployment.
🇯🇵 日本人クリエイター向け解説
AdonisJSは、ORMや認証機能、バリデーション、メール機能などを標準搭載したNode.jsのフルスタックフレームワークで、Webアプリケーション開発を効率化するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o adonisjs.zip https://jpskill.com/download/14601.zip && unzip -o adonisjs.zip && rm adonisjs.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14601.zip -OutFile "$d\adonisjs.zip"; Expand-Archive "$d\adonisjs.zip" -DestinationPath $d -Force; ri "$d\adonisjs.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
adonisjs.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
adonisjsフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
AdonisJS
概要
AdonisJS はフルスタックの Node.js フレームワークであり、「Node.js の Laravel」と言えます。Express/Fastify と異なり、すべてをパッケージから組み立てる必要はなく、AdonisJS は ORM (Lucid)、認証、バリデーション (VineJS)、メーラー、キュー、テストをすぐに利用できます。規約を重視し、TypeScript を第一に考え、本番環境に対応しています。
どのような時に使うか
- Node.js で完全な Web アプリケーション (単なる API ではない) を構築する場合
- 規約に基づいたフレームワーク (Rails/Laravel のような) が必要な場合
- 組み込みの認証 (セッション、API トークン、ソーシャル OAuth) が必要な場合
- マイグレーションとモデルを使用したデータベース駆動型アプリケーション
- 設定よりも規約を好むチーム
手順
セットアップ
npm init adonisjs@latest my-app -- --kit=web
cd my-app
node ace serve --watch
ルートとコントローラー
// start/routes.ts — ルート定義
import router from "@adonisjs/core/services/router";
const UsersController = () => import("#controllers/users_controller");
router.group(() => {
router.get("/users", [UsersController, "index"]);
router.get("/users/:id", [UsersController, "show"]);
router.post("/users", [UsersController, "store"]);
router.put("/users/:id", [UsersController, "update"]);
router.delete("/users/:id", [UsersController, "destroy"]);
}).prefix("/api");
// app/controllers/users_controller.ts — バリデーション付きのコントローラー
import type { HttpContext } from "@adonisjs/core/http";
import User from "#models/user";
import { createUserValidator, updateUserValidator } from "#validators/user";
export default class UsersController {
async index({ request }: HttpContext) {
const page = request.input("page", 1);
const limit = request.input("limit", 20);
return User.query().paginate(page, limit);
}
async show({ params }: HttpContext) {
return User.findOrFail(params.id);
}
async store({ request, response }: HttpContext) {
const data = await request.validateUsing(createUserValidator);
const user = await User.create(data);
return response.created(user);
}
async update({ params, request }: HttpContext) {
const user = await User.findOrFail(params.id);
const data = await request.validateUsing(updateUserValidator);
user.merge(data);
await user.save();
return user;
}
async destroy({ params, response }: HttpContext) {
const user = await User.findOrFail(params.id);
await user.delete();
return response.noContent();
}
}
Lucid ORM (モデルとマイグレーション)
// app/models/user.ts — リレーションシップを持つ Lucid モデル
import { DateTime } from "luxon";
import { BaseModel, column, hasMany } from "@adonisjs/lucid/orm";
import type { HasMany } from "@adonisjs/lucid/types/relations";
import Post from "#models/post";
export default class User extends BaseModel {
@column({ isPrimary: true })
declare id: number;
@column()
declare email: string;
@column()
declare name: string;
@column({ serializeAs: null }) // JSON に含めない
declare password: string;
@hasMany(() => Post)
declare posts: HasMany<typeof Post>;
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime;
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime;
}
# マイグレーションの生成
node ace make:migration create_users_table
# マイグレーションの実行
node ace migration:run
# ロールバック
node ace migration:rollback
VineJS バリデーション
// app/validators/user.ts — VineJS によるリクエストのバリデーション
import vine from "@vinejs/vine";
export const createUserValidator = vine.compile(
vine.object({
email: vine.string().email().unique(async (db, value) => {
const user = await db.from("users").where("email", value).first();
return !user; // 存在してはいけない
}),
name: vine.string().minLength(2).maxLength(100),
password: vine.string().minLength(8).confirmed(), // password + password_confirmation
})
);
export const updateUserValidator = vine.compile(
vine.object({
name: vine.string().minLength(2).maxLength(100).optional(),
email: vine.string().email().optional(),
})
);
認証
// config/auth.ts — 認証設定 (セッション + API トークン)
import { defineConfig } from "@adonisjs/auth";
import { sessionGuard, sessionUserProvider } from "@adonisjs/auth/session";
import { tokensGuard, tokensUserProvider } from "@adonisjs/auth/access_tokens";
export default defineConfig({
default: "web",
guards: {
web: sessionGuard({ useRememberMeTokens: true, provider: sessionUserProvider({ model: () => import("#models/user") }) }),
api: tokensGuard({ provider: tokensUserProvider({ model: () => import("#models/user"), tokens: "accessTokens" }) }),
},
});
// app/controllers/auth_controller.ts
export default class AuthController {
async login({ request, auth, response }: HttpContext) {
const { email, password } = request.only(["email", "password"]);
const user = await User.verifyCredentials(email, password);
await auth.use("web").login(user);
return response.redirect("/dashboard");
}
async apiToken({ request, auth }: HttpContext) {
const { email, password } = request.only(["email", "password"]);
const user = await User.verifyCredentials(email, password);
const token = await User.accessTokens.create(user);
return { token: token.toJSON() };
}
}
例
例 1: 完全な CRUD Web アプリケーション
ユーザープロンプト: "AdonisJS でブログを構築する — 投稿の CRUD、ユーザー認証、サーバーでレンダリングされたページ。"
エージェントは、Lucid モデル (User, Post)、認証ミドルウェア、VineJS バリデーション、およびビュー用の Edge テンプレートを使用して、AdonisJS Web アプリケーションをスキャフォールドします。
例 2: トークン認証付き REST API
ユーザープロンプト: "AdonisJS、API トークン認証、およびページネーションを使用して REST API を作成する。"
エージェントは、API ルート、アクセストークンガード、ページネーション付きの JSON レスポンス、および Japa テストを設定します。
ガイドライン
- **`node
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
AdonisJS
Overview
AdonisJS is a full-stack Node.js framework — the "Laravel of Node.js." Unlike Express/Fastify where you assemble everything from packages, AdonisJS ships with an ORM (Lucid), authentication, validation (VineJS), mailer, queues, and testing out of the box. Opinionated, TypeScript-first, and production-ready.
When to Use
- Building a complete web application (not just an API) with Node.js
- Want an opinionated framework with conventions (like Rails/Laravel)
- Need built-in auth (sessions, API tokens, social OAuth)
- Database-driven applications with migrations and models
- Teams that prefer convention over configuration
Instructions
Setup
npm init adonisjs@latest my-app -- --kit=web
cd my-app
node ace serve --watch
Routes and Controllers
// start/routes.ts — Route definitions
import router from "@adonisjs/core/services/router";
const UsersController = () => import("#controllers/users_controller");
router.group(() => {
router.get("/users", [UsersController, "index"]);
router.get("/users/:id", [UsersController, "show"]);
router.post("/users", [UsersController, "store"]);
router.put("/users/:id", [UsersController, "update"]);
router.delete("/users/:id", [UsersController, "destroy"]);
}).prefix("/api");
// app/controllers/users_controller.ts — Controller with validation
import type { HttpContext } from "@adonisjs/core/http";
import User from "#models/user";
import { createUserValidator, updateUserValidator } from "#validators/user";
export default class UsersController {
async index({ request }: HttpContext) {
const page = request.input("page", 1);
const limit = request.input("limit", 20);
return User.query().paginate(page, limit);
}
async show({ params }: HttpContext) {
return User.findOrFail(params.id);
}
async store({ request, response }: HttpContext) {
const data = await request.validateUsing(createUserValidator);
const user = await User.create(data);
return response.created(user);
}
async update({ params, request }: HttpContext) {
const user = await User.findOrFail(params.id);
const data = await request.validateUsing(updateUserValidator);
user.merge(data);
await user.save();
return user;
}
async destroy({ params, response }: HttpContext) {
const user = await User.findOrFail(params.id);
await user.delete();
return response.noContent();
}
}
Lucid ORM (Models and Migrations)
// app/models/user.ts — Lucid model with relationships
import { DateTime } from "luxon";
import { BaseModel, column, hasMany } from "@adonisjs/lucid/orm";
import type { HasMany } from "@adonisjs/lucid/types/relations";
import Post from "#models/post";
export default class User extends BaseModel {
@column({ isPrimary: true })
declare id: number;
@column()
declare email: string;
@column()
declare name: string;
@column({ serializeAs: null }) // Never include in JSON
declare password: string;
@hasMany(() => Post)
declare posts: HasMany<typeof Post>;
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime;
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime;
}
# Generate migration
node ace make:migration create_users_table
# Run migrations
node ace migration:run
# Rollback
node ace migration:rollback
VineJS Validation
// app/validators/user.ts — Request validation with VineJS
import vine from "@vinejs/vine";
export const createUserValidator = vine.compile(
vine.object({
email: vine.string().email().unique(async (db, value) => {
const user = await db.from("users").where("email", value).first();
return !user; // Must not exist
}),
name: vine.string().minLength(2).maxLength(100),
password: vine.string().minLength(8).confirmed(), // password + password_confirmation
})
);
export const updateUserValidator = vine.compile(
vine.object({
name: vine.string().minLength(2).maxLength(100).optional(),
email: vine.string().email().optional(),
})
);
Authentication
// config/auth.ts — Auth config (sessions + API tokens)
import { defineConfig } from "@adonisjs/auth";
import { sessionGuard, sessionUserProvider } from "@adonisjs/auth/session";
import { tokensGuard, tokensUserProvider } from "@adonisjs/auth/access_tokens";
export default defineConfig({
default: "web",
guards: {
web: sessionGuard({ useRememberMeTokens: true, provider: sessionUserProvider({ model: () => import("#models/user") }) }),
api: tokensGuard({ provider: tokensUserProvider({ model: () => import("#models/user"), tokens: "accessTokens" }) }),
},
});
// app/controllers/auth_controller.ts
export default class AuthController {
async login({ request, auth, response }: HttpContext) {
const { email, password } = request.only(["email", "password"]);
const user = await User.verifyCredentials(email, password);
await auth.use("web").login(user);
return response.redirect("/dashboard");
}
async apiToken({ request, auth }: HttpContext) {
const { email, password } = request.only(["email", "password"]);
const user = await User.verifyCredentials(email, password);
const token = await User.accessTokens.create(user);
return { token: token.toJSON() };
}
}
Examples
Example 1: Full CRUD web application
User prompt: "Build a blog with AdonisJS — posts CRUD, user auth, and server-rendered pages."
The agent will scaffold an AdonisJS web app with Lucid models (User, Post), authentication middleware, VineJS validation, and Edge templates for the views.
Example 2: REST API with token auth
User prompt: "Create a REST API with AdonisJS, API token authentication, and pagination."
The agent will set up API routes, access token guard, JSON responses with pagination, and Japa tests.
Guidelines
- Use
node acefor everything — generators, migrations, REPL, deployment - Controllers stay thin — move business logic to services
- VineJS for all input — never trust
request.body()directly serializeAs: null— exclude sensitive fields (password) from JSON serialization- Lucid relations are lazy — use
.preload()or.query().preload()to eager load - Migrations are sequential — don't modify old migrations; create new ones
- Auth middleware —
router.get('/dashboard').use(middleware.auth()) - Testing with Japa — built-in test runner, no Jest needed
- Deploy:
node ace build→ runbuild/server.jsin production