Crowi 2.0 Migration Skill
アーキテクチャ
crowi/
├── apps/
│ ├── crowi-api/ # Fastify + ts-rest (port 3300)
│ └── crowi-web/ # Next.js 16 (port 3301)
├── packages/
│ ├── api-contract/ # ts-rest 契約定義
│ └── shared/ # 共有型
└── lib/ # 旧実装(参照元)
├── routes/ # Express ルート
├── views/ # Swig テンプレート
└── models/ # Mongoose モデル
移行パターン
Express Route → Fastify + ts-rest
// Before: lib/routes/page.js
router.get('/pages', async (req, res) => {
const pages = await Page.find();
res.render('page/list', { pages });
});
// After: packages/api-contract/src/page.ts
export const pageContract = c.router({
listPages: {
method: 'GET',
path: '/pages',
responses: { 200: z.object({ pages: z.array(PageSchema) }) },
},
});
// After: apps/crowi-api/src/routes/page.ts
listPages: async () => {
const pages = await Page.find();
return { status: 200, body: { pages } };
},
Swig Template → Next.js Page
// Before: lib/views/page/list.html
{% for page in pages %}
<div>{{ page.path }}</div>
{% endfor %}
// After: apps/crowi-web/app/(main)/pages/page.tsx
'use client';
export default function PagesPage() {
const { data } = useQuery(['pages'], () => client.page.listPages());
return data?.body.pages.map(page => <div key={page._id}>{page.path}</div>);
}
サブエージェント
| Agent |
役割 |
ツール |
| migration-planner |
計画立案 |
Read, Grep, Glob |
| migration-implementer |
実装 |
Read, Write, Edit, Bash |
| migration-reviewer |
レビュー |
Read, Grep, Bash |
| migration-committer |
コミット・PR |
Read, Bash |
ワークフロー
/migrate {task-name}
planner → implementer → reviewer ─┬→ committer
↑ │
└───────┘ (NEEDS_WORK)
タスク管理
- キュー:
.claude/migration-state/queue.json
- タスク:
.claude/migration-state/tasks/{task-id}.json
- ステータス:
PLANNED → REVIEW → APPROVED → COMMITTED
技術スタック
- API: Fastify v5, ts-rest, MongoDB/Mongoose, JWT
- Web: Next.js 16, React 19, Tailwind v4, shadcn/ui
- 共通: TypeScript 5.x strict, pnpm, Turborepo
Crowi テーマ
--crowi-primary: #43676b;
--crowi-header: #263a3c;
--crowi-sidebar: #f8f9fa;
1---2name: crowi-migration3description: Crowi 2.0 移行ワークフロー。Express/Swig から Next.js + ts-rest への移行時に自動適用。 キーワード: migrate, 移行, Express, Swig, legacy, 旧実装4---5
6# Crowi 2.0 Migration Skill
7
8## アーキテクチャ
9
10```
11crowi/
12├── apps/
13│ ├── crowi-api/ # Fastify + ts-rest (port 3300)
14│ └── crowi-web/ # Next.js 16 (port 3301)
15├── packages/
16│ ├── api-contract/ # ts-rest 契約定義
17│ └── shared/ # 共有型
18└── lib/ # 旧実装(参照元)
19 ├── routes/ # Express ルート
20 ├── views/ # Swig テンプレート
21 └── models/ # Mongoose モデル
22```
23
24## 移行パターン
25
26### Express Route → Fastify + ts-rest
27
28```typescript
29// Before: lib/routes/page.js
30router.get('/pages', async (req, res) => {
31 const pages = await Page.find();
32 res.render('page/list', { pages });
33});
34
35// After: packages/api-contract/src/page.ts
36export const pageContract = c.router({
37 listPages: {
38 method: 'GET',
39 path: '/pages',
40 responses: { 200: z.object({ pages: z.array(PageSchema) }) },
41 },
42});
43
44// After: apps/crowi-api/src/routes/page.ts
45listPages: async () => {
46 const pages = await Page.find();
47 return { status: 200, body: { pages } };
48},
49```
50
51### Swig Template → Next.js Page
52
53```typescript
54// Before: lib/views/page/list.html
55{% for page in pages %}
56 <div>{{ page.path }}</div>
57{% endfor %}
58
59// After: apps/crowi-web/app/(main)/pages/page.tsx
60'use client';
61export default function PagesPage() {
62 const { data } = useQuery(['pages'], () => client.page.listPages());
63 return data?.body.pages.map(page => <div key={page._id}>{page.path}</div>);
64}
65```
66
67## サブエージェント
68
69| Agent | 役割 | ツール |
70|-------|------|--------|
71| migration-planner | 計画立案 | Read, Grep, Glob |
72| migration-implementer | 実装 | Read, Write, Edit, Bash |
73| migration-reviewer | レビュー | Read, Grep, Bash |
74| migration-committer | コミット・PR | Read, Bash |
75
76## ワークフロー
77
78```
79/migrate {task-name}
80
81planner → implementer → reviewer ─┬→ committer
82 ↑ │
83 └───────┘ (NEEDS_WORK)
84```
85
86## タスク管理
87
88- キュー: `.claude/migration-state/queue.json`
89- タスク: `.claude/migration-state/tasks/{task-id}.json`
90- ステータス: `PLANNED` → `REVIEW` → `APPROVED` → `COMMITTED`
91
92## 技術スタック
93
94- **API**: Fastify v5, ts-rest, MongoDB/Mongoose, JWT
95- **Web**: Next.js 16, React 19, Tailwind v4, shadcn/ui
96- **共通**: TypeScript 5.x strict, pnpm, Turborepo
97
98## Crowi テーマ
99
100```css
101--crowi-primary: #43676b;
102--crowi-header: #263a3c;
103--crowi-sidebar: #f8f9fa;
104```