diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ec14ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# Bun +.bun.lockb +.bun-install/ + +# TypeScript +*.tsbuildinfo +dist/ +build/ +out/ + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# OpenClaw specific +config/credentials.json +config/secrets.json +*.secret.* +*.private.* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..75d44cc --- /dev/null +++ b/README.md @@ -0,0 +1,139 @@ +# MailChecker - OpenClaw Skill + +[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-blue.svg)](https://openclaw.ai) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6.svg)](https://www.typescriptlang.org/) +[![Bun](https://img.shields.io/badge/Bun-1.0+-000000.svg)](https://bun.sh) + +複数のメールアカウントを自律的に監視し、ベイズフィルタで重要度分類を行うOpenClawスキルです。 + +## ✨ 特徴 + +- **🔐 セキュア認証管理**: 環境変数/キーチェーンによる安全な認証情報保存 +- **📧 複数アカウント対応**: Gmail、Outlook、その他IMAP対応サービス +- **🤖 ベイズフィルタ分類**: 重要/普通/スパム/ニュースレターの自動分類 +- **⏰ 定期自動チェック**: cron連携による自律的な監視 +- **📊 学習機能**: ユーザーのフィードバックによる分類精度向上 + +## 🚀 クイックスタート + +### 前提条件 +- OpenClawがインストールされていること +- Bunランタイム (v1.0以上) +- IMAP対応のメールアカウント + +### インストール +```bash +# スキルディレクトリに移動 +cd /skills/mail-checker + +# 依存関係のインストール +bun install + +# 設定ファイルの作成 +cp .env.example .env +``` + +### 設定 +`.env`ファイルを編集: +```env +# メールアカウント設定(例: Gmail) +MAIL_ACCOUNT_1_HOST=imap.gmail.com +MAIL_ACCOUNT_1_PORT=993 +MAIL_ACCOUNT_1_USER=your-email@gmail.com +MAIL_ACCOUNT_1_PASSWORD=your-app-password +MAIL_ACCOUNT_1_TLS=true + +# 通知設定 +NOTIFY_IMPORTANT=true +NOTIFY_REGULAR=false +SUMMARY_HOUR=9 +``` + +## 📖 使用方法 + +### 基本的な使い方 +``` +ユーザー: 「メールチェックして」 +エージェント: 全アカウントをチェックし、重要メールを要約して報告 +``` + +### 設定モード +``` +ユーザー: 「メールチェックの設定をしたい」 +エージェント: 認証情報の設定ガイドを表示し、セットアップスクリプトを実行 +``` + +### 学習モード +``` +ユーザー: 「ベイズフィルタを学習させて」 +エージェント: 過去のメールから分類器を学習、精度向上 +``` + +## 🏗️ プロジェクト構造 + +``` +mail-checker/ +├── SKILL.md # スキル定義ファイル +├── README.md # このファイル +├── package.json # 依存関係 +├── .gitignore # Git除外設定 +├── scripts/ +│ ├── setup.ts # 初期設定スクリプト +│ ├── check.ts # メールチェック実行 +│ └── train.ts # ベイズフィルタ学習 +├── references/ +│ ├── gmail-api-setup.md # Gmail API設定ガイド +│ └── security-guide.md # セキュリティガイド +└── config/ + └── schema.ts # 設定スキーマ定義 +``` + +## 🔧 開発 + +### 依存関係のインストール +```bash +bun install +``` + +### ビルド +```bash +bun run build +``` + +### テスト +```bash +bun test +``` + +## 📊 進捗状況 + +| フェーズ | ステータス | 完了率 | +|---------|-----------|--------| +| 1. 基盤構築 | ✅ 完了 | 100% | +| 2. コア機能実装 | 🔄 進行中 | 25% | +| 3. 統合テスト | ⏳ 未着手 | 0% | +| 4. ドキュメント | ⏳ 未着手 | 0% | + +## 🤝 貢献 + +1. リポジトリをフォーク +2. 機能ブランチを作成 (`git checkout -b feature/amazing-feature`) +3. 変更をコミット (`git commit -m 'Add amazing feature'`) +4. ブランチにプッシュ (`git push origin feature/amazing-feature`) +5. プルリクエストを作成 + +## 📄 ライセンス + +このプロジェクトはMITライセンスの下で公開されています。詳細は[LICENSE](LICENSE)ファイルを参照してください。 + +## ⚠️ 注意事項 + +- ベータ版のため、重要なメールの見落としに注意 +- 定期的なバックアップを推奨 +- 分類精度は学習データに依存 + +## 🔗 リンク + +- [OpenClaw Documentation](https://docs.openclaw.ai) +- [GitBucket Repository](https://gitbucket.tmworks.club/git/dev-team/MailChecker.git) +- [Redmine Project](https://redmine.tmworks.club/projects/mailchecker) \ No newline at end of file diff --git a/SKILL.md b/SKILL.md new file mode 100755 index 0000000..e716856 --- /dev/null +++ b/SKILL.md @@ -0,0 +1,83 @@ +# メールチェックスキル + +## 説明 +複数のGmail/IMAPアカウントを定期的にチェックし、ベイズフィルタで重要度分類を行うOpenClawスキルです。セキュアな認証管理と自律的なメール監視を実現します。 + +## トリガー +- "メールチェックして" +- "新着メールを確認して" +- "メールの設定をしたい" +- "ベイズフィルタを学習させて" +- "メールアカウントを追加して" + +## 前提条件 +1. **IMAP対応メールアカウント**(Gmailの場合はIMAP有効化とアプリパスワード推奨) +2. **Bunランタイム**(TypeScript実行環境) +3. **必要な権限**:ファイルシステムへの書き込み権限、ネットワーク接続 + +## 使用方法 + +### 初期設定 +``` +ユーザー: 「メールチェックの設定をしたい」 +エージェント: 認証情報の設定ガイドを表示し、セットアップスクリプトを実行 +``` + +### 定期チェック +``` +ユーザー: 「メールチェックして」 +エージェント: 全アカウントをチェックし、重要メールを要約して報告 +``` + +### 学習モード +``` +ユーザー: 「ベイズフィルタを学習させて」 +エージェント: 過去のメールから分類器を学習、精度向上 +``` + +## 機能 +1. **複数アカウント対応**: Gmail、Outlook、その他IMAP対応サービス +2. **ベイズフィルタ分類**: 重要/普通/スパム/ニュースレターの自動分類 +3. **セキュア認証管理**: 環境変数/キーチェーンによる安全な認証情報保存 +4. **定期自動チェック**: cron連携による自律的な監視 +5. **スマート通知**: 重要度に応じた通知方法の切り替え +6. **学習機能**: ユーザーのフィードバックによる分類精度向上 + +## ファイル構成 +``` +mail-checker/ +├── SKILL.md # このファイル +├── scripts/ +│ ├── setup.ts # 初期設定スクリプト +│ ├── check.ts # メールチェック実行 +│ └── train.ts # ベイズフィルタ学習 +├── references/ +│ ├── gmail-api-setup.md # Gmail API設定ガイド +│ └── security-guide.md # セキュリティガイド +├── config/ +│ └── schema.ts # 設定スキーマ定義 +└── package.json # 依存関係 +``` + +## セキュリティ考慮事項 +- 認証情報は環境変数または暗号化ファイルで管理 +- IMAP接続はTLS 1.2以上を強制 +- ログにセンシティブ情報を含めない +- 最小権限の原則に従う + +## 依存関係 +- `imapflow`: モダンなIMAPクライアント +- `mailparser`: メールパーシング +- `natural`: ベイズ分類器 +- `dotenv`: 環境変数管理 +- `zod`: 設定バリデーション + +## 開発ステータス +- **フェーズ**: 1/4(基盤構築中) +- **最終更新**: 2026-04-11 +- **バージョン**: 0.1.0 + +## 注意事項 +- ベータ版のため、重要なメールの見落としに注意 +- 定期的なバックアップを推奨 +- 分類精度は学習データに依存 \ No newline at end of file diff --git a/config/schema.ts b/config/schema.ts new file mode 100755 index 0000000..90a547d --- /dev/null +++ b/config/schema.ts @@ -0,0 +1,78 @@ +import { z } from 'zod'; + +// IMAPアカウント設定スキーマ +export const ImapAccountSchema = z.object({ + name: z.string().min(1, 'アカウント名は必須です'), + host: z.string().min(1, 'ホスト名は必須です'), + port: z.number().int().min(1).max(65535).default(993), + secure: z.boolean().default(true), + auth: z.object({ + user: z.string().email('有効なメールアドレスを入力してください'), + password: z.string().min(1, 'パスワードは必須です'), + }), + tls: z.object({ + rejectUnauthorized: z.boolean().default(true), + minVersion: z.enum(['TLSv1.2', 'TLSv1.3']).default('TLSv1.2'), + }).optional().default({ + rejectUnauthorized: true, + minVersion: 'TLSv1.2', + }), + // オプション設定 + mailbox: z.string().default('INBOX'), + maxEmailsPerCheck: z.number().min(1).max(100).default(20), + checkInterval: z.number().min(30000).default(300000), // 5分 +}); + +// ベイズフィルタ設定スキーマ +export const BayesianFilterSchema = z.object({ + enabled: z.boolean().default(true), + categories: z.array(z.enum(['important', 'normal', 'spam', 'newsletter'])).default(['important', 'normal', 'spam']), + trainingDataPath: z.string().default('./data/training'), + modelPath: z.string().default('./data/models/bayesian.model'), + minConfidence: z.number().min(0).max(1).default(0.7), +}); + +// 通知設定スキーマ +export const NotificationSchema = z.object({ + enabled: z.boolean().default(true), + methods: z.array(z.enum(['openclaw', 'log', 'file'])).default(['openclaw']), + importantOnly: z.boolean().default(true), + summaryFormat: z.enum(['brief', 'detailed']).default('brief'), +}); + +// メイン設定スキーマ +export const ConfigSchema = z.object({ + version: z.string().default('1.0.0'), + accounts: z.array(ImapAccountSchema).min(1, '少なくとも1つのアカウントが必要です'), + bayesianFilter: BayesianFilterSchema.default({}), + notification: NotificationSchema.default({}), + logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'), + dataDirectory: z.string().default('./data'), +}); + +// 型エクスポート +export type ImapAccount = z.infer; +export type BayesianFilterConfig = z.infer; +export type NotificationConfig = z.infer; +export type Config = z.infer; + +// デフォルト設定 +export const defaultConfig: Config = { + version: '1.0.0', + accounts: [], + bayesianFilter: { + enabled: true, + categories: ['important', 'normal', 'spam'], + trainingDataPath: './data/training', + modelPath: './data/models/bayesian.model', + minConfidence: 0.7, + }, + notification: { + enabled: true, + methods: ['openclaw'], + importantOnly: true, + summaryFormat: 'brief', + }, + logLevel: 'info', + dataDirectory: './data', +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100755 index 0000000..36b6c1a --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "openclaw-skill-mail-checker", + "version": "0.1.0", + "description": "OpenClaw skill for checking multiple email accounts with Bayesian filtering", + "type": "module", + "main": "scripts/check.ts", + "scripts": { + "setup": "bun run scripts/setup.ts", + "check": "bun run scripts/check.ts", + "train": "bun run scripts/train.ts", + "test": "bun test", + "build": "bun build scripts/*.ts --outdir dist" + }, + "dependencies": { + "imapflow": "^1.0.0", + "mailparser": "^3.6.0", + "natural": "^6.3.0", + "dotenv": "^16.0.0", + "zod": "^3.22.0", + "node-cron": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/mailparser": "^3.4.0", + "@types/natural": "^6.0.0", + "typescript": "^5.0.0", + "bun-types": "latest" + }, + "keywords": [ + "openclaw", + "skill", + "email", + "imap", + "gmail", + "bayesian", + "filter" + ], + "author": "OpenClaw Agent", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://gitbucket.tmworks.club/openclaw/skills/mail-checker.git" + }, + "engines": { + "bun": ">=1.0.0" + } +} \ No newline at end of file