Skip to content

04. 開発ワークフロー

Terminal window
git clone <repository-url>
cd niro-mcp-servers
Terminal window
# Bun のインストール(未インストールの場合)
curl -fsSL https://bun.sh/install | bash
# 依存関係のインストール
bun install
Terminal window
# 開発環境の起動
docker-compose -f docker-compose.dev.yml up -d
# ログの確認
docker-compose -f docker-compose.dev.yml logs -f confluence-md-dev
Terminal window
# .env.example をコピー
cp .env.example .env
# 必要な環境変数を設定
# - CONFLUENCE_BASE_URL: Confluence のベース URL
# - CONFLUENCE_PAT: Personal Access Token(開発用)
main # 本番環境のコード
├── develop # 開発の統合ブランチ
├── feature/* # 新機能開発
│ ├── feature/clean-html-tool
│ ├── feature/macro-expander
│ └── feature/docker-setup
├── fix/* # バグ修正
│ └── fix/markdown-conversion-bug
└── docs/* # ドキュメント更新
└── docs/api-documentation
Terminal window
# develop から feature ブランチを作成
git checkout develop
git pull origin develop
git checkout -b feature/clean-html-tool
# 作業後、develop にマージ
git checkout develop
git merge feature/clean-html-tool
# main にマージ(リリース時)
git checkout main
git merge develop
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin main --tags
<type>(<scope>): <subject>
<body>
<footer>
Type説明
feat新機能feat(cleaner): add info macro expansion
fixバグ修正fix(parser): handle nested macros correctly
docsドキュメントdocs(readme): update setup instructions
styleコードスタイルstyle(cleaner): format with prettier
refactorリファクタリングrefactor(converter): extract markdown utils
testテスト追加・修正test(cleaner): add macro expansion tests
choreビルド・設定chore(docker): update compose config
perfパフォーマンス改善perf(parser): optimize DOM traversal
  • cleaner: 共有ロジック(ConfluenceCleaner)
  • parser: HTML パーサー
  • converter: Markdown 変換
  • mcp: MCP サーバー
  • docker: Docker 環境
  • docs: ドキュメント
Terminal window
# 良い例
git commit -m "feat(cleaner): add code macro expansion support"
git commit -m "fix(parser): handle empty macro body"
git commit -m "docs(specs): add Docker configuration"
# 悪い例(避ける)
git commit -m "update"
git commit -m "fix bug"
git commit -m "WIP"
Terminal window
# feature ブランチで作業完了後
git push origin feature/clean-html-tool
# GitHub で PR を作成
# Base: develop ← Compare: feature/clean-html-tool
## 概要
この PR の目的を簡潔に説明
## 変更内容
- [ ] 〇〇機能を追加
- [ ] △△のバグを修正
- [ ] ××のテストを追加
## 関連 Issue
Closes #123
## テスト方法
1. Docker 環境を起動
2. `bun test` を実行
3. 〇〇を確認
## スクリーンショット(必要に応じて)
## チェックリスト
- [ ] テストが通る
- [ ] ドキュメントを更新した
- [ ] コミットメッセージが規約に従っている
  • コードの品質: TypeScript の型安全性、エラーハンドリング
  • テストカバレッジ: 新機能には必ずテストを追加
  • ドキュメント: API の変更はドキュメントも更新
  • パフォーマンス: 大量データでの動作確認
  • セキュリティ: 外部入力のバリデーション
// ✅ 良い例: 明示的な型定義
interface CleanOptions {
format?: 'markdown' | 'plaintext';
removeUnwanted?: boolean;
expandMacros?: boolean;
maxLength?: number;
}
export class ConfluenceCleaner {
clean(html: string, options: CleanOptions = {}): CleanedContent {
// 実装
}
}
// ❌ 悪い例: any 型の乱用
function process(data: any): any {
return data;
}
// クラス: PascalCase
class ConfluenceCleaner {}
// 関数・変数: camelCase
function convertToMarkdown() {}
const pageContent = '';
// 定数: UPPER_SNAKE_CASE
const MAX_PAGE_SIZE = 1000;
// インターフェース: PascalCase(I プレフィックスなし)
interface CleanedContent {}
// 型エイリアス: PascalCase
type MacroType = 'info' | 'warning' | 'code';
src/cleaner.ts
// 1. Import 文
import { JSDOM } from "jsdom";
import TurndownService from "turndown";
// 2. 型定義
export interface CleanOptions {
// ...
}
// 3. 定数
const SELECTORS_TO_REMOVE = [
'script',
'style',
];
// 4. クラス実装
export class ConfluenceCleaner {
// コンストラクタ
constructor() {}
// パブリックメソッド
clean() {}
// プライベートメソッド
private removeUnwanted() {}
}
  • テストランナー: Bun のビルトインテストランナー
  • ユニットテスト: Bun test
  • 統合テスト: Bun test + Docker
  • E2E テスト: 実際の Confluence ページを使用

Bun には Jest 互換のテストランナーが組み込まれているため、追加のテストライブラリは不要です。

packages/shared/confluence-cleaner/src/cleaner.test.ts
import { describe, it, expect } from 'bun:test';
import { ConfluenceCleaner } from './cleaner';
describe('ConfluenceCleaner', () => {
describe('clean', () => {
it('should convert info macro to blockquote', () => {
const cleaner = new ConfluenceCleaner();
const html = `
<ac:structured-macro ac:name="info">
<ac:rich-text-body><p>Test info</p></ac:rich-text-body>
</ac:structured-macro>
`;
const result = cleaner.clean(html);
expect(result.markdown).toContain('> ℹ️ Info: Test info');
expect(result.metadata.macrosExpanded).toBe(1);
});
it('should handle empty HTML', () => {
const cleaner = new ConfluenceCleaner();
const result = cleaner.clean('');
expect(result.markdown).toBe('');
expect(result.plaintext).toBe('');
});
it('should remove unwanted elements', () => {
const cleaner = new ConfluenceCleaner();
const html = '<script>alert("xss")</script><p>Content</p>';
const result = cleaner.clean(html);
expect(result.markdown).not.toContain('script');
expect(result.markdown).toContain('Content');
});
});
});
Terminal window
# すべてのテストを実行
bun test
# 特定のファイルのテストを実行
bun test cleaner.test.ts
# カバレッジを確認
bun test --coverage
# Watch モードで実行
bun test --watch
  • 共有ロジック: 80% 以上
  • MCP サーバー: 70% 以上
  • 重要な機能: 90% 以上
Terminal window
# TypeScript の型チェック
bun run typecheck
# ビルドエラーの確認
bun run build
# MCP サーバーをローカルで起動してログ確認
bun run --filter @niro/mcp-confluence-md dev
Terminal window
# コンテナのログを確認
docker-compose -f docker-compose.dev.yml logs -f
# コンテナ内に入ってデバッグ
docker-compose -f docker-compose.dev.yml exec confluence-md-dev sh
# コンテナ内でテストを実行
docker-compose -f docker-compose.dev.yml exec confluence-md-dev bun test
// ログ出力の例
console.error('Debug:', { html, options }); // stderr に出力
// MCP サーバーは stdio を使うため、console.log は避ける
// デバッグ用のログは console.error を使用
Terminal window
# パッチバージョン (1.0.0 → 1.0.1)
bun version patch
# マイナーバージョン (1.0.0 → 1.1.0)
bun version minor
# メジャーバージョン (1.0.0 → 2.0.0)
bun version major
CHANGELOG.md
## [1.1.0] - 2025-11-26
### Added
- info/warning/code マクロのサポート
- Docker 環境の構築
### Fixed
- 空の HTML を処理する際のバグ修正
### Changed
- パフォーマンス改善(処理速度 20% 向上)
Terminal window
# タグを作成
git tag -a v1.1.0 -m "Release v1.1.0"
# タグをプッシュ
git push origin v1.1.0

問題 1: Bun のインストールエラー

Section titled “問題 1: Bun のインストールエラー”
Terminal window
# 解決策: 最新版を再インストール
curl -fsSL https://bun.sh/install | bash
source ~/.bashrc # または ~/.zshrc

問題 2: Docker コンテナが起動しない

Section titled “問題 2: Docker コンテナが起動しない”
Terminal window
# ログを確認
docker-compose -f docker-compose.dev.yml logs
# コンテナを再ビルド
docker-compose -f docker-compose.dev.yml build --no-cache
docker-compose -f docker-compose.dev.yml up -d
Terminal window
# node_modules を削除して再インストール
rm -rf node_modules bun.lockb
bun install
# TypeScript の型キャッシュをクリア
rm -rf packages/*/dist
bun run build