diff --git a/.agents/skills/agent-dm/SKILL.md b/.agents/skills/agent-dm/SKILL.md new file mode 100644 index 0000000..409fb2f --- /dev/null +++ b/.agents/skills/agent-dm/SKILL.md @@ -0,0 +1,62 @@ +--- +name: agent-dm +description: ルーター判定のあと Cursor へ配達する。トリガー: inbox見て、Cursorに頼んで、agent-dm。同じPCで agent -p が使えるときは使わない。 +--- + +# Agent DM Skill(Codex)— 配達 + +**先に `@agent-router`(または `.Codex/skills/agent-router`)。** 分類が自分(Codex)なら実装する。Cursor へ渡すチャネルだけがこの Skill。 + +ホーム直下では起動しない。このモノレポに `cd` する。 + +## チャネル + +1. 同じ Windows で `agent` がある → `agent -p "..."` 。この CLI は使わない。 +2. Cloud Agent からの依頼 / `agent` 無し → inbox(下記)または `gh issue list --label agent-dm`。 + +カタログ: `business-ops/agent-dm/CATALOG.md`。yolo は使わない。 + +## 自分 + +`--from Codex` + +## 手順 + +```powershell +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from Codex +node business-ops/scripts/agent-dm.mjs show --id +``` + +渡された実装はやって結果だけ返す。Cursor に実装をやり返さない。 + +```powershell +node business-ops/scripts/agent-dm.mjs reply --id --from Codex --body @" +やったこと: +テスト: +ブランチ: +見てほしい箇所: +"@ +``` + +新規に Cursor へ(`agent` が使えないとき): + +```powershell +node business-ops/scripts/agent-dm.mjs send ` + --from Codex --to cursor ` + --title "短く何を頼むか" ` + --body "レビューしてほしいこと。パス。完了条件。" +``` + +```powershell +git add business-ops/agent-dm/threads/ +git commit -m "chore(agent-dm): Codex → cursor" +``` + +`main` へは push しない。 + +## 禁止 + +- ルーターを飛ばす +- 最後の投稿者が Codex なら返信しない +- 秘密情報・本番デプロイ・8 ターン超過 diff --git a/.agents/skills/agent-router/SKILL.md b/.agents/skills/agent-router/SKILL.md new file mode 100644 index 0000000..ac78484 --- /dev/null +++ b/.agents/skills/agent-router/SKILL.md @@ -0,0 +1,55 @@ +--- +name: agent-router +description: 実装前に Cursor / Codex / 人間へ分類する。実装・テスト・日次SOPは自分(Codex)。UI・best-of-n・Cloud・レビューは Cursor へ渡す。merge・デプロイは人間。相手の仕事は実装しない。トリガー: 分類して、渡して、これはCursor、これはCodex。 +--- + +# Agent Router(共通) + +どのツールに話しかけられても、**コードを書く前に分類する。** 自分の仕事でなければ実装しない。 + +判定の正: `business-ops/CURSOR_VS_CLAUDE.md`。配達: `business-ops/agent-dm/CATALOG.md` と `PROTOCOL.md`。ホーム直下では起動しない。このモノレポに `cd` してから分類する。 + +## 判定表 + +| 判定 | 誰がやる | 例 | +|------|----------|-----| +| `Codex` | 手元実装、テスト、Windows / PowerShell、日次 SOP | lint 修正、API、記事QA、今日の1時間 | +| `cursor` | Design Mode / UI、`/best-of-n`、Cloud、Bugbot、Tab で足りる小修正 | 余白、Next.js 16 のモデル比較、スマホから直す | +| `human` | merge、本番デプロイ、課金、秘密情報 | main merge、Render、APIキー | +| `human`(迷い) | 実装しない。理由を書いて待つ | 両方に見える、範囲が不明 | + +## いま自分はどちらか + +Codex のセッション → 自分は `Codex`。 + +相手から Agent DM / Issue で渡された仕事は、**判定をやり直して役割を入れ替えない。** やって結果を返す。 + +## WIP=1(分類・実装の前) + +`C:\Users\haruki\loop\state\wip.md` を読む。正は `.cursor/rules/wip-one.mdc`。AUTOより強い。 + +- `status: open` で今の依頼が別件 → 分類も実装もしない。3択だけ返す(続ける / 完走して切替 / パークして切替) +- 同じWIP、または `status: empty` → このルーターどおり進む。empty ならこの依頼を `wip.md` に書いてから分類する +- パークは `C:\Users\haruki\loop\state\queue.md` の `## パーク` 末尾に `- [ ]` で積むだけ。実行しない + +## 引き渡し + +自分の判定が `Codex` → やる。 + +`cursor` の仕事: + +1. 同じ PC で `agent` がある → `agent -p "依頼。完了条件。触ってよいパス。"` して自分は実装しない +2. 無い / Cloud 相当 → `node business-ops/scripts/agent-dm.mjs send --from Codex --to cursor ...` して止まる。`gh issue` でもよい + +`human` の仕事: 実装しない。承認を待つ。 + +yolo / skip-permissions は使わない。 + +## 判定例 + +| 依頼 | 判定 | 動き | +|------|------|------| +| coupon-board の lint を直して | Codex | 自分が実装する | +| 一覧カードの余白を揃えて | cursor | `agent -p` か agent-dm。自分は UI を書かない | +| Next.js 16 の params を複数モデルで当てて | cursor | Cursor の `/best-of-n` に渡す | +| 本番にデプロイして | human | 止める | diff --git a/.agents/skills/ai-agent-mastery/SKILL.md b/.agents/skills/ai-agent-mastery/SKILL.md new file mode 100644 index 0000000..59a8146 --- /dev/null +++ b/.agents/skills/ai-agent-mastery/SKILL.md @@ -0,0 +1,140 @@ +--- +name: ai-agent-mastery +description: Codex/Fableエージェントを最大限活用し「最強AIエージェントマスター」を目指すための思考法・委任パターン・プロンプト設計・振り返りルール。 +--- + +# 最強AIエージェントマスター Skill + +## ゴール + +> 人間は**判断**だけ。実装・文案・調査・定型作業はエージェントに任せる。 + +## ツール分担(Codex vs Claude Code) + +Codex を Claude Code の代わりにしない。手元実装は Claude Code、Codex は Tab / Cloud Agent / Bugbot / Automations / `/best-of-n`。 + +| 任せる作業 | ツール | +|------------|--------| +| 手元の実装・テスト・提出 | Claude Code | +| 小さな修正(エージェント起動なし) | Codex Tab / Cmd+K | +| UI クリック修正 | Codex Design Mode | +| 非同期・スマホ・並列 | Codex Cloud Agent | +| PR 監査・CI 失敗修正 | Bugbot / Automations | +| モデル比較(Next.js 16 など) | Codex `/best-of-n` | +| 日次 SOP(朝チェック・1時間) | Claude Code skills | +| 相手エージェントへ依頼 | 先に `@agent-router`。配達は Agent DM | + +詳細: `business-ops/CURSOR_VS_CLAUDE.md` + +## 5つの原則 + +### 1. 型を先に作る(再発明を禁止する) +- 毎回ゼロから説明しない → **Skill / テンプレ / スクリプト**に固定 +- 新しいパターンが出たら、その場でSkillに追記する + +### 2. 入力フォームを必ず挟む +- 口頭の曖昧な指示より `project-brief.md` / `article-brief.md` +- **入力が足りないときは推測で進め、仮定を明示** + +### 3. 委任の粒度を決める + +| 任せる | 人間がやる | +|--------|-----------| +| コード生成・リファクタ | 要件の優先順位 | +| 設計書ドラフト | 最終仕様の承認 | +| コミット/PR文案 | push / merge の承認 | +| 調査・比較 | 技術選定の最終判断 | +| テストコード生成 | 本番デプロイ | + +### 4. 安全柵をSkillに埋め込む +- 破壊的操作・課金・投稿は **「人間承認必須」** とSkillに明記 +- preflightスクリプトで機械チェック + +### 5. 週1でSkillを更新する +- うまくいったプロンプト → テンプレに昇格 +- 失敗パターン → Skillの「禁止」に追記 + +## エージェント委任パターン(コピペ用) + +### パターンA: 調査→実装(2段階) +``` +Phase 1(調査のみ): +「{対象}を調査し、選択肢3つと推奨1つを表で出してください。コードは書かないでください。」 + +Phase 2(実装): +「推奨案で実装してください。@web-dev-github に従い、スコープ最小で。」 +``` + +### パターンB: 骨組み→肉付け +``` +Step 1: new-web-project.mjs / new-article.mjs で骨組み +Step 2: @対象Skill + ブリーフで中身を埋める +Step 3: QAスクリプト → 人間確認 +``` + +### パターンC: レビュー委任 +``` +「今の変更の diff をレビューし、 +- バグリスク +- スコープ外の変更 +- テスト不足 +を箇条書きで。修正はまだしないでください。」 +``` + +### パターンD: 並列委任(独立タスク) +``` +タスク1: 「REQUIREMENTS.md を要件に沿って更新」 +タスク2: 「IMPLEMENTATION.md の対応表を更新」 +→ 独立なら同時依頼、依存ありなら順番に +``` + +### パターンE: Codex → Claude Code(Agent DM) +``` +@agent-router +Claude の仕事なら渡す。実装は向こう。こちらはレビューだけ。 +``` + +### パターンF: 分類してから動く +``` +@agent-router +実装する前に claude-code / cursor / human のどれかだけを出す。 +自分の仕事でなければ実装しない。 +``` + +## Skillの組み合わせ + +| シーン | 呼び出すSkill | +|--------|--------------| +| 新Webアプリ | `@web-dev-github` | +| coupon-board | `@coupon-board-dev` | +| 記事執筆 | `@article-production` | +| エージェント設計 | `@ai-agent-mastery`(本Skill) | +| 実務力の訓練(考える・打つ・説明する) | `@training-mode`(SHIPと併用。実装代行はしない) | +| 自律学習(Dify・基本情報語彙・可視化) | `@learning-coach` | +| 全自動 ship | `@autopilot` | +| 先に分類 | `@agent-router` | +| Codex と Claude の会話 | `@agent-dm`(配達) | +| ツール分担の確認 | `business-ops/CURSOR_VS_CLAUDE.md` | + +## 週次振り返りテンプレート + +`business-ops/templates/agent-retrospective.md` をコピーして記入。 + +## マスターへのレベル指標 + +| Level | 状態 | あなたの現在地(推定) | +|-------|------|----------------------| +| L1 | 都度プロンプト | ← 以前 | +| L2 | Skill + テンプレ活用 | **← 今ここ** | +| L3 | スクリプトで投稿半自動 | 今回追加中 | +| L4 | エージェントが自律完走→人間は承認のみ | 目標 | +| L5 | 複数エージェント並列 + 自己改善ループ | 最強 | + +## 詳細プレイブック + +- `business-ops/AI_AGENT_MASTERY.md` +- `business-ops/CURSOR_VS_CLAUDE.md` — Codex の存在意義と、Claude Code との使い分け +- `business-ops/GROKBOT_FLEET.md` — Grok Bot(常時稼働)と Cursor 内 Grok 4.6 +- `business-ops/templates/prompts/grokbot-fleet.md` — 参謀 / 夜勤調査 / 再現パックのコピペ(CW・note は対象外) +- `business-ops/agent-dm/PROTOCOL.md` — 配達 +- `.cursor/skills/agent-router/SKILL.md` — 分類 diff --git a/.agents/skills/article-production/SKILL.md b/.agents/skills/article-production/SKILL.md new file mode 100644 index 0000000..8079647 --- /dev/null +++ b/.agents/skills/article-production/SKILL.md @@ -0,0 +1,116 @@ +--- +name: article-production +description: Note向けAI活用・副業記事の企画・執筆・QA・公開準備を一貫して行う。articles/ の既存記事パターンに従う。 +--- + +# 記事制作 Skill + +## いつ使うか + +- `articles/` に新しい記事を追加・改稿するとき +- Note / 有料記事 / Gumroad CTA を含むコンテンツを作るとき +- 記事の品質チェック・公開前確認をするとき + +## 必ず読む参照 + +1. 既存記事2〜3本(特に `articles/20260701-0610-aichatgpt35.md` を型として参照) +2. `business-ops/templates/article-brief.md`(入力があれば) +3. `business-ops/checklists/article-publish.md`(公開前) + +## 記事の型(固定構造) + +```markdown +--- +title: "記事タイトル" +emoji: "🌟" +type: "idea" +topics: ["AI", "副業", "ChatGPT", "生産性向上"] +published: false +--- + +## {タイトルと同じ見出し} + +## なぜ多くの人が{テーマ}で結果を出せないのか +(読者の悩み・共感・「明確な理由がある」への橋渡し) + +## {テーマ}で成果を出す人が密かにやっている3つのこと + +### ① {ポイント1} +- なぜ効くのか: +- 具体的にやること: +- 実践例: +- すぐできる一歩: + +### ② {ポイント2} +(同上) + +### ③ {ポイント3} +(同上) + +ここまでは基本です。ただ、ほとんどの人はここで止まります。 + +## 🎁 コピペで使える実践テンプレートを手に入れる +**→ [Note.comで月収5万円を達成するための実践ガイド](https://springharu.gumroad.com/l/yariyy)** +✅ コピペで今日から使える ✅ ¥2400(コーヒー1杯分) + +--- + +*続きは [note.com の有料記事](https://note.com) でお読みいただけます。* +``` + +## ファイル命名規則 + +``` +articles/YYYYMMDD-HHMM-{slug}.md +``` + +- `slug`: 英小文字・数字・ハイフンのみ、20文字以内推奨 +- 生成コマンド: `node business-ops/scripts/new-article.mjs --title "..." --slug ...` + +## トーン・文体 + +- 一人称「私」、読者への語りかけ +- 具体例は「Aさん」「友人」など匿名 +- 数字は「約」「〜」で柔らかく(検証不能な断定は避ける) +- 煽りすぎず、共感→解決→行動の流れ + +## 禁止・要確認(人間承認必須) + +| 操作 | 理由 | +|------|------| +| `published: true` への変更 | 公開意思の確認 | +| Note / SNS への実投稿 | 誤投稿防止 | +| Gumroad URL の変更 | リンク切れ・課金導線 | +| 事実と異なる具体的数値の断定 | 信頼性 | +| 他者の固有名・商標の誤用 | 法的リスク | + +## 作業フロー + +``` +1. ブリーフ記入(templates/article-brief.md) +2. new-article.mjs で骨組み生成 +3. 本文執筆(このSkillの型に従う) +4. article-qa.mjs で機械チェック +5. チェックリストで人間確認 +6. published: true は人間が明示承認後のみ +``` + +## QAコマンド + +```bash +node business-ops/scripts/article-qa.mjs articles/対象ファイル.md +node business-ops/scripts/article-qa.mjs --all +``` + +## プロンプト例(ブリーフから執筆) + +``` +@article-production + +以下のブリーフに従い、articles/ の既存記事と同じ型で本文を書いてください。 +- 3つのポイントは重複しないこと +- CTAセクションはテンプレのまま +- published は false のまま + +{ブリーフ本文を貼る} +``` diff --git a/.agents/skills/autopilot/SKILL.md b/.agents/skills/autopilot/SKILL.md new file mode 100644 index 0000000..c8d7599 --- /dev/null +++ b/.agents/skills/autopilot/SKILL.md @@ -0,0 +1,80 @@ +--- +name: autopilot +description: 全自動モード。新規プロジェクト立ち上げから実装完了後の commit/push/draft PR まで人間の介入を最小化。危険操作(main push・課金・デプロイ・外部投稿)は禁止。 +--- + +# Autopilot Skill(全自動) + +## ゴール + +> **人間はブリーフを書くだけ。あとはエージェントが完走して GitHub に draft PR まで出す。** + +## いつ使うか + +- 「全自動でやって」と言われたとき +- 実装完了後の GitHub 投稿を自動化するとき +- 新規プロジェクトを一気に立ち上げるとき + +## 全自動フロー + +``` +1. autopilot new --name my-app +2. brief を埋める(唯一の人間作業) +3. @autopilot で実装 +4. autopilot ship --yes (エージェントが自動実行) +``` + +## エージェントの完了時ルール(必須) + +実装・修正が完了したら **必ず** 以下を実行: + +```bash +node business-ops/scripts/autopilot.mjs check +node business-ops/scripts/autopilot.mjs ship --yes +``` + +失敗したら修正して再実行。人間に「pushしていいですか?」と聞かない。 + +## コマンド一覧 + +| コマンド | 動作 | +|----------|------| +| `autopilot check` | git/gh/node 確認 | +| `autopilot new --name X` | branch + scaffold + brief + プロンプト生成 | +| `autopilot ship --yes` | preflight → commit → push → draft PR | +| `autopilot full --name X` | new + エージェント指示書 | + +## 自動化レベル(config/autopilot.json) + +| Level | 動作 | +|-------|------| +| L1 | auto commit のみ | +| L2 | commit + push + draft PR(**デフォルト**) | +| L3 | + CI通過後 auto-merge(`auto_merge: true` で有効) | + +## 絶対禁止(全レベル共通) + +| 操作 | 理由 | +|------|------| +| `main` / `master` への push | 本番直結 | +| force push | 破壊的 | +| シークレットのコミット | 漏洩 | +| Render/Vercel デプロイ | 課金 | +| Note/SNS 投稿 | 誤投稿 | +| `published: true` | 公開判断 | + +## プロンプト例(全自動開発) + +``` +@autopilot @web-dev-github + +business-ops/briefs/{name}-brief.md を読み、{name}/ を MVP まで実装。 +完了後: + node business-ops/scripts/autopilot.mjs ship --yes +``` + +## 関連 + +- Config: `business-ops/config/autopilot.json` +- SOP: `business-ops/SOP.md`(Autopilot セクション) +- マスター: `@ai-agent-mastery` diff --git a/.agents/skills/coupon-board-dev/SKILL.md b/.agents/skills/coupon-board-dev/SKILL.md new file mode 100644 index 0000000..1bab53f --- /dev/null +++ b/.agents/skills/coupon-board-dev/SKILL.md @@ -0,0 +1,112 @@ +--- +name: coupon-board-dev +description: 招待キャンペーン掲示板(coupon-board)の開発・修正・デプロイ。Next.js 16の破壊的変更に注意し、設計書を正とする。 +--- + +# coupon-board 開発 Skill + +## いつ使うか + +- `coupon-board/` の機能追加・バグ修正 +- デプロイ前の検証 +- 設計書と実装の整合確認 + +## 必ず読む参照(この順) + +1. `coupon-board/AGENTS.md` — **Next.js 16は学習データと異なる。必ず node_modules 内ドキュメントを確認** +2. `coupon-board/REQUIREMENTS.md` — 要件の正 +3. `coupon-board/DETAILED_DESIGN.md` — 詳細設計 +4. `coupon-board/IMPLEMENTATION.md` — 機能→ファイル対応表 +5. 変更対象の既存ソース + +## 技術スタック + +| 項目 | 内容 | +|------|------| +| Framework | Next.js 16 App Router | +| Language | TypeScript | +| Style | Tailwind CSS | +| DB | SQLite (better-sqlite3) | +| Deploy | Render / Docker / ローカル | + +## ローカル開発 + +```bash +cd coupon-board +npm install +npm run dev +# http://localhost:3000 +``` + +| URL | 用途 | +|-----|------| +| `/` | 一覧 | +| `/post` | 投稿 | +| `/admin` | 管理(PW: shotime-admin ※本番では必ず変更) | +| `/favorites` | お気に入り | + +## 変更時のルール + +1. **スコープ最小** — 依頼と無関係なリファクタ禁止 +2. **設計書更新** — 仕様変更時は REQUIREMENTS / DETAILED_DESIGN / IMPLEMENTATION を同期 +3. **既存パターン踏襲** — `src/lib/`, `src/components/`, `src/app/api/` の構成を維持 +4. **Next.js 16** — `node_modules/next/dist/docs/` を参照してから API 使用 + +## デプロイ前チェック(必須) + +```bash +bash business-ops/scripts/pre-deploy-check.sh +``` + +または手動: + +```bash +cd coupon-board +npm run lint +npm run build +bash scripts/verify-prod.sh # 可能な場合 +``` + +## 人間承認が必要な操作 + +| 操作 | 理由 | +|------|------| +| `git push origin main` | 本番デプロイが自動トリガーされる | +| Render シークレット変更 | 認証・課金 | +| 管理画面パスワード変更 | セキュリティ(本番必須) | +| DBスキーマ破壊的変更 | データ消失 | +| `render.yaml` / 課金プラン変更 | コスト発生 | + +## CI + +- PR/push to `cursor/**` or `main` → lint + build(`coupon-board/**` 変更時) +- main マージ + Render secrets 設定時 → 自動デプロイ + +## 実装パターン + +### 新APIルート + +``` +src/app/api/{resource}/route.ts +src/lib/db.ts にクエリ追加 +src/lib/types.ts に型追加 +IMPLEMENTATION.md に行追加 +``` + +### 新コンポーネント + +``` +src/components/{Name}.tsx +既存コンポーネントの命名・propsパターンに合わせる +``` + +## プロンプト例 + +``` +@coupon-board-dev + +{機能ID or 要件} を実装してください。 +- IMPLEMENTATION.md の対応表を更新すること +- lint/build が通ること +- 本番デプロイは行わないこと +``` diff --git a/.agents/skills/learning-coach/SKILL.md b/.agents/skills/learning-coach/SKILL.md new file mode 100644 index 0000000..7f451d1 --- /dev/null +++ b/.agents/skills/learning-coach/SKILL.md @@ -0,0 +1,43 @@ +--- +name: learning-coach +description: Autonomous personal study coach for Dify, RAG, Docker, AWS, terminal commands, 基本情報 vocabulary, work-study topics, and the AIgakusyu drill map. Use when the user says 学習支援, 勉強見て, Dify, RAG, RAGAS, Docker, AWS, ターミナル, 基本情報, 可視化, 学んだこと, or wants AI to pick today's one topic. Do not auto-implement code. SHIP ends the mode. +--- + +# 自律学習コーチ + +実装代行ではない。進捗の正は `http://127.0.0.1:5055/map`。 +説明は `http://127.0.0.1:5055/`。レーン指定は `/?lane=docker`(rag / aws / terminal / dify も可)。 +貼る全文: `C:\Users\haruki\AIgakusyu\docs\learning-coach-prompt.md` + +## 発動したら + +1. `work-study.md` と `coaching/explain_progress.json` を読む +2. レーン無指定なら未チェック先頭。レーンがあればそのセクションの先頭。選ばせない +3. `説明` / 起動語なし / Dify / Docker / RAG / AWS / ターミナル / 基本情報 はチャットで解説を始めない。サイトを開けと言う +4. 可視化を見たいときは `/map` を開けと言う + +## 禁止 + +- 先に完成解説・完成コード +- 新しい学習アプリ、受験計画、趣味のマネタイズ +- 複数トピック同時 +- 会社の実データ + +## レーン + +| 語 | やること | +|---|---| +| 本業 | work-study の会社ドメイン | +| Dify | チャットフロー/ワークフロー、ナレッジ、ツール、変数 | +| 語彙 | 基本情報の現場語。過去問を積むな | +| 手 | ターミナル。説明はサイト、打つのは自分 | +| Docker | イメージ/コンテナ、Compose、ボリューム | +| RAG | 検索してから渡す。RAGASは根拠。過去問禁止 | +| AWS | リージョン、IAM、EC2、S3。受験計画にするな | +| 可視化 | /map。弱いセクションを1つ | +| 説明 | :5055 のドリル | +| SHIP | 通常の実装に戻る | + +## 出力 + +今日の1件、URL(レーンなら `?lane=`)、先攻1つ、採点は穴1つの型。 diff --git a/.agents/skills/training-mode/SKILL.md b/.agents/skills/training-mode/SKILL.md new file mode 100644 index 0000000..63e62bc --- /dev/null +++ b/.agents/skills/training-mode/SKILL.md @@ -0,0 +1,71 @@ +--- +name: training-mode +description: Forces TRAINING MODE so the human thinks, types, and explains first. Use when the user says 訓練モード, 実務力が落ちた, ドリル, 説明させて, 手, 地図, 説明, 変換, or worries that AI is atrophying VS Code, terminal, frontend/backend, or 基本情報 skills. Do not auto-implement. SHIP ends the mode. +--- + +# 実務力コーチ(TRAINING MODE) + +SHIP(`ai-agent-mastery` / AUTO実装)は消さない。このSkillが発動している間だけ上書きする。 + +マスタープロンプト全文: `C:\Users\haruki\AIgakusyu\docs\training-mode-prompt.md` +自律学習コーチ: `C:\Users\haruki\AIgakusyu\docs\learning-coach-prompt.md` +予習在庫: `C:\Users\haruki\AIgakusyu\work-study.md` +会社用短縮版: `C:\Users\haruki\AIgakusyu\docs\work-prompts.md` セクション14 +可視化: `http://127.0.0.1:5055/map` + +## 発動したら最初にやれ + +1. 上記マスタープロンプトを読む +2. ユーザーに「全部やって」モードではないと一文で宣言する +3. 収益方針を1回だけ再掲する(回復=泳ゴルゲー、投資=ハッカソン、回収=CW/note/説明力。混ぜない) +4. 起動語を確認する。`説明`、または起動語が無いときはチャットで30秒説明を始めない。 + `http://127.0.0.1:5055/` を開け、と言う(AIgakusyu 訓練サイト。ポート5055)。 + 起動していなければ `C:\Users\haruki\AIgakusyu\drill` で `.\venv\Scripts\python.exe app.py` + +## このSkill中の禁止(AUTOより強い) + +- 先に完成コードを書く +- ユーザーが打つべきコマンドを先に実行する +- 答えを先に出す +- ファイルを勝手に実装して「直した」と終える +- 新しい学習システム、資格カリキュラム、趣味のマネタイズを提案する +- 会社の実コード・顧客名を要求する + +「代わりに全部やって」と言われたら1回拒否し、終わりたければ `SHIP` と言え、と返す。 + +## 起動語 + +| 語 | 20分でやること | 合格 | +|---|---|---| +| 手 | VS Code / ターミナル / Git を自分で打つ | 自分で実行し、結果を3行で言える | +| 地図 | 1操作を FE→HTTP→BE→保存→HTML で追う | 3行説明ができる | +| 説明 | チャット禁止。`http://127.0.0.1:5055/` で work-study 1件 | サイト上で30秒説明のあと穴1つ | +| 変換 | 今日の実務/ハッカソンを日報1行・note種・CW文脈のどれか1つ | 成果物が1つ残る | +| SHIP | このSkillを終了し、通常の実装代行に戻る | 訓練終了の宣言がある | + +## 「手」の固定メニュー(最初はこれ以外を考えるな) + +1. 今いる場所(pwd / Get-Location) +2. `git status` を3行で説明 +3. VS Code でファイル検索 → 該当行 +4. エラーから次に見る場所を1つ +5. ブラウザで「動いた」判定(テスト通過 ≠ 動く) + +## 「地図」の型 + +抽象図禁止。1操作を端から端。3行: +1. 入口がURL/イベントを振る +2. 保存担当が読み書きする +3. テンプレがHTMLに埋め込む + +## 毎ターンの出力 + +1. 今日の科目と制限時間 +2. ユーザーへの先攻指示(1つ) +3. ユーザーが答えたら 正確 / 不正確 / 欠け +4. 穴は1つだけ +5. 明日先輩に言える1文 + +## 対象者(固定。脚色するな) + +新卒SIer、メンテナンスAI。会社は VS Code + Cline + 社内Ollama。Flask TODO を2周。未達は回帰テスト。ハッカソン2026-08-22はP0起動不能・死んだ演出・Gemini復旧・公開経路が強み。穴は手元操作と30秒説明。 diff --git a/.agents/skills/web-dev-github/SKILL.md b/.agents/skills/web-dev-github/SKILL.md new file mode 100644 index 0000000..73fbd5d --- /dev/null +++ b/.agents/skills/web-dev-github/SKILL.md @@ -0,0 +1,126 @@ +--- +name: web-dev-github +description: Web開発の新規立ち上げから実装・GitHub投稿(commit/PR)までを一貫して行う。設計書先行・スコープ最小・危険操作は人間承認。 +--- + +# Web開発 + GitHub投稿 Skill + +## いつ使うか + +- 新しいWebアプリ・機能を**ゼロから**作るとき(最大ボトルネック) +- 実装が終わって **GitHubに投稿**するとき +- PRの説明文・コミットメッセージを整えるとき + +## 開発の型(このリポジトリの慣習) + +``` +project-name/ +├── README.md # 概要・セットアップ +├── REQUIREMENTS.md # 要件定義(正) +├── BASIC_DESIGN.md # 基本設計(必要時) +├── DETAILED_DESIGN.md # 詳細設計(必要時) +├── IMPLEMENTATION.md # 機能→ファイル対応表 +├── AGENTS.md # AI向けルール(フレームワーク注意) +├── src/ # ソース +└── package.json +``` + +雛形生成: +```bash +node business-ops/scripts/new-web-project.mjs --name my-app --type nextjs +``` + +## 新規開発フロー + +``` +1. project-brief.md を記入 +2. new-web-project.mjs で骨組み生成 +3. REQUIREMENTS.md を埋める(AI可) +4. 実装(スコープ最小) +5. ローカル確認(lint/build/dev) +6. github-preflight.sh +7. github-ship.mjs で文案生成 +8. 人間承認後に commit / push / PR +``` + +## 技術スタック(既存プロジェクト参考) + +| プロジェクト | スタック | +|-------------|----------| +| coupon-board | Next.js 16 + TS + Tailwind + SQLite | +| ai-dashboard-kit | 静的JSON + TS型 + コンテキスト生成 | + +新規は **要件に応じて選定**。無断でスタックを変えない。 + +## GitHub投稿ルール + +### ブランチ命名 +``` +cursor/- +``` + +### コミットメッセージ +``` +: <要約(50字以内)> + +<詳細(任意)> +``` +type: `feat` | `fix` | `docs` | `chore` | `refactor` | `test` + +### PR +- テンプレート: `.github/pull_request_template.md` に従う +- **draft PR** をデフォルト +- CI通過を確認してからレビュー依頼 + +## 人間承認が必要な操作 + +| 操作 | 理由 | +|------|------| +| `git push origin main` | 本番デプロイ連鎖の可能性 | +| PR merge | 本番反映 | +| 依存パッケージのメジャー更新 | 破壊的変更 | +| シークレット・APIキーの追加 | セキュリティ | +| Render/Vercel等の課金設定 | コスト発生 | +| 既存ファイルの大量削除 | データ消失 | + +## 投稿前チェック + +```bash +bash business-ops/scripts/github-preflight.sh +node business-ops/scripts/github-ship.mjs +``` + +チェックリスト: `business-ops/checklists/github-ship.md` + +## プロンプト例 + +### 新機能実装 +``` +@web-dev-github + +## プロジェクト +coupon-board/ + +## タスク +{機能説明} + +## 制約 +- REQUIREMENTS.md / IMPLEMENTATION.md を更新 +- lint/build が通ること +- commit/push は行わない +``` + +### GitHub投稿準備 +``` +@web-dev-github + +変更内容を確認し、github-ship.mjs 相当の +- コミットメッセージ案 +- PRタイトル・本文案 +を出してください。pushはまだしないでください。 +``` + +## 関連Skill + +- `@coupon-board-dev` — coupon-board 専用 +- `@ai-agent-mastery` — エージェント活用の上級テクニック diff --git a/.claude/mcp.json.example b/.claude/mcp.json.example new file mode 100644 index 0000000..8d1bad7 --- /dev/null +++ b/.claude/mcp.json.example @@ -0,0 +1,11 @@ +{ + "mcpServers": { + "github": { + "command": "npx", + "args": ["-y", "@github/github-mcp-server"], + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" + } + } + } +} diff --git a/.claude/skills/agent-dm/SKILL.md b/.claude/skills/agent-dm/SKILL.md new file mode 100644 index 0000000..b1f0468 --- /dev/null +++ b/.claude/skills/agent-dm/SKILL.md @@ -0,0 +1,64 @@ +--- +name: agent-dm +description: ルーター判定のあと Cursor へ配達する。起動したら inbox を見る。トリガー: inbox見て、Cursorに頼んで、agent-dm。同じPCで agent -p が使えるときは配達に使わない。 +--- + +# Agent DM Skill(Claude Code)— 配達 + +**先に `@agent-router`(または `.claude/skills/agent-router`)。** 分類が自分(claude-code)なら実装する。Cursor へ渡すチャネルだけがこの Skill。 + +ホーム直下では起動しない。このモノレポに `cd` する。 + +## チャネル + +1. 同じ Windows で `agent` がある → `agent -p "..."` 。この CLI は使わない。 +2. Cloud Agent からの依頼 / `agent` 無し → inbox(下記)または `gh issue list --label agent-dm`。 + +カタログ: `business-ops/agent-dm/CATALOG.md`。yolo は使わない。 + +## 自分 + +`--from claude-code` + +## 手順 + +エージェント起動時(分類のあと・実装の前): + +```powershell +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from claude-code +gh issue list --label agent-dm --state open +``` + +`gh` 失敗は無視。MCP に `fetch_inbox` があるときだけ 1 回呼ぶ。無ければ入れない。聞かない。inbox があれば `show --id ` → 渡された実装はやって結果だけ返す。Cursor に実装をやり返さない。空なら今の依頼を続ける。 + +```powershell +node business-ops/scripts/agent-dm.mjs reply --id --from claude-code --body @" +やったこと: +テスト: +ブランチ: +見てほしい箇所: +"@ +``` + +新規に Cursor へ(`agent` が使えないとき): + +```powershell +node business-ops/scripts/agent-dm.mjs send ` + --from claude-code --to cursor ` + --title "短く何を頼むか" ` + --body "レビューしてほしいこと。パス。完了条件。" +``` + +```powershell +git add business-ops/agent-dm/threads/ +git commit -m "chore(agent-dm): claude-code → cursor" +``` + +`main` へは push しない。 + +## 禁止 + +- ルーターを飛ばす +- 最後の投稿者が claude-code なら返信しない +- 秘密情報・本番デプロイ・8 ターン超過 diff --git a/.claude/skills/agent-router/SKILL.md b/.claude/skills/agent-router/SKILL.md new file mode 100644 index 0000000..95a7cd6 --- /dev/null +++ b/.claude/skills/agent-router/SKILL.md @@ -0,0 +1,81 @@ +--- +name: agent-router +description: 実装前に Cursor / Claude Code / 人間へ分類する。起動したら inbox を見る。実装・テスト・日次SOPは自分(Claude)。UI・best-of-n・Cloud・レビューは Cursor へ渡す。merge・デプロイは人間。相手の仕事は実装しない。プロジェクト名が無くても UI/余白は coupon-board を既定にして agent -p する。トリガー: 分類して、渡して、inbox見て、これはCursor、これはClaude。 +--- + +# Agent Router(共通) + +どのツールに話しかけられても、**コードを書く前に分類する。** 自分の仕事でなければ実装しない。 + +判定の正: `business-ops/CURSOR_VS_CLAUDE.md`。配達: `business-ops/agent-dm/CATALOG.md` と `PROTOCOL.md`。ホーム直下では起動しない。このモノレポに `cd` してから分類する。相手の会話・思考・画面は読めない。渡すか、同じ git を読むかだけ。 + +## 判定表 + +| 判定 | 誰がやる | 例 | +|------|----------|-----| +| `claude-code` | 手元実装、テスト、Windows / PowerShell、日次 SOP | lint 修正、API、記事QA、今日の1時間 | +| `cursor` | Design Mode / UI、`/best-of-n`、Cloud、Bugbot、Tab で足りる小修正 | 余白、Next.js 16 のモデル比較、スマホから直す | +| `human` | merge、本番デプロイ、課金、秘密情報 | main merge、Render、APIキー | +| `human`(迷い) | 実装しない。理由を書いて待つ | Cursor と Claude **両方**に見える仕事、危険操作 | + +**プロジェクト名が無いことは迷いではない。** 「どのプロジェクト?」と聞いて止まらない。 + +| 依頼の種類 | 既定のパス | +|------------|------------| +| 余白 / 見た目 / Design Mode / カード | `coupon-board/`(一覧 `DealCard`) | +| lint / API / 手元テストで対象不明 | 今開いているリポ。無ければこのモノレポ | + +仮定は `agent -p` の文に 1 行書く。人間が別プロジェクトだと言ったらそちらへ付け替える。 + +## いま自分はどちらか + +Claude Code のセッション → 自分は `claude-code`。 + +相手から Agent DM / Issue で渡された仕事は、**判定をやり直して役割を入れ替えない。** やって結果を返す。 + +## 起動時 inbox + +エージェントとして起動したら、このモノレポに `cd` したあと、分類のあと・実装の前に: + +```powershell +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from claude-code +gh issue list --label agent-dm --state open +``` + +`gh` が無い・ラベルが無い・失敗したら無視して先へ。ラベル作成は人間。MCP ツールに `fetch_inbox` があるときだけ 1 回呼ぶ。無ければ入れない。聞かない。inbox があればルーターどおり処理。空なら今の依頼を続ける。 + +## WIP=1(分類・実装の前) + +`C:\Users\haruki\loop\state\wip.md` を読む。正は `.cursor/rules/wip-one.mdc`。AUTOより強い。 + +- `status: open` で今の依頼が別件 → 分類も実装もしない。3択だけ返す(続ける / 完走して切替 / パークして切替) +- 同じWIP、または `status: empty` → このルーターどおり進む。empty ならこの依頼を `wip.md` に書いてから分類する +- パークは `C:\Users\haruki\loop\state\queue.md` の `## パーク` 末尾に `- [ ]` で積むだけ。実行しない + +## 引き渡し + +自分の判定が `claude-code` → やる。 + +`cursor` の仕事: + +1. 同じ PC で `agent` がある → 下のコピペを **質問せずに** 実行し、自分は実装しない +2. 無い / Cloud 相当 → `node business-ops/scripts/agent-dm.mjs send --from claude-code --to cursor ...` して止まる。`gh issue` でもよい + +`human` の仕事: 実装しない。承認を待つ。 + +yolo / skip-permissions は使わない。 + +## 判定例 + +| 依頼 | 判定 | 動き | +|------|------|------| +| coupon-board の lint を直して | claude-code | 自分が実装する | +| 余白を直して(プロジェクト名なし) | cursor | 聞かずに下の `agent -p`。自分は UI を書かない | +| 一覧カードの余白を揃えて | cursor | `agent -p` か agent-dm。自分は UI を書かない | +| Next.js 16 の params を複数モデルで当てて | cursor | Cursor の `/best-of-n` に渡す | +| 本番にデプロイして | human | 止める | + +```powershell +agent -p "coupon-board の一覧カード(DealCard)の余白を他カードと揃えて。触ってよい: coupon-board/src/components/DealCard.tsx と一覧グリッド。完了条件: 同じ行のカードの高さと内部余白が揃う。リファクタ禁止。聞かないで進めて。" +``` diff --git a/.claude/skills/learning-coach/SKILL.md b/.claude/skills/learning-coach/SKILL.md new file mode 100644 index 0000000..7f451d1 --- /dev/null +++ b/.claude/skills/learning-coach/SKILL.md @@ -0,0 +1,43 @@ +--- +name: learning-coach +description: Autonomous personal study coach for Dify, RAG, Docker, AWS, terminal commands, 基本情報 vocabulary, work-study topics, and the AIgakusyu drill map. Use when the user says 学習支援, 勉強見て, Dify, RAG, RAGAS, Docker, AWS, ターミナル, 基本情報, 可視化, 学んだこと, or wants AI to pick today's one topic. Do not auto-implement code. SHIP ends the mode. +--- + +# 自律学習コーチ + +実装代行ではない。進捗の正は `http://127.0.0.1:5055/map`。 +説明は `http://127.0.0.1:5055/`。レーン指定は `/?lane=docker`(rag / aws / terminal / dify も可)。 +貼る全文: `C:\Users\haruki\AIgakusyu\docs\learning-coach-prompt.md` + +## 発動したら + +1. `work-study.md` と `coaching/explain_progress.json` を読む +2. レーン無指定なら未チェック先頭。レーンがあればそのセクションの先頭。選ばせない +3. `説明` / 起動語なし / Dify / Docker / RAG / AWS / ターミナル / 基本情報 はチャットで解説を始めない。サイトを開けと言う +4. 可視化を見たいときは `/map` を開けと言う + +## 禁止 + +- 先に完成解説・完成コード +- 新しい学習アプリ、受験計画、趣味のマネタイズ +- 複数トピック同時 +- 会社の実データ + +## レーン + +| 語 | やること | +|---|---| +| 本業 | work-study の会社ドメイン | +| Dify | チャットフロー/ワークフロー、ナレッジ、ツール、変数 | +| 語彙 | 基本情報の現場語。過去問を積むな | +| 手 | ターミナル。説明はサイト、打つのは自分 | +| Docker | イメージ/コンテナ、Compose、ボリューム | +| RAG | 検索してから渡す。RAGASは根拠。過去問禁止 | +| AWS | リージョン、IAM、EC2、S3。受験計画にするな | +| 可視化 | /map。弱いセクションを1つ | +| 説明 | :5055 のドリル | +| SHIP | 通常の実装に戻る | + +## 出力 + +今日の1件、URL(レーンなら `?lane=`)、先攻1つ、採点は穴1つの型。 diff --git a/.claude/skills/training-mode/SKILL.md b/.claude/skills/training-mode/SKILL.md new file mode 100644 index 0000000..63e62bc --- /dev/null +++ b/.claude/skills/training-mode/SKILL.md @@ -0,0 +1,71 @@ +--- +name: training-mode +description: Forces TRAINING MODE so the human thinks, types, and explains first. Use when the user says 訓練モード, 実務力が落ちた, ドリル, 説明させて, 手, 地図, 説明, 変換, or worries that AI is atrophying VS Code, terminal, frontend/backend, or 基本情報 skills. Do not auto-implement. SHIP ends the mode. +--- + +# 実務力コーチ(TRAINING MODE) + +SHIP(`ai-agent-mastery` / AUTO実装)は消さない。このSkillが発動している間だけ上書きする。 + +マスタープロンプト全文: `C:\Users\haruki\AIgakusyu\docs\training-mode-prompt.md` +自律学習コーチ: `C:\Users\haruki\AIgakusyu\docs\learning-coach-prompt.md` +予習在庫: `C:\Users\haruki\AIgakusyu\work-study.md` +会社用短縮版: `C:\Users\haruki\AIgakusyu\docs\work-prompts.md` セクション14 +可視化: `http://127.0.0.1:5055/map` + +## 発動したら最初にやれ + +1. 上記マスタープロンプトを読む +2. ユーザーに「全部やって」モードではないと一文で宣言する +3. 収益方針を1回だけ再掲する(回復=泳ゴルゲー、投資=ハッカソン、回収=CW/note/説明力。混ぜない) +4. 起動語を確認する。`説明`、または起動語が無いときはチャットで30秒説明を始めない。 + `http://127.0.0.1:5055/` を開け、と言う(AIgakusyu 訓練サイト。ポート5055)。 + 起動していなければ `C:\Users\haruki\AIgakusyu\drill` で `.\venv\Scripts\python.exe app.py` + +## このSkill中の禁止(AUTOより強い) + +- 先に完成コードを書く +- ユーザーが打つべきコマンドを先に実行する +- 答えを先に出す +- ファイルを勝手に実装して「直した」と終える +- 新しい学習システム、資格カリキュラム、趣味のマネタイズを提案する +- 会社の実コード・顧客名を要求する + +「代わりに全部やって」と言われたら1回拒否し、終わりたければ `SHIP` と言え、と返す。 + +## 起動語 + +| 語 | 20分でやること | 合格 | +|---|---|---| +| 手 | VS Code / ターミナル / Git を自分で打つ | 自分で実行し、結果を3行で言える | +| 地図 | 1操作を FE→HTTP→BE→保存→HTML で追う | 3行説明ができる | +| 説明 | チャット禁止。`http://127.0.0.1:5055/` で work-study 1件 | サイト上で30秒説明のあと穴1つ | +| 変換 | 今日の実務/ハッカソンを日報1行・note種・CW文脈のどれか1つ | 成果物が1つ残る | +| SHIP | このSkillを終了し、通常の実装代行に戻る | 訓練終了の宣言がある | + +## 「手」の固定メニュー(最初はこれ以外を考えるな) + +1. 今いる場所(pwd / Get-Location) +2. `git status` を3行で説明 +3. VS Code でファイル検索 → 該当行 +4. エラーから次に見る場所を1つ +5. ブラウザで「動いた」判定(テスト通過 ≠ 動く) + +## 「地図」の型 + +抽象図禁止。1操作を端から端。3行: +1. 入口がURL/イベントを振る +2. 保存担当が読み書きする +3. テンプレがHTMLに埋め込む + +## 毎ターンの出力 + +1. 今日の科目と制限時間 +2. ユーザーへの先攻指示(1つ) +3. ユーザーが答えたら 正確 / 不正確 / 欠け +4. 穴は1つだけ +5. 明日先輩に言える1文 + +## 対象者(固定。脚色するな) + +新卒SIer、メンテナンスAI。会社は VS Code + Cline + 社内Ollama。Flask TODO を2周。未達は回帰テスト。ハッカソン2026-08-22はP0起動不能・死んだ演出・Gemini復旧・公開経路が強み。穴は手元操作と30秒説明。 diff --git a/.codex/config.toml b/.codex/config.toml new file mode 100644 index 0000000..22cc265 --- /dev/null +++ b/.codex/config.toml @@ -0,0 +1,6 @@ +[mcp_servers.claude-code] +command = 'C:\Users\haruki\AppData\Roaming\npm\node_modules\@anthropic-ai\claude-code\bin\claude.exe' +args = [ + "mcp", + "serve", +] diff --git a/.cursor/mcp.json.example b/.cursor/mcp.json.example new file mode 100644 index 0000000..b6e4654 --- /dev/null +++ b/.cursor/mcp.json.example @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "claude-code": { + "command": "claude", + "args": ["mcp", "serve"] + } + } +} diff --git a/.cursor/permissions.json b/.cursor/permissions.json new file mode 100644 index 0000000..8a8a23d --- /dev/null +++ b/.cursor/permissions.json @@ -0,0 +1,11 @@ +{ + "autoRun": { + "allow_instructions": [ + "This workspace is the user's personal monorepo plus AIgakusyu study files. Allow local python, pytest, git (no force), skill edits, and Flask on 127.0.0.1:5055 without asking them to press Run.", + "Windows has no filesystem sandbox here. Allow unsandboxed shell with full permissions for those local tasks." + ], + "block_instructions": [ + "Ask before production deploy, force push, or deleting existing files." + ] + } +} diff --git a/.cursor/skills/agent-dm/SKILL.md b/.cursor/skills/agent-dm/SKILL.md new file mode 100644 index 0000000..c1f9817 --- /dev/null +++ b/.cursor/skills/agent-dm/SKILL.md @@ -0,0 +1,53 @@ +--- +name: agent-dm +description: ルーター判定のあと、相手エージェントへ配達する。起動時は inbox を見る。inbox・send・reply。同じPCの MCP/CLI が使えるときは配達に使わない。 +--- + +# Agent DM Skill(Cursor)— 配達 + +**先に `@agent-router`。** 分類が自分(cursor)ならここで配達しない。相手(claude-code)へ渡すチャネルだけがこの Skill。 + +## チャネル + +1. 同じ Windows で `claude-code` MCP が生きている → MCP で渡す。この CLI は使わない。 +2. Cloud / MCP 無し → スレッドまたは `gh issue`。 + +yolo / skip-permissions は使わない。詳細: `business-ops/agent-dm/CATALOG.md` と `PROTOCOL.md` + +## 自分 + +`--from cursor` + +## 手順 + +エージェント起動時(分類のあと・実装の前): + +```bash +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from cursor +gh issue list --label agent-dm --state open +``` + +`gh` 失敗は無視。MCP に `fetch_inbox` があるときだけ 1 回呼ぶ。無ければ入れない。聞かない。inbox があれば `show` → ルーターどおり作業(渡された実装は奪わない。レビューならレビュー)→ `reply`。空なら今の依頼を続ける。 + +新規に Claude へ渡すとき: + +```bash +node business-ops/scripts/agent-dm.mjs send \ + --from cursor --to claude-code \ + --title "短く何を頼むか" \ + --body "やってほしいこと。完了条件。触ってよいパス。禁止事項。" +``` + +```bash +git add business-ops/agent-dm/threads/ +git commit -m "chore(agent-dm): cursor → claude-code" +``` + +`main` には push しない。作業ブランチなら push してよい。 + +## 禁止 + +- ルーターを飛ばして実装する +- 最後に書いたのが cursor なら再返信しない +- 秘密情報・デプロイ・8 ターン超えて続ける diff --git a/.cursor/skills/agent-router/SKILL.md b/.cursor/skills/agent-router/SKILL.md new file mode 100644 index 0000000..2ddd27b --- /dev/null +++ b/.cursor/skills/agent-router/SKILL.md @@ -0,0 +1,87 @@ +--- +name: agent-router +description: 依頼を実装する前に Cursor / Claude Code / 人間へ分類する。エージェント起動時は inbox を見る。実装・テスト・日次SOPは Claude、UI・best-of-n・Cloud・レビューは Cursor、merge・デプロイは人間。相手の仕事なら自分では実装せず渡す。プロジェクト名が無くても UI/余白は coupon-board を既定にして渡す。 +--- + +# Agent Router(共通) + +どのツールに話しかけられても、**コードを書く前に分類する。** 自分の仕事でなければ実装しない。 + +判定の正: `business-ops/CURSOR_VS_CLAUDE.md`。配達の詳細: `business-ops/agent-dm/CATALOG.md` と `PROTOCOL.md`。相手の会話・思考・画面は読めない。渡すか、同じ git を読むかだけ。 + +## 判定表 + +| 判定 | 誰がやる | 例 | +|------|----------|-----| +| `claude-code` | 手元実装、テスト、Windows / PowerShell、日次 SOP | lint 修正、API、記事QAスクリプト、今日の1時間 | +| `cursor` | Design Mode / UI、`/best-of-n`、Cloud、Bugbot、Tab で足りる小修正 | 余白、Next.js 16 のモデル比較、スマホから直す | +| `human` | merge、本番デプロイ、課金、秘密情報 | main merge、Render、APIキー | +| `human`(迷い) | 実装しない。理由を書いて待つ | Cursor と Claude **両方**に見える仕事、危険操作 | + +Tab で足りる小修正はエージェントを起動しない(Cursor エディタの仕事)。 + +**プロジェクト名が無いことは迷いではない。** 「どのプロジェクト?」と聞いて止まらない。 + +| 依頼の種類 | 既定のパス | +|------------|------------| +| 余白 / 見た目 / Design Mode / カード | `coupon-board/`(一覧 `DealCard`) | +| lint / API / 手元テストで対象不明 | 今開いているリポ。無ければモノレポの作業ツリー | + +仮定は引き渡し文に 1 行書く。人間が別プロジェクトだと言ったらそちらへ付け替える。 + +## いま自分はどちらか + +- Cursor のセッション → 自分は `cursor` +- Claude Code のセッション → 自分は `claude-code` + +相手から Agent DM / Issue で渡された仕事は、**判定をやり直して役割を入れ替えない。** やって結果を返す。 + +## 起動時 inbox + +エージェントとして起動したら(Tab / Cmd+K ではやらない)、分類のあと・実装の前に: + +```bash +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from cursor +gh issue list --label agent-dm --state open +``` + +`gh` が無い・ラベルが無い・失敗したら無視して先へ。ラベル作成は人間。MCP ツールに `fetch_inbox` があるときだけ 1 回呼ぶ。無ければ入れない。聞かない。inbox があればルーターどおり処理。空なら今の依頼を続ける。Cloud ↔ 自宅の見逃し防止が主。同じ PC の MCP / `agent -p` はこれまでどおり。 + +## WIP=1(分類・実装の前) + +`C:\Users\haruki\loop\state\wip.md` を読む。正は `.cursor/rules/wip-one.mdc`。AUTOより強い。 + +- `status: open` で今の依頼が別件 → 分類も実装もしない。3択だけ返す(続ける / 完走して切替 / パークして切替) +- 同じWIP、または `status: empty` → このルーターどおり進む。empty ならこの依頼を `wip.md` に書いてから分類する +- パークは `C:\Users\haruki\loop\state\queue.md` の `## パーク` 末尾に `- [ ]` で積むだけ。実行しない + +## 引き渡し + +自分の判定と自分の役割が一致 → やる。 + +不一致: + +1. **同じ PC で相手が使える** + - Cursor → Claude: `claude-code` MCP(`claude mcp serve`)。無ければ下記 2。 + - Claude → Cursor: `agent -p "依頼。完了条件。触ってよいパス。"`(Cursor CLI)。`agent` が無ければ下記 2。 +2. **Cloud / コマンド無し** → `@agent-dm` で `send` して止まる。GitHub Issue(`gh`)でもよい。 +3. 渡したら **自分では実装しない。** 同じ実装を二重にやらない。 + +yolo / skip-permissions の MCP は使わない。コミット済み `.cursor/mcp.json` は作らない(Cloud に `claude` が無い)。 + +## 判定例 + +| 依頼 | 判定 | 動き | +|------|------|------| +| coupon-board の lint を直して | claude-code | Cursor なら MCP か agent-dm。Claude なら実装 | +| 余白を直して(プロジェクト名なし) | cursor | 既定 `coupon-board` の `DealCard`。Claude は聞かずに `agent -p`。Cursor なら実装 | +| 一覧カードの余白を揃えて | cursor | Claude なら `agent -p` か agent-dm。Cursor なら Design Mode | +| Next.js 16 の params を複数モデルで当てて | cursor | `/best-of-n`。Claude は渡す | +| 本番にデプロイして | human | どちらも実装しない。承認を待つ | + +Claude → Cursor のコピペ(プロジェクト未指定の余白): + +```powershell +agent -p "coupon-board の一覧カード(DealCard)の余白を他カードと揃えて。触ってよい: coupon-board/src/components/DealCard.tsx と一覧グリッド。完了条件: 同じ行のカードの高さと内部余白が揃う。リファクタ禁止。聞かないで進めて。" +``` diff --git a/.cursor/skills/ai-agent-mastery/SKILL.md b/.cursor/skills/ai-agent-mastery/SKILL.md index 298cf60..d406131 100644 --- a/.cursor/skills/ai-agent-mastery/SKILL.md +++ b/.cursor/skills/ai-agent-mastery/SKILL.md @@ -9,6 +9,23 @@ description: Cursor/Fableエージェントを最大限活用し「最強AIエ > 人間は**判断**だけ。実装・文案・調査・定型作業はエージェントに任せる。 +## ツール分担(Cursor vs Claude Code) + +Cursor を Claude Code の代わりにしない。手元実装は Claude Code、Cursor は Tab / Cloud Agent / Bugbot / Automations / `/best-of-n`。相手の会話・思考・画面は読めない。Agent Mail デーモンは入れない。エージェント起動時は inbox を見る。 + +| 任せる作業 | ツール | +|------------|--------| +| 手元の実装・テスト・提出 | Claude Code | +| 小さな修正(エージェント起動なし) | Cursor Tab / Cmd+K | +| UI クリック修正 | Cursor Design Mode | +| 非同期・スマホ・並列 | Cursor Cloud Agent | +| PR 監査・CI 失敗修正 | Bugbot / Automations | +| モデル比較(Next.js 16 など) | Cursor `/best-of-n` | +| 日次 SOP(朝チェック・1時間) | Claude Code skills | +| 相手エージェントへ依頼 | 先に `@agent-router`。配達は Agent DM | + +詳細: `business-ops/CURSOR_VS_CLAUDE.md` + ## 5つの原則 ### 1. 型を先に作る(再発明を禁止する) @@ -18,6 +35,7 @@ description: Cursor/Fableエージェントを最大限活用し「最強AIエ ### 2. 入力フォームを必ず挟む - 口頭の曖昧な指示より `project-brief.md` / `article-brief.md` - **入力が足りないときは推測で進め、仮定を明示** +- UI / 余白でプロジェクト名が無いときは `coupon-board` の一覧カードを既定にする。聞いて止まらない ### 3. 委任の粒度を決める @@ -71,6 +89,19 @@ Step 3: QAスクリプト → 人間確認 → 独立なら同時依頼、依存ありなら順番に ``` +### パターンE: Cursor → Claude Code(Agent DM) +``` +@agent-router +Claude の仕事なら渡す。実装は向こう。こちらはレビューだけ。 +``` + +### パターンF: 分類してから動く +``` +@agent-router +実装する前に claude-code / cursor / human のどれかだけを出す。 +自分の仕事でなければ実装しない。 +``` + ## Skillの組み合わせ | シーン | 呼び出すSkill | @@ -79,6 +110,12 @@ Step 3: QAスクリプト → 人間確認 | coupon-board | `@coupon-board-dev` | | 記事執筆 | `@article-production` | | エージェント設計 | `@ai-agent-mastery`(本Skill) | +| 実務力の訓練(考える・打つ・説明する) | `@training-mode`(SHIPと併用。実装代行はしない) | +| 自律学習(Dify・RAG・Docker・AWS・ターミナル・語彙・可視化) | `@learning-coach` | +| 全自動 ship | `@autopilot` | +| 先に分類 | `@agent-router` | +| Cursor と Claude の会話 | `@agent-dm`(配達) | +| ツール分担の確認 | `business-ops/CURSOR_VS_CLAUDE.md` | ## 週次振り返りテンプレート @@ -96,4 +133,9 @@ Step 3: QAスクリプト → 人間確認 ## 詳細プレイブック -`business-ops/AI_AGENT_MASTERY.md` +- `business-ops/AI_AGENT_MASTERY.md` +- `business-ops/CURSOR_VS_CLAUDE.md` — Cursor の存在意義と、Claude Code との使い分け +- `business-ops/GROKBOT_FLEET.md` — Grok Bot(常時稼働)と Cursor 内 Grok 4.6 +- `business-ops/templates/prompts/grokbot-fleet.md` — 参謀 / 夜勤調査 / 再現パックのコピペ(CW・note は対象外) +- `business-ops/agent-dm/PROTOCOL.md` — 配達 +- `.cursor/skills/agent-router/SKILL.md` — 分類 diff --git a/.cursor/skills/learning-coach/SKILL.md b/.cursor/skills/learning-coach/SKILL.md new file mode 100644 index 0000000..4cd959f --- /dev/null +++ b/.cursor/skills/learning-coach/SKILL.md @@ -0,0 +1,44 @@ +--- +name: learning-coach +description: Autonomous personal study coach for Dify, RAG, Docker, AWS, terminal commands, 基本情報 vocabulary, work-study topics, and the AIgakusyu drill map. Use when the user says 学習支援, 勉強見て, Dify, RAG, RAGAS, Docker, AWS, ターミナル, 基本情報, 可視化, 学んだこと, or wants AI to pick today's one topic. Do not auto-implement code. SHIP ends the mode. +--- + +# 自律学習コーチ + +実装代行ではない。進捗の正は `http://127.0.0.1:5055/map`。 +説明は `http://127.0.0.1:5055/`。レーン指定は `/?lane=docker`(rag / aws / terminal / dify も可)。 +触る部屋: `http://127.0.0.1:5080/`(`C:\Users\haruki\AIgakusyu\lab`)。 +貼る全文: `C:\Users\haruki\AIgakusyu\docs\learning-coach-prompt.md` + +## 発動したら + +1. `work-study.md` と `coaching/explain_progress.json` を読む +2. レーン無指定なら未チェック先頭。レーンがあればそのセクションの先頭。選ばせない +3. `説明` / 起動語なし / Dify / Docker / RAG / AWS / ターミナル / 基本情報 はチャットで解説を始めない。サイトを開けと言う +4. 可視化を見たいときは `/map` を開けと言う + +## 禁止 + +- 先に完成解説・完成コード +- 新しい学習アプリ、受験計画、趣味のマネタイズ +- 複数トピック同時 +- 会社の実データ + +## レーン + +| 語 | やること | +|---|---| +| 本業 | work-study の会社ドメイン | +| Dify | チャットフロー/ワークフロー、ナレッジ、ツール、変数 | +| 語彙 | 基本情報の現場語。過去問を積むな | +| 手 | ターミナル。説明はサイト、打つのは自分 | +| Docker | イメージ/コンテナ、Compose、ボリューム | +| RAG | 検索してから渡す。RAGASは根拠。過去問禁止 | +| AWS | リージョン、IAM、EC2、S3。受験計画にするな | +| 可視化 | /map。弱いセクションを1つ | +| 説明 | :5055 のドリル | +| SHIP | 通常の実装に戻る | + +## 出力 + +今日の1件、URL(レーンなら `?lane=`)、先攻1つ、採点は穴1つの型。 diff --git a/.cursor/skills/training-mode/SKILL.md b/.cursor/skills/training-mode/SKILL.md new file mode 100644 index 0000000..63e62bc --- /dev/null +++ b/.cursor/skills/training-mode/SKILL.md @@ -0,0 +1,71 @@ +--- +name: training-mode +description: Forces TRAINING MODE so the human thinks, types, and explains first. Use when the user says 訓練モード, 実務力が落ちた, ドリル, 説明させて, 手, 地図, 説明, 変換, or worries that AI is atrophying VS Code, terminal, frontend/backend, or 基本情報 skills. Do not auto-implement. SHIP ends the mode. +--- + +# 実務力コーチ(TRAINING MODE) + +SHIP(`ai-agent-mastery` / AUTO実装)は消さない。このSkillが発動している間だけ上書きする。 + +マスタープロンプト全文: `C:\Users\haruki\AIgakusyu\docs\training-mode-prompt.md` +自律学習コーチ: `C:\Users\haruki\AIgakusyu\docs\learning-coach-prompt.md` +予習在庫: `C:\Users\haruki\AIgakusyu\work-study.md` +会社用短縮版: `C:\Users\haruki\AIgakusyu\docs\work-prompts.md` セクション14 +可視化: `http://127.0.0.1:5055/map` + +## 発動したら最初にやれ + +1. 上記マスタープロンプトを読む +2. ユーザーに「全部やって」モードではないと一文で宣言する +3. 収益方針を1回だけ再掲する(回復=泳ゴルゲー、投資=ハッカソン、回収=CW/note/説明力。混ぜない) +4. 起動語を確認する。`説明`、または起動語が無いときはチャットで30秒説明を始めない。 + `http://127.0.0.1:5055/` を開け、と言う(AIgakusyu 訓練サイト。ポート5055)。 + 起動していなければ `C:\Users\haruki\AIgakusyu\drill` で `.\venv\Scripts\python.exe app.py` + +## このSkill中の禁止(AUTOより強い) + +- 先に完成コードを書く +- ユーザーが打つべきコマンドを先に実行する +- 答えを先に出す +- ファイルを勝手に実装して「直した」と終える +- 新しい学習システム、資格カリキュラム、趣味のマネタイズを提案する +- 会社の実コード・顧客名を要求する + +「代わりに全部やって」と言われたら1回拒否し、終わりたければ `SHIP` と言え、と返す。 + +## 起動語 + +| 語 | 20分でやること | 合格 | +|---|---|---| +| 手 | VS Code / ターミナル / Git を自分で打つ | 自分で実行し、結果を3行で言える | +| 地図 | 1操作を FE→HTTP→BE→保存→HTML で追う | 3行説明ができる | +| 説明 | チャット禁止。`http://127.0.0.1:5055/` で work-study 1件 | サイト上で30秒説明のあと穴1つ | +| 変換 | 今日の実務/ハッカソンを日報1行・note種・CW文脈のどれか1つ | 成果物が1つ残る | +| SHIP | このSkillを終了し、通常の実装代行に戻る | 訓練終了の宣言がある | + +## 「手」の固定メニュー(最初はこれ以外を考えるな) + +1. 今いる場所(pwd / Get-Location) +2. `git status` を3行で説明 +3. VS Code でファイル検索 → 該当行 +4. エラーから次に見る場所を1つ +5. ブラウザで「動いた」判定(テスト通過 ≠ 動く) + +## 「地図」の型 + +抽象図禁止。1操作を端から端。3行: +1. 入口がURL/イベントを振る +2. 保存担当が読み書きする +3. テンプレがHTMLに埋め込む + +## 毎ターンの出力 + +1. 今日の科目と制限時間 +2. ユーザーへの先攻指示(1つ) +3. ユーザーが答えたら 正確 / 不正確 / 欠け +4. 穴は1つだけ +5. 明日先輩に言える1文 + +## 対象者(固定。脚色するな) + +新卒SIer、メンテナンスAI。会社は VS Code + Cline + 社内Ollama。Flask TODO を2周。未達は回帰テスト。ハッカソン2026-08-22はP0起動不能・死んだ演出・Gemini復旧・公開経路が強み。穴は手元操作と30秒説明。 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a64052 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# ローカル MCP(example をコピーした実体。Cloud に claude が無いのでコミットしない) +.cursor/mcp.json +.claude/mcp.json diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..467fb63 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,21 @@ +# AGENTS.md + +This repository is a monorepo containing several independent projects: + +- `coupon-board/` — Next.js 16 web app (招待キャンペーン掲示板). Standalone npm project. +- `optimal-match/` — Next.js 16 web app (最適人探し matching MVP). Standalone npm project. +- `date-spark/` — ハッカソン#24 デートマンネリ解消(制作基盤。本体は Claude Code が `business-ops/templates/prompts/hackathon-24/01-claude-mvp.md` を貼って実装)。PORT=3002。optimal-match はフォークしない。 +- `ai-dashboard-kit/` — data/schemas/docs plus one Node context-generator script (`scripts/generate-claude-context.mjs`), no dependencies. +- `business-ops/` — Node automation/workflow scripts (`scripts/*.mjs`), no dependencies. +- `articles/` — markdown content only (not runnable). + +Per-project docs (READMEs, design docs) are the source of truth for each app. Each web app also has its own `AGENTS.md` noting that Next.js 16 has breaking changes — read `node_modules/next/dist/docs/` before writing Next.js code. + +## Cursor Cloud specific instructions + +- The two web apps are **not** an npm workspace. Each has its own `package.json` / `package-lock.json` and must be installed/run independently from inside its own directory. The startup update script already runs `npm ci` for both. +- Standard scripts live in each app's `package.json`: `npm run dev` (dev server), `npm run lint`, `npm run build`. CI (`.github/workflows/*-ci.yml`) runs `npm ci` → `npm run lint` → `npm run build`. +- Both apps default to **port 3000**. To run them at the same time, start one with a `PORT` override, e.g. `PORT=3001 npm run dev` for `optimal-match`. Each exposes a health check at `/api/health`. +- Both apps use `better-sqlite3` (a native module). The SQLite database file lives under each app's `data/` directory, which is git-ignored and **auto-created and seeded on first run** — no manual migration step. `coupon-board` seeds 5 sample deals; `optimal-match` seeds sample profiles so `/discover` is populated for a brand-new account. +- `optimal-match` runs fully with email/password auth out of the box. Google OAuth and Web Push are optional and stay disabled unless the vars in `optimal-match/env.example` are set; no `.env.local` is required for local dev. +- The helper scripts in `business-ops/` and `ai-dashboard-kit/` run with plain `node` and need no dependency install. `ai-dashboard-kit` writes generated output to its git-ignored `output/` directory. diff --git a/README.md b/README.md new file mode 100644 index 0000000..86d34b7 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# maou-workspace (マルチAIエージェント統合ワークスペース & プレイブック) + +> **Antigravity, Cursor, Claude Code, Codex, Grok Bot を統合運用するためのスキル体系・業務自動化テンプレート・企画書アーカイブ** + +--- + +## 📖 概要 + +本リポジトリは、開発者が日常的に利用する複数のAIエージェントの能力を最大限に引き出すための統合ナレッジ・スキルリポジトリです。 +各エージェントの得意分野に応じた役割分担(Router)、協調プロンプト、企画書の標準WBSテンプレート、および自律運用のための実行スクリプト群を管理しています。 + +--- + +## ✨ 主な構成 + +### 1. マルチエージェント・スキル体系 (.agents/skills/, .cursor/skills/, .claude/skills/) +- **gent-dm**: Antigravity, Cursor, Claude Code, Codex 間の共通メッセージング・メモリー共有 +- **gent-router**: ユーザーの指示内容(調査・実装・レビュー・資料化)に応じて最適なエージェントへタスクをルーティング +- **learning-coach**: デイリー学習・日次タスク・スキル定着の伴走支援 +- **utopilot**: 反復作業の完全自律実行 +- **rticle-production**: 技術記事・note・ブログの企画・執筆・校正パイプライン + +### 2. ビジネス運用 & 企画プレイブック (usiness-ops/) +- **CURSOR_VS_CLAUDE.md**: Cursor と Claude Code の特性比較・最適使い分け指針 +- **AI_AGENT_MASTERY.md**: エージェントを統率するための実践ガイドライン +- **GROKBOT_FLEET.md**: Grok Bot による部署別(PM・企画・実装・QA・資料・安全)直列フリート運用方針 +- **企画ブリーフ (usiness-ops/briefs/)**: + - date-spark.md: デートマンネリ化解消アプリ企画書 + - dopagaki-blocker.md: ドパガキ対策・集中支援アプリ企画書 +- **プロンプトテンプレート (usiness-ops/templates/prompts/)**: + - ハッカソン提出物一括自動生成プロンプト + - Grok Bot フリート用プロンプト集 + +### 3. Date Spark 開発基盤 (date-spark/) +- ハッカソン#24 採用企画の実装リソース・要件定義・プロトタイプ diff --git a/business-ops/AI_AGENT_MASTERY.md b/business-ops/AI_AGENT_MASTERY.md index 43fbdc0..bd5d48e 100644 --- a/business-ops/AI_AGENT_MASTERY.md +++ b/business-ops/AI_AGENT_MASTERY.md @@ -10,6 +10,22 @@ | ゴール | 最強AIエージェントマスター | | レベル | **L3(autopilot 全自動投稿)** | +## ツール分担(Cursor vs Claude Code) + +手元の実装は Claude Code。Cursor は Tab・Cloud Agent・Bugbot・Automations・モデル比較。**依頼が来たら `@agent-router` が先に分類する。** 同じ「対話実装」を二重にやらない。相手の会話・思考・画面を勝手に読む口は無い。Agent Mail デーモンは入れない。エージェント起動時は inbox を見る。 + +| 作業 | 使うもの | +|------|----------| +| 手元の実装・テスト・提出 | Claude Code | +| 小さな修正・記事の穴埋め | Cursor Tab / Cmd+K | +| UI の見た目修正 | Cursor Design Mode | +| スマホ・裏での修正 | Cursor Cloud Agent | +| PR 監査 / CI 失敗の自動修正 | Bugbot / Automations | +| Next.js 16 など判断が割れる実装 | Cursor `/best-of-n` | +| 朝のチェック・今日の1時間 | Claude Code skills(`ai_company`) | + +詳細・調査根拠: `business-ops/CURSOR_VS_CLAUDE.md` + ## マスターの定義 > **判断だけ人間。あとはエージェント。** @@ -49,6 +65,12 @@ | `@coupon-board-dev` | 掲示板の修正 | | `@article-production` | 記事(副業) | | `@ai-agent-mastery` | 委任設計・振り返り | +| `@autopilot` | 全自動 ship(Cursor) | +| `@agent-router` | 実装前の分類(必須) | +| `@agent-dm` | 分類後の配達 | +| `CURSOR_VS_CLAUDE.md` | Cursor と Claude Code の分担 | +| `GROKBOT_FLEET.md` | Grok Bot(常時稼働)と Cursor 内 Grok 4.6 の分担 | +| `templates/prompts/grokbot-fleet.md` | 参謀 / 夜勤調査 / 再現パック / 司令塔のコピペ(CW・note は対象外) | ## スクリプト一覧 @@ -64,7 +86,9 @@ 1. **今日:** `autopilot check` → `autopilot new` → `@autopilot` で1本通す 2. **今週:** 毎回 `ship --yes` をエージェント完了時に自動実行 3. **来週:** brief 以外は一切触らず PR まで完走を確認 -4. **L4:** 実装も含め完全自律(brief のみ人間) +4. **L4:** 実装も含め完全自律(brief のみ人間)。Cursor は非同期・監査、Claude Code は手元実装、という分担を崩さない + +L4 で必要になる設定(Environment / Bugbot / draft PR 仕分け)は `CURSOR_VS_CLAUDE.md` の「人間がやること」。 ## 委任の境界線(絶対に守る) diff --git a/business-ops/CURSOR_VS_CLAUDE.md b/business-ops/CURSOR_VS_CLAUDE.md new file mode 100644 index 0000000..bac9ac3 --- /dev/null +++ b/business-ops/CURSOR_VS_CLAUDE.md @@ -0,0 +1,177 @@ +# Cursor だからこそできること + +> 調査日: 2026-08-18 +> 対象: GitHub `maouM-cmd/-`(本モノレポ)と `maouM-cmd/ai_company`(Claude Code 側) +> 結論だけ先に読むなら「役割分担」まで。設定作業は「人間がやること」へ。 + +## 結論 + +Claude Code が「実装・テスト・提出」で勝っているなら、Cursor を同じ用途で使う必要はない。存在意義は **編集中の補完(Tab)・裏で回す Cloud Agent・GitHub の自動レビュー(Bugbot)・イベント駆動(Automations)・Composer/Grok との使い分け** にある。 + +`ai_company` の `CLAUDE.md` にはすでにこう書いてある: + +- 編集・差分確認 → Cursor +- 実装・テスト・提出 → Claude Code + +この切り方だと Cursor は「きれいな差分ビューア」になり、存在意義はほぼ消える。一方、本モノレポの `.cursor/skills/` と `business-ops/` は **Cursor を指揮官** として設計されている。**頭の中の役割分担と、リポジトリの設計が食い違っている** のが「意義が感じられない」主因。 + +片方を捨てる話ではない。Claude Code は日次 SOP、Cursor は非同期・監査・マルチモデルのレイヤー。 + +## 役割分担(これだけ守る) + +| 作業 | 使うもの | 理由 | +|------|----------|------| +| 手元の実装・テスト・提出 | **Claude Code** | ターミナル完結。`ai_company` の日次 Skill がここに最適化されている | +| 小さな修正・記事の穴埋め | **Cursor Tab / Cmd+K** | エージェントを起動しない日常の 8 割。Claude Code に無い | +| coupon-board の見た目修正 | **Cursor Design Mode** | 内蔵ブラウザで `localhost:3000` をクリックして直す | +| 電車・睡眠中の修正、スマホ起動 | **Cursor Cloud Agent** | すでにモバイルから起動済み。Environment を足すと実用になる | +| PR のセキュリティ/バグ監査 | **Cursor Bugbot** | 個人 GitHub 向けの製品レビュー。記事の「監査ゼロで炎上」対策 | +| CI 失敗 → 修正 PR | **Cursor Automations** | Claude Routines よりトリガーが広い | +| Next.js 16 など判断が割れる実装 | **Cursor `/best-of-n`** | Composer / GPT / Grok を並列比較。Claude 族だけではできない | +| 朝のチェック・今日の 1 時間・週報 | **Claude Code skills** | `ai_company` 側に既にある。移さない | +| 相手エージェントへ仕事を渡す | **先に `@agent-router`** | 同じPCは MCP / `agent -p`。Cloud は Agent DM | + +**やらない方がいい使い方:** Claude Code と同じ「手元で対話して実装」を Cursor Agent でもう一度やる。ルーターが相手の仕事と判定したら渡して、自分では実装しない。 + +## 現状(GitHub と設定から) + +### 2 つのサイロ + +| リポジトリ | 役割 | あるもの | 無いもの | +|------------|------|----------|----------| +| [`maouM-cmd/-`](https://github.com/maouM-cmd/-) | Web 開発パイプライン | `.cursor/skills/` 5 本、autopilot、coupon-board / optimal-match | `.claude/`、Environment、Bugbot 設定 | +| [`maouM-cmd/ai_company`](https://github.com/maouM-cmd/ai_company) | 日次 OS(Windows) | グローバル `CLAUDE.md`、`.claude/skills/` 5 本 | `.cursor/` | + +Cursor は `.claude/skills` も読むが、モノレポにはそれが無い。Claude Code は `.cursor/skills` を日次では読まない。スキルがリポジトリごとに分断されている。 + +### すでに触っているが、活きていない Cursor 機能 + +- **Cloud Agent をモバイルから起動済み**(coupon-board、AI ダッシュボード、ハッカソン準備)。 +- Automation [Pull Request Approver](https://cursor.com/automations/952cce8a-6e19-11f1-a8a0-cafc5ef88358) が有効。同名エージェントが十数本走っており、**ノイズになっている**。 +- 本リポジトリに **Environment(`.cursor/environment.json`)が無い**。Cloud Agent は毎回素の VM から立ち上がる。 +- PR はほぼ `cursor/*` ブランチだが、**オープン draft が 10 本**(nomikai-ai、interview-cue、cosme-note など)。着手は速いが閉じない。 +- Issue はゼロ。GitHub トリガーの Automation を繋ぐ先が無い。 + +### Claude Code 側の強み(移さない) + +`ai_company` の skills は「今日の 1 時間」「朝のチェック」など **考える工程を消す SOP**。モノレポの Cursor skills は Web 開発パイプライン。用途が違う。 + +## 比較(2026-08 時点) + +Cloud Agent・Plan・Skills・モバイル起動は両方にある。差別化は次の層。 + +| 能力 | Cursor | Claude Code | このワークスペースでの意味 | +|------|--------|-------------|---------------------------| +| Tab / Cmd+K | エディタ内補完・インライン編集 | 無し(エージェント先行) | coupon-board の小修正、記事 Markdown | +| 手元の対話実装 | あるが重複 | **主戦場** | 実装は Claude Code に任せる | +| Design Mode / 内蔵ブラウザ | `localhost` をクリックして直す | Chrome 拡張はログイン済み自分のブラウザ向き | coupon-board UI | +| Cloud Agent | 隔離 VM、成果物、デスクトップ接管 | claude.ai/code、GitHub 中心 | スマホから直す。Environment 未設定が弱点 | +| Automations | CI / ラベル / レビュー / Slack / スケジュール | Routines はスケジュールと PR/Release が中心 | 今の PR Approver はここに置き換える | +| PR レビュー | **Bugbot**(個人でも製品として載る) | マネージドは Team 向けで単価が高い | セキュリティ監査の穴を塞ぐ | +| モデル | Composer / Grok / GPT / Gemini / Claude | Claude 族のみ | 量は Composer/Grok、詰まりは Claude/GPT | +| `/best-of-n` | 複数モデルを worktree で比較 | 同族の並列セッションのみ | Next.js 16 の破壊的変更 | +| Skills | `.cursor/skills` + `.claude/skills` | `.claude/skills` | モノレポに両方ある。Agent DM は共通 | + +## このときだけ Cursor(コピペ用) + +### 1. Tab で小さな穴を埋める + +エージェントを開かない。関数の続き、props のリネーム後の追随、記事の定型セクション。Claude Code では代替できない。 + +### 2. Design Mode で coupon-board の見た目 + +``` +Agents Window のブラウザで localhost:3000 を開く +→ Design Mode +→ 直したい箇所をクリック or 囲む +→ 「このカードと同じ余白に」 +``` + +### 3. スマホから Cloud Agent + +[cursor.com/agents](https://cursor.com/agents) または iOS アプリ: + +``` +coupon-board の CI が赤い。失敗ログを読んで直して draft PR を出して。 +@coupon-board-dev に従い、設計書と無関係なリファクタはしない。 +``` + +Environment が無いあいだは、エージェントが `npm install` から始める。Builds を足すと「電車で直して帰宅前に PR」が現実になる。 + +### 4. `/best-of-n` で Next.js 16 を当てる + +`coupon-board/AGENTS.md` が警告している破壊的変更向き。 + +``` +/best-of-n composer,gpt,grok +coupon-board の params 非同期化を実装し、回帰テストを足して。 +node_modules/next/dist/docs/ を読んでから API を使うこと。 +``` + +勝った worktree だけ残す。 + +### 5. Bugbot を PR に載せる(人間がダッシュボードで有効化) + +記事「Claude Codeと歩む4ヶ月」の失敗パターン(仕様を丸投げしてセキュリティ監査ゼロ)への直接対策。有効化後、レビュー方針は `.cursor/BUGBOT.md` に書く(この調査ではファイルは作らない)。 + +### 6. CI 失敗 Automation(PR Approver の代わり) + +今の [Pull Request Approver](https://cursor.com/automations/952cce8a-6e19-11f1-a8a0-cafc5ef88358) は同名ランが連発している。止めるか条件を絞り、代わりに: + +- GitHub: CI completed(失敗)→ 原因コメント or 修正 draft PR +- PR レビューコメント → 指摘の自動修正 + +ダッシュボード操作は人間のみ。 + +### 7. Cursor と Claude Code で会話する + +製品の相互DMは無い。相手の会話・思考・画面を勝手に読むこともできない。**先に `@agent-router`。** エージェント起動時は inbox を見る(`agent-dm.mjs inbox` と `gh issue list --label agent-dm`。`fetch_inbox` があるときだけ呼ぶ)。同じ PC なら公式 `claude mcp serve` / `agent -p`([`CATALOG.md`](agent-dm/CATALOG.md))。Cloud ↔ 自宅はスレッド or GitHub Issue。Agent Mail デーモンは入れない。 + +``` +@agent-router +lint 修正なら Claude に渡す。余白なら Design Mode。デプロイなら人間。 +プロジェクト名が無い余白は coupon-board の DealCard。聞いて止まらない。 +``` + +## 足りないこと + +設定・運用の穴。コードを増やせば埋まるものではない。 + +- ツール分担が文書化されていなかった(本ファイルで固定する)。 +- `AI_AGENT_MASTERY.md` / SOP は Cursor 前提、`ai_company/CLAUDE.md` は Cursor = 差分。食い違い。 +- `.cursor/rules` も `.cursor/BUGBOT.md` も Environment も無い。 +- Autopilot L2 は「作って draft PR まで」。レビュー・マージ・捨てる判断が無い → draft の墓場。 +- セキュリティの教訓が実装フロー(Bugbot / preflight)に繋がっていない。 +- Issue がゼロなので、Issue → 実装の Automation を繋ぐ先が無い。 +- Cursor と Claude Code の公式相互DMは無い(ルーター + MCP/`agent -p` + Agent DM で代替)。相手のセッションを勝手に読む口も無い。 + +## これから必要になること(L4 に行くなら) + +目標は「brief 以外はエージェント、人間は承認のみ」。そのための次の層: + +1. **役割固定** — `@agent-router` の表を週次で確認する。Cursor Agent で手元実装を始めない。 +2. **共通の短いルート `AGENTS.md`** — 両方に読ませるスタックと禁止事項。詳細 SOP は各ツールの skills に残す。 +3. **Cloud Environment** — coupon-board の `npm install` を Build に載せ、エージェントがすぐ `next dev` できるようにする。`.cursor/environment.json` は別タスク。 +4. **Bugbot + CI 失敗 Automation** — PR Approver は止めるか絞る。 +5. **draft PR の仕分け** — 残す / 捨てる / Cloud Agent で 1 本仕上げる、を人間が決める。エージェントは実行だけ。 + +### 人間がやること(この文書ではやらない) + +ダッシュボード・マージ・課金に触れる操作。エージェントは実行しない。 + +- [ ] [Pull Request Approver](https://cursor.com/automations/952cce8a-6e19-11f1-a8a0-cafc5ef88358) を無効化、または発火条件を絞る +- [ ] このリポジトリで Bugbot を有効化する +- [ ] Cloud Agent Environment を作り、coupon-board 用 Build を載せる +- [ ] オープン draft PR 10 本を「残す / 閉じる / 仕上げる」に仕分ける +- [ ] 必要ならルート `AGENTS.md` と `.cursor/BUGBOT.md` を次のタスクで追加する +- [ ] 同じ PC: `node business-ops/scripts/enable-local-mcp.mjs` のあと、Cursor で MCP `claude-code` を承認(`mcp.json` はコミットしない) + +## 関連 + +- Grok Bot / Grok 4.6: `business-ops/GROKBOT_FLEET.md` と `business-ops/templates/prompts/grokbot-fleet.md` +- プレイブック: `business-ops/AI_AGENT_MASTERY.md` +- SOP: `business-ops/SOP.md` +- Skill: `.cursor/skills/ai-agent-mastery/SKILL.md` +- Agent DM: `business-ops/agent-dm/CATALOG.md` と `PROTOCOL.md` +- ルーター: `.cursor/skills/agent-router/SKILL.md` +- 自動化候補(古い一覧): `business-ops/AUTOMATION_CANDIDATES.md` diff --git a/business-ops/GROKBOT_FLEET.md b/business-ops/GROKBOT_FLEET.md new file mode 100644 index 0000000..831d17d --- /dev/null +++ b/business-ops/GROKBOT_FLEET.md @@ -0,0 +1,177 @@ +# Grok Bot × 複数エージェント運用 + +> 調査日: 2026-08-27 +> 対象: [Grok Bot](https://x.ai/news/introducing-grok-bot)(2026-08-26 から Cursor Pro 込み)と [Cursor 内 Grok 4.6](https://cursor.com/blog/grok-4-6) +> 結論だけ読むなら「役割地図」と「最小3人」まで。貼る文は `templates/prompts/grokbot-fleet.md`。 +> **境界(2026-08-27):** CrowdWorks / note / `ai_company` の日次 SOP は触れない。Claude Code 側のまま。この層は Web モノレポ(coupon-board / optimal-match / GitHub)だけ。 + +## 結論 + +Grok Bot は Cursor の代わりではない。**PC を閉じても続く Web 側の準備**の層。手元の実装は今までどおり Claude Code。Cursor 内の Grok 4.6 は、長い調査・UI の一発目・複数モデル比較の層。 + +CrowdWorks・note・今日の1時間は `ai_company` の Claude Code skills。Grok Bot に移さない。下書きも調査もしない。 + +三つを同じ「対話してコードを書く」用途で回すと、既存の `@agent-router` が壊れる。 + +## いま使えるもの(混同しない) + +| 名前 | 何か | いつ使う | +|------|------|----------| +| **Grok Bot** | xAI の常時稼働アプリ。名前付き Bot、クラウド PC、グループチャット。Cursor の使用量とは別枠 | Web の夜勤調査、CI 再現パック、draft PR 仕分け、日次ダイジェスト。Windows のコードは触らせない | +| **Cursor の Grok 4.6** | IDE 内モデル。長時間のツール使用・自己検証・視覚/対話 UI の初稿が強い | リポ内の長い仕事、`/best-of-n` の一票、Task サブエージェントの司令 | +| **Claude Code** | 手元実装・テスト・日次 SOP | lint、API、今日の1時間、CrowdWorks、note | +| **Codex / Composer / GPT** | Cursor 内の別モデル | `/best-of-n` の対抗馬。単体の日常実装にはしない | + +公式の要点(Grok Bot): + +- Bot は最大 50(グループ含む)。グループは 2〜6 人 +- 仕事は **繰り返し成果を持つ役割** に付ける。「何でも屋」は作らない +- 会話はタスク、**プロフィール説明は常設ルール** +- 外部送信・公開・課金・本番変更は承認の後ろ +- Skill(やり方)→ 二回目で安定 → Routine(いつ回すか)。いきなり定期実行しない +- クラウド PC は自宅 Windows とは別。ローカル操作は別許可 + +公式の要点(Grok 4.6): + +- 長いエージェント仕事向け。ツールを使い、結果を見て方針を変える +- 漠然としたプロダクト案を動く初版まで持っていくのが強い +- 視覚・インタラクティブの一発目が 4.5 より厚い +- effort: xhigh / high(既定)/ medium / low + +## 役割地図(このワークスペース) + +既存の正は `CURSOR_VS_CLAUDE.md`。Grok 層を足すとこうなる。 + +| 作業 | 使うもの | やらないもの | +|------|----------|----------------| +| 今日の WIP を1本に保つ | Grok Bot **参謀**(読み取り・仕分け) | 参謀が実装を始めない | +| 夜・電車・PC オフの Web 調査と再現 | Grok Bot 専門 Bot | Cursor Agent の二重起動 | +| coupon-board の見た目 | Cursor Design Mode | Grok Bot に CSS を書かせない | +| Next.js 16 など判断が割れる実装 | Cursor `/best-of-n composer,gpt,grok` | 同族モデルだけの並列 | +| 手元の実装・テスト | Claude Code | Grok Bot のクラウド PC で `npm` | +| 朝チェック・今日の1時間・CW・note | Claude Code skills(`ai_company`) | Grok Bot に寄せない。読むな | +| PR 監査 | Bugbot | Grok Bot に merge させない | +| 相手へ仕事を渡す | `@agent-router` → Agent DM / `agent -p` | Grok Bot グループを「第二のルーター」にしない | + +**やらない方がいい使い方:** Grok Bot に coupon-board を実装させる。Claude Code と同じ対話実装をもう一本増やす。Bot を 10 個作って自分が中継になる。CrowdWorks / note / `articles/` を Grok Bot にやらせる。 + +## 最小3人(これ以上は作らない) + +公式も「最小の有用な編成から」としている。この家の Web 層では3つで足りる。 + +| Bot | 所有する成果 | 承認の線 | +|-----|--------------|----------| +| **参謀** | ソース付きダイジェストと「次の1手」。WIP=1 の番人 | 送信・予定変更・WIP 上書き禁止。CW/note に触れない | +| **夜勤調査** | 翌朝使える Web ブリーフ(CI / Next.js / 仕様) | コード変更禁止。CW/note 禁止 | +| **再現パック** | coupon-board / optimal-match の再現手順とスクショ | 実装しない。本番顧客データ禁止 | + +4つ目を足してよい条件: 同じ Web 成果が週3回以上出て、参謀が毎回中継で詰まるときだけ。検証済みの作成物は `templates/prompts/grokbot-bots/`。 + +## 検証結果(2026-08-27・複数エージェント) + +リポ上の繰り返し業務(CI / Render / preflight / Next 16 docs / draft PR)と、Cursor 公式(Cloud Environment はダッシュボード必須、Bugbot は製品、`/best-of-n` は IDE の UI、Grok Bot は別製品)を突き合わせた。 + +| 候補 | 判定 | +|------|------| +| 参謀 / 夜勤調査 / 再現パック | **作る。** `templates/prompts/grokbot-bots/01`〜`03` | +| 追加の4人目 | **作らない(KEEP 0)。** 同じ「読んで1枚出す」を増やさない | +| Render健康 | **FOLD → 夜勤。** health の1行。専用 Bot にしない | +| 秘密スキャン Bot | **FOLD → 参謀**(パスと種類だけ)+ **Bugbot を有効化** | +| Cloud Environment Bot | **REJECT。** 草案だけ `templates/cursor-environment.json.example` | +| best-of-n 書記 | **REJECT。** `/best-of-n composer,gpt,grok` | +| Next16通訳を Grok Bot にする | **FOLD → 夜勤が Cursor へ渡す。** docs は Windows の `node_modules` | +| 下書き墓守 | **FOLD → 参謀** の週次 | + +**人間がダッシュボードでやること:** Bugbot 有効化、Cloud Agent Environment の作成と緑の Build。Grok Bot を増やしても VM は素のまま。 + +## 作らない(既存か、別サイロ) + +`CURSOR_VS_CLAUDE.md` の穴の扱いも検証結果の表に従う。週3回同じ成果が出るまで Bot を増やさない。 + +| 作りたくなるもの | 理由 | +|------------------|------| +| 実装 Bot / パッチ Bot | Claude Code の仕事 | +| UI を直す Bot | Cursor Design Mode | +| CrowdWorks / note / 今日の1時間 | `ai_company`。触れない | +| Pokemon / WEBAPI 係 | セッション分離。このモノレポの Grok Bot に載せない | +| Hermes / OpenClaw の代わり | ハートビートは向こう | +| 何でも屋 | 公式も禁止。文脈が再利用できない | +| PR Approver の代わりに approve する Bot | 今の Automation がノイズ。Bot で増やさない | + +## 独自案(公式の延長でこの家向け) + +### 1. WIP=1 参謀(最優先) + +Grok Bot 公式の Chief of Staff は「昨日何が動いたか」のダイジェスト係。ここでは **新しい仕事を始めない係** にする。アイデアが来たら `queue.md` のパークへ回す文だけ返す。実装エージェント(Claude / Cursor / 自分)の代わりに着手しない。CW / note の項目はダイジェストに載せない(`ai_company` 側)。 + +これが無いと、常時稼働 Bot が WIP=1 を壊す。 + +### 2. 三層ループ(夜→朝→実装)— Web だけ + +``` +夜 Grok Bot 夜勤調査 … PC オフでも CI / 仕様ブリーフを積む +朝 参謀ダイジェスト … 人間が WIP を1行決める(Web 件だけ) +昼 Cursor Grok 4.6 … 構造・UI初稿・/best-of-n + Claude Code … 手元実装とテスト +晩 人間 … push / デプロイだけ +``` + +同じ成果を二層で同時に作らない。夜勤が「下書き」、昼が「本体」。CrowdWorks / note はこのループに入れない。 + +### 3. CI 再現グループ(最大3人・段階オーナー) + +公式のグループキックオフを、coupon-board / optimal-match の赤い CI に接続する。 + +- 夜勤調査が失敗ログと当たり範囲 +- 再現パックが手順・スクショ・期待と実際 +- 参謀が「Claude に渡す1通」を出す。実装はしない + +Grok Bot にリポを clone して直させるのは禁止(クラウド PC ≠ この Windows)。 + +### 4. 再現パック → Agent DM(実装しない) + +公式の Bug Reproduction を、この家の配達に接続する。 + +- Grok Bot が staging / localhost で再現し、手順・スクショ・期待と実際をパックにする +- パックを `business-ops/briefs/` に置くか、参謀が「Claude に渡す文」を出す +- 実装は Claude Code。Cursor はレビューか Design Mode + +### 5. 下書き墓守(週1 Routine) + +`CURSOR_VS_CLAUDE.md` の未処理: オープン draft PR が溜まる。参謀の週次 Routine で「残す / 閉じる / Cloud Agent で仕上げる」の3分類表だけ出す。人間が決める。Bot は close も merge もしない。 + +### 6. 反転コーチ(任意・Web 訓練だけ) + +AUTO 実装の逆。coupon-board / optimal-match の「手 / 地図 / 説明」。答えを先に出さない。今日の1時間の B ブロックや `ai_company` の学習 SOP は移さない。 + +### 7. モデル陪審(Cursor 内) + +判断が割れる実装だけ: + +``` +/best-of-n composer,gpt,grok +``` + +勝った worktree だけ残す。Grok 4.6 は「量と初稿」側、GPT は「詰まり」、Composer は「速さ」。日常の小さな修正に陪審を使わない。 + +### 8. 睡眠ハンドオフ(定型1通) + +寝る前に参謀へ1通。朝に **Web 側だけ** のダイジェストが返る。CW / note は書かせない。新しい WIP は作らせない。プロンプト本文はテンプレ側。 + +## セットアップ順(いきなり Routine しない) + +1. Grok Bot アプリを入れる(Cursor Pro に含まれる。使用量は Cursor と別枠) +2. 参謀だけ作る。プロフィールに常設ルールを貼る(CW/note 禁止を含む) +3. 安全な1タスク(Web ダイジェスト、送信なし)を一回やる +4. 直してから Skill 化 +5. 夜勤調査・再現パックを足す。グループは CI 再現のときだけ +6. 平日朝の Routine はダイジェストが2回安定してから +7. Cursor 側はモデルを Grok 4.6 にして長い1件を試し、`/best-of-n` は Next.js 16 のときだけ + +## 関連 + +- コピペ: `business-ops/templates/prompts/grokbot-fleet.md` +- 分担の正: `business-ops/CURSOR_VS_CLAUDE.md` +- 分類: `.cursor/skills/agent-router/SKILL.md` +- 配達: `business-ops/agent-dm/PROTOCOL.md` +- 公式: [Grok Bot bots](https://docs.x.ai/grok-bot/bots) / [chat](https://docs.x.ai/grok-bot/chat-and-collaboration) / [skills](https://docs.x.ai/grok-bot/skills-routines-and-automations) / [Grok 4.6](https://cursor.com/docs/models/grok-4-6) diff --git a/business-ops/README.md b/business-ops/README.md index 55c7fdb..fdab516 100644 --- a/business-ops/README.md +++ b/business-ops/README.md @@ -48,6 +48,9 @@ business-ops/ ├── README.md ├── SOP.md ├── AI_AGENT_MASTERY.md # マスターへの道筋 +├── CURSOR_VS_CLAUDE.md # Cursor の存在意義と Claude Code との分担 +├── GROKBOT_FLEET.md # Grok Bot / Grok 4.6 と既存フリートの分担 +├── agent-dm/ # 会話口のカタログ + Cloud用スレッド ├── BUSINESS_MAP.md ├── AUTOMATION_CANDIDATES.md ├── scripts/ @@ -57,12 +60,19 @@ business-ops/ │ ├── new-article.mjs │ ├── article-qa.mjs │ ├── topic-dedup.mjs +│ ├── agent-dm.mjs # Cloud用フォールバック・スレッド +│ ├── enable-local-mcp.mjs # 自宅PCで mcp.json を作る │ └── pre-deploy-check.sh ├── templates/ │ ├── project-brief.md # 新規開発入力フォーム │ ├── article-brief.md │ ├── agent-retrospective.md +│ ├── claude-agent-dm.md # ai_company の CLAUDE.md へ貼る断片 +│ ├── cursor-environment.json.example # Cloud Agent 草案。ダッシュボードは人間 │ └── prompts/ +│ ├── grokbot-fleet.md +│ ├── grokbot-bots/ # 検証済み・アプリへ貼る Bot +│ └── hackathon-24/ # デートスパーク制作基盤(貼る文) ├── checklists/ │ ├── github-ship.md │ ├── article-publish.md @@ -73,13 +83,23 @@ business-ops/ ├── web-dev-github/SKILL.md ├── ai-agent-mastery/SKILL.md ├── article-production/SKILL.md -└── coupon-board-dev/SKILL.md +├── coupon-board-dev/SKILL.md +├── agent-dm/SKILL.md +└── agent-router/SKILL.md + +.claude/skills/ +├── agent-dm/SKILL.md +└── agent-router/SKILL.md .github/ ├── pull_request_template.md └── ISSUE_TEMPLATE/ ``` +## Cursor と Claude Code + +手元の実装は Claude Code。Cursor は Tab・Cloud Agent・Bugbot・Automations。依頼は先に `@agent-router`。同じPCなら `claude mcp serve` / `agent -p`、Cloudなら `agent-dm/`。 + ## Cursor Skill の呼び方 | Skill | 呼び出し | @@ -89,6 +109,8 @@ business-ops/ | **エージェントマスター** | `@ai-agent-mastery` | | 記事制作 | `@article-production` | | 掲示板開発 | `@coupon-board-dev` | +| 先に分類 | `@agent-router` | +| Cursor と Claude の会話 | `@agent-dm` / Claude 側は「inbox 見て」 | ## 安全ルール diff --git a/business-ops/SOP.md b/business-ops/SOP.md index 5632af6..67410a7 100644 --- a/business-ops/SOP.md +++ b/business-ops/SOP.md @@ -2,6 +2,26 @@ > 主業務: Web開発 / くり返し: GitHub投稿 / ゴール: 最強AIエージェントマスター +## エージェントが先に分類する + +依頼を受けたツールは、実装の前に `@agent-router` で判定する。自分の仕事ならやる。相手の仕事なら渡す。merge / デプロイは人間。プロジェクト名が無い余白 / UI は **coupon-board の一覧カード** を既定にする。「どのプロジェクト?」と聞いて止まらない。 + +同じ実装を Cursor と Claude Code の両方でやらない。根拠: `CURSOR_VS_CLAUDE.md` + +相手の会話・思考・画面を勝手に読むことはできない。Agent Mail デーモンは入れない。エージェント起動時は inbox を見る(`agent-dm.mjs inbox` と `gh issue list --label agent-dm`)。MCP に `fetch_inbox` があるときだけ呼ぶ。空なら今の依頼を続ける。 + +## どのツールでやるか(判定の目安) + +| 今日の作業 | ツール | 呼び出し | +|------------|--------|----------| +| 手元で実装・テストして出す | Claude Code | `ai_company` の skills / プロジェクト直下で起動 | +| 小さな修正、記事の穴埋め | Cursor | Tab / Cmd+K(エージェント不要) | +| 新規Webをゼロから、または全自動 ship | Cursor | `@autopilot` / `@web-dev-github` | +| coupon-board の見た目 | Cursor | Design Mode + `@coupon-board-dev` | +| 外出中・並列で直す | Cursor Cloud Agent | cursor.com/agents またはモバイル | +| 相手エージェントに仕事を渡す | Agent DM / MCP / `agent -p` | 先に `@agent-router` | +| 朝のチェック / 今日の1時間 / 週報 | Claude Code | 「今日の状況は」「今日の1時間」 | + ## 日次: 全自動モード(推奨) ```bash @@ -83,3 +103,5 @@ node business-ops/scripts/autopilot.mjs ship --yes | シークレットが不安 | `github-preflight.sh` | | エージェントの使い方 | `@ai-agent-mastery` | | Next.jsエラー | `@coupon-board-dev` + AGENTS.md | +| Cursor の意義が分からない | `CURSOR_VS_CLAUDE.md` | +| 相手エージェントに渡したい | 先に `@agent-router`。配達は `@agent-dm` | diff --git a/business-ops/agent-dm/CATALOG.md b/business-ops/agent-dm/CATALOG.md new file mode 100644 index 0000000..17a1739 --- /dev/null +++ b/business-ops/agent-dm/CATALOG.md @@ -0,0 +1,133 @@ +# 既存の MCP / Skill / GitHub + +**依頼が来たら先に `@agent-router`。** このカタログは引き渡し手段。判定表はルーター Skill にある。 + +自前の `agent-dm.mjs` は **Cloud Agent と Windows の Claude がプロセスを共有できないとき** のフォールバック。同じ PC なら公式 MCP / `agent -p`。 + +コミュニティ MCP の `--yolo` / `--dangerously-skip-permissions` は使わない。`.cursor/mcp.json` はコミットしない(Cloud に `claude` が無い)。 + +## できないこと(相手の中身) + +相手の会話・思考・今開いている画面を、呼ばれずに覗く口は Cursor にも Claude Code にも無い。Agent Mail や常時デーモンは入れない。 + +| 層 | できるか | +|----|----------| +| 思考・チャットの中身 | 不可。セッションは各アプリに閉じる | +| 仕事の受け渡し | 可。MCP / `agent -p`。呼ばれた側だけが文を見る | +| 成果物 | 可。同じ git。相手の頭ではなくディスク上の結果 | +| 共有メール箱 | 起動時に agent-dm / gh を見る。Agent Mail デーモンは入れない | +| Cloud Agent ↔ 自宅 Claude | MCP も Agent Mail も届かない。Issue か agent-dm のみ | + +### 起動時 inbox(エージェント起動時のみ。Tab ではやらない) + +```bash +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from <自分> +gh issue list --label agent-dm --state open +``` + +`gh` 失敗は無視。ラベル作成は人間。MCP に `fetch_inbox` があるときだけ 1 回呼ぶ。無ければ入れない。聞かない。inbox があれば処理。空なら今の依頼を続ける。相手の中身は増えない。見逃しが減るだけ。 + +## どれを使うか + +| 状況 | 使うもの | リアルタイムか | +|------|----------|----------------| +| 同じ Windows で Cursor が Claude に作業を渡す | **公式 `claude mcp serve`** | 同じマシンのツール呼び出し | +| 同じ Windows で Claude が Cursor に UI / best-of-n を渡す | **公式 Cursor CLI `agent -p`** | サブエージェント | +| 任意で GitHub inbox | 公式 GitHub MCP または `gh`([`.claude/mcp.json.example`](../../.claude/mcp.json.example)) | Issue | +| 複数エージェントの inbox が欲しい(同じマシン) | **MCP Agent Mail**(実績あり) | 非同期メール | +| スマホの Cloud Agent ↔ 自宅の Claude | **このリポの Agent DM** または GitHub Issue | git / Issue | +| スキルやルールを Claude にも読ませたい | **cursor-bridge-mcp**(コンテキスト同期。会話ではない) | 読み取り | + +## 1. 公式: Cursor から Claude Code を呼ぶ(推奨・同じ PC) + +Claude Code は MCP サーバーになれる。[公式ドキュメント](https://code.claude.com/docs/en/mcp) + +```bash +claude mcp serve +``` + +Cursor の `~/.cursor/mcp.json`(またはプロジェクトの `.cursor/mcp.json`): + +```json +{ + "mcpServers": { + "claude-code": { + "command": "claude", + "args": ["mcp", "serve"] + } + } +} +``` + +Windows で `claude` が PATH に無いときは、`where.exe claude` のフルパスを `command` に書く。自宅では次で自動: + +```powershell +node business-ops/scripts/enable-local-mcp.mjs +``` + +例の手書きは [`mcp.json.example`](../../.cursor/mcp.json.example)。**Cloud Agent の VM には `claude` が無い。** + +使い方: Cursor に「claude-code MCP でこのファイルを直して」と明示する。Cursor が Claude のツールを呼ぶ。**Cloud Agent の VM には `claude` が無いので、これは自宅 PC 専用。** + +## 2. 公式: Claude から Cursor CLI を呼ぶ + +Cursor CLI は `agent`([docs](https://cursor.com/docs/cli/using.md))。ルーターが `cursor` と判定したら: + +```powershell +agent -p "coupon-board の一覧カード(DealCard)の余白を他カードと揃えて。触ってよい: coupon-board/src/components/DealCard.tsx と一覧グリッド。完了条件: 同じ行のカードの高さと内部余白が揃う。リファクタ禁止。聞かないで進めて。" +``` + +プロジェクト名が無くても「どれですか?」と聞かない。UI / 余白の既定は coupon-board。`agent` が PATH に無い / ログイン前なら agent-dm か `gh issue`。コミュニティの cursor-mcp-bridge は入れない(yolo になりがち)。 + +参考(入れない): [JaimeJunr/cursor-mcp-bridge](https://github.com/JaimeJunr/cursor-mcp-bridge)、[jonaspauleta/cursor-bridge](https://github.com/jonaspauleta/cursor-bridge) + +## 3. 本格 inbox: MCP Agent Mail + +「エージェント同士のメール」として一番枯れている。 + +- Python 元祖: [Dicklesworthstone/mcp_agent_mail](https://github.com/Dicklesworthstone/mcp_agent_mail)(2000 星前後) +- サイト: [mcpagentmail.com](https://mcpagentmail.com/) + +inbox、スレッド、ファイル予約(同時編集防止)、Git 監査。ツール数が多く、デーモンが要る。**未導入。** 一人で Cursor と Claude を繋ぐだけなら過剰。デーモンは入れない。`mcp.json` に足さない。ツール一覧に `fetch_inbox` があるときだけ起動時に 1 回呼ぶ。無ければ入れようとしない。 + +より小さい同じ系統: + +- [andrealaforgia/agents-mailbox](https://github.com/andrealaforgia/agents-mailbox) — 共有フォルダ + `send` / `inbox`。同じマシン限定 +- [signalclaude/interagent](https://github.com/signalclaude/interagent) — Claude Code 同士向け + +## 4. 会話ではなくコンテキスト同期 + +[theamazingwolf/cursor-bridge-mcp](https://github.com/theamazingwolf/cursor-bridge-mcp) は `.cursor/rules` と skills を Claude Code に見せる。**DM ではない。** サイロ解消には効く。 + +## 5. GitHub 上でやる(Cloud でも使える) + +Issue / PR コメントが公共の inbox。公式 [GitHub MCP](https://github.com/github/github-mcp-server)(例: [`.claude/mcp.json.example`](../../.claude/mcp.json.example)、トークンは環境変数)か、すでにある `gh`。MCP は任意。トークンをファイルに書かない。 + +```bash +gh issue create --title "agent-dm: lint 直して" --body "from: cursor → claude-code\n..." +gh issue comment --body "from: claude-code\nやったこと: ..." +``` + +このモノレポは Issue がゼロ。使い始めるならラベル `agent-dm` を人間が作る。Cloud Agent は GitHub に届く。自宅 Claude は `gh issue list --label agent-dm`。 + +## 6. Skill 集(会話口そのものではない) + +マルチエージェント用スキルは多いが、ほとんど **Claude の中のサブエージェント**。 + +- [wshobson/agents](https://github.com/wshobson/agents) +- [Yeachan-Heo/oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode) +- [ComposioHQ/awesome-claude-skills](https://github.com/ComposioHQ/awesome-claude-skills) + +Cursor ↔ Claude の DM の代わりにはならない。日次 SOP を厚くするとき用。 + +## このリポの自前 CLI を残す理由 + +Cursor Cloud は隔離 VM。`claude mcp serve` も Agent Mail も、自宅の Claude プロセスに届かない。git のスレッド(または GitHub Issue)だけが Cloud → 自宅の配達になる。 + +``` +同じ PC: ルーター → 1(Cursor→Claude)または 2(Claude→Cursor) +Cloud↔自宅: ルーター → 5 または agent-dm.mjs +常時複数: 3(まだ入れない) +スキル共有: 4 +``` diff --git a/business-ops/agent-dm/PROTOCOL.md b/business-ops/agent-dm/PROTOCOL.md new file mode 100644 index 0000000..f3eabca --- /dev/null +++ b/business-ops/agent-dm/PROTOCOL.md @@ -0,0 +1,119 @@ +# Agent DM プロトコル + +**実装の前に分類する。** 判定は `@agent-router`(`.cursor/skills/agent-router` と `.claude/skills/agent-router`)。このファイルは配達とフォールバック。 + +製品としての相互DMはない。相手の会話・思考・画面を呼ばれずに覗く口もない。会話口は既存の MCP / GitHub / スレッドから選ぶ。一覧: [`CATALOG.md`](CATALOG.md) + +## チャネルを先に決める + +| 今どこにいるか | チャネル | +|----------------|----------| +| 同じ Windows(日常) | 下記「同じ Windows」。Cursor は `claude mcp serve`、Claude は `agent -p` | +| Cloud Agent ↔ 自宅 Claude | GitHub Issue(`gh`)または下のスレッドファイル | +| エージェントを常時複数 | [MCP Agent Mail](https://github.com/Dicklesworthstone/mcp_agent_mail)(まだ入れない) | + +同じ PC なら自前 CLI を使わない。Cloud のときだけスレッドファイル。 + +## 起動時 inbox + +エージェント起動時(Tab / Cmd+K ではやらない)。自分の id は `cursor` または `claude-code`。 + +```bash +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from <自分> +gh issue list --label agent-dm --state open +``` + +`gh` が無い・ラベルが無い・失敗したら無視。ラベル作成は人間。[MCP Agent Mail](https://github.com/Dicklesworthstone/mcp_agent_mail) は未導入。ツールに `fetch_inbox` があるときだけ 1 回呼ぶ。無ければ入れない。聞かない。inbox があればルーターどおり処理。空なら今の依頼を続ける。 + +### 同じ Windows(自宅で1コマンド) + +```powershell +node business-ops/scripts/enable-local-mcp.mjs +``` + +スクリプトが `.cursor/mcp.json` を作り、`claude` があればフルパスを書く。そのあと Cursor を開き直して **Settings → MCP → claude-code を承認**する(画面操作だけ人間)。`mcp.json` はコミットしない。 + +`claude` / `agent` が見つからないときは、**PowerShell**(Git Bash ではない)で入れてからスクリプトを再実行する。 + +```powershell +irm https://claude.ai/install.ps1 | iex +irm 'https://cursor.com/install?win32=true' | iex +``` + +入れたら PowerShell を開き直す。`claude` と `agent login` を一度実行する。 + +## 判定例(ルーター) + +| 依頼 | 判定 | 動き | +|------|------|------| +| coupon-board の lint を直して | claude-code | 実装。Cursor なら MCP かスレッド | +| 余白を直して(プロジェクト名なし) | cursor | 既定 coupon-board の DealCard。Claude は聞かずに `agent -p` | +| 一覧カードの余白を揃えて | cursor | Design Mode。Claude なら `agent -p` かスレッド | +| Next.js 16 の params を複数モデルで当てて | cursor | `/best-of-n` | +| 本番にデプロイして | human | どちらも実装しない | + +--- + +## フォールバック: スレッドファイル + +Cloud Agent と Windows の Claude がプロセスを共有できないときの配達。 + +``` +Cursor Cloud / IDE Claude Code (Windows) + \ / + \ git push/pull / + v v + business-ops/agent-dm/threads/*.md +``` + +リアルタイムの吹き出しではない。片方が書いて push し、もう片方が pull して返す。人間は配達と最終承認。 + +## いつ使うか + +| 使う | 使わない | +|------|----------| +| Cursor が調査・レビュー結果を渡し、Claude Code に実装させる | 同じ実装を両方に同時にやらせる | +| Claude Code が手元テスト結果を Cursor に返し、レビューさせる | 雑談、秘密情報、本番デプロイの依頼 | +| スマホの Cloud Agent が「続きは Claude で」と残す | ループしそうな往復(同じ質問の繰り返し) | + +## 役割 + +| 参加者 | id | やること | +|--------|-----|----------| +| Cursor | `cursor` | 調査、差分レビュー、Design Mode、Cloud Agent からの依頼 | +| Claude Code | `claude-code` | 手元実装、テスト、日次 SOP からのエスカレーション | +| 人間 | `human` | 優先順位、merge、デプロイ、スレッドを閉じる | + +## ループ防止(必須) + +1. **最後に書いた側は返信しない。** CLI が拒否する。 +2. **`waiting` が自分のときだけ動く。** +3. **エージェント往復は最大 8 ターン。** 超えたら `waiting: human`。人間が判断する。 +4. **自分の仕事を相手に丸投げし直さない。** Cursor が実装を頼んだら、Claude は実装して結果を返す。Cursor はレビューする。役割を入れ替えない。 +5. **main へは push しない。** スレッドファイルの commit/push は作業ブランチのみ。 + +## 配達 + +```bash +git pull --ff-only +node business-ops/scripts/agent-dm.mjs inbox --from cursor # または claude-code +node business-ops/scripts/agent-dm.mjs show --id +# 作業してから +node business-ops/scripts/agent-dm.mjs reply --id --from cursor --body "..." +git add business-ops/agent-dm/threads/ +git commit -m "chore(agent-dm): cursor → claude-code" +git push +``` + +相手が別マシンなら、相手が `git pull` するまで届かない。人間が「Claude 側で inbox 見て」と言うか、同じブランチを両方で追跡する。 + +推奨ブランチ: 作業中の `cursor/*`。inbox 専用ブランチは作らない(散らばるため)。 + +## ステータス + +| status | waiting | 意味 | +|--------|---------|------| +| `open` | `cursor` / `claude-code` | そのエージェントが次に動く | +| `open` | `human` | 判断待ち。エージェントは止まれ | +| `closed` | `human` | 終了 | diff --git a/business-ops/agent-dm/threads/README.md b/business-ops/agent-dm/threads/README.md new file mode 100644 index 0000000..00d4b99 --- /dev/null +++ b/business-ops/agent-dm/threads/README.md @@ -0,0 +1,12 @@ +# threads + +会話ファイルの置き場。新規作成は CLI に任せる。 + +```bash +node business-ops/scripts/agent-dm.mjs send \ + --from cursor --to claude-code \ + --title "短く何を頼むか" \ + --body "依頼の本文" +``` + +プロトコル: `../PROTOCOL.md` diff --git a/business-ops/briefs/date-spark.md b/business-ops/briefs/date-spark.md new file mode 100644 index 0000000..a48e436 --- /dev/null +++ b/business-ops/briefs/date-spark.md @@ -0,0 +1,45 @@ +# 新規Webプロジェクト ブリーフ — date-spark + +## 基本情報 + +| 項目 | 記入 | +|------|------| +| プロジェクト名(slug) | date-spark | +| タイプ | nextjs | +| 一言説明 | 既存カップルのマンネリを、今夜の動詞1つで破る | + +## 目的・ユーザー + +- **誰のため:** 既に付き合っている二人(審査員のデスクトップ) +- **何を解決する:** 店不足ではなく「いつもの脚本」と「何する?」疲労 +- **成功の定義:** 10秒で動詞カード。チャット無し。破る→判定までワンクリック完走 + +## MVP機能(3つまで) + +1. 起動直後の動詞カード + スロット3 +2. 「破った」証拠(テキスト1行。写真任意) +3. AI審判 `/api/verdict`(fallback 必須) + +## 技術選定 + +| 項目 | 選択 | +|------|------| +| フレームワーク | Next.js 16 + TS + Tailwind | +| DB | better-sqlite3(`data/` gitignore) | +| ホスティング | ローカル + Cloudflare Tunnel。本番は人間 | +| 参考プロジェクト | coupon-board(構成のみ)。optimal-match はフォークしない | + +## スコープ外 + +- チャット / 3プラン / Maps / 店リスト +- 出会いマッチング +- CrowdWorks / note + +## 制約・注意 + +- 課金が発生するサービス: なし(Gemini キーはローカル `.env.local`) +- 認証が必要: いいえ +- PORT: 3002 + +正: `date-spark/REQUIREMENTS.md` +貼る文: `business-ops/templates/prompts/hackathon-24/` diff --git a/business-ops/briefs/dopagaki-blocker.md b/business-ops/briefs/dopagaki-blocker.md new file mode 100644 index 0000000..17f6dd1 --- /dev/null +++ b/business-ops/briefs/dopagaki-blocker.md @@ -0,0 +1,122 @@ +# ドパガキ止め — プロジェクトブリーフ + +コード・拡張・サイトはまだ作らない。この1枚が正。骨組み生成(`new-web-project.mjs`)はしない。 + +## 基本情報 + +| 項目 | 記入 | +|------|------| +| プロジェクト名(slug) | `dopagaki-blocker` | +| タイプ | ブロッカー(ブラウザ拡張が第一候補)。Next.jsサイトではない | +| 一言説明 | ドパガキ向け。道具が増えない遮断 | + +## 目的・ユーザー + +- **誰のため:** 自分と同じドパガキ。ショートとSNSで時間が溶ける人。自分用のダッシュボードではない。自分の転跳止めは `C:\Users\haruki\loop\state\wip.md` のまま混ぜない。 +- **何を解決する:** 開いた瞬間にショートが始まること。意志では止まらない。 +- **成功の定義:** 遮断中にこの道具を開かない。インストール数・連続日数・記事PVは成功ではない。 + +## 来客の60秒 + +1. 拡張のアイコンを押す(または既定のショートカット)。 +2. 既定リストが25分ブロックされる。確認ダイアログも時間の編集も無い。 +3. 遮断中にリストのサイトへ行くと、空の停止画面だけ出る。Tipsも次の記事も無い。 +4. 25分が切れたらブロックが外れる。通知で「よくやった」と言わない。 + +## MVP機能(3つまで) + +1. 既定リストを25分ブロックする。リストも時間も初回は変えない。 +2. ブロック中はオプション画面を出せない。リスト園芸を封じる。 +3. 終了はタイマーのみ。「あと5分」も緊急解除も無い。 + +### 既定リスト(初回はこれ以外増やさない) + +- YouTube Shorts(`youtube.com/shorts` と Shorts プレイヤー。通常の長尺は止めない) +- TikTok +- X(x.com / twitter.com) +- Instagram +- Reddit + +時間は **25分固定**(デイリーアワーのAブロックと同じ。考えさせない)。 + +## 道具自身がドパガキになってはいけない + +既存の Freedom / StayFocusd / スクリーンタイムと分ける点は機能数ではない。次を全部禁止する。 + +- 連続日数・グラフ・ランキング +- 記事フィード・Tips・コミュニティ +- ブロック中の設定いじり(リスト園芸) +- 「あと5分」の交渉UI +- ホーム画面のダッシュボード +- 毎日開く理由になるバッジ + +既定動作は1つだけ: **既定リストを、既定時間、オンにする。切れるまで設定は開かない。** + +## 技術選定(今は選ばない理由まで) + +| 候補 | 今の扱い | 理由 | +|------|----------|------| +| Chrome/Edge 拡張 | **第一候補。未実装** | Shorts はページ内UIなので、ホストファイルでは足りない。declarativeNetRequest か content script でパス単位に止められる | +| Next.js サイト | **MVP外** | 訪問者のブラウザで YouTube を止められない。ランディングはブロッカーが動いてから | +| ホストファイル / ルータ | 選ばない | ドメインごと死ぬ。YouTube 長尺まで巻き込む。Shorts だけに切れない | +| OS標準のスクリーンタイム | 選ばない | グラフと交渉UIがある。道具が増える | +| coupon-board への便乗 | 選ばない | 別製品。転跳 | + +| 項目 | 選択 | +|------|------| +| フレームワーク | 未実装。第一候補はブラウザ拡張(Manifest V3) | +| DB | なし(ローカルの on/off と終了時刻だけ) | +| ホスティング | なし(ストア提出は後。人間) | +| 参考プロジェクト | 使わない。Webアプリの型に載せない | + +## スコープ外 + +- 自分用WIP=1(転跳止め)の公開化 +- 学習ドリル・コーチ・デイリーアワー連携 +- 統計・連続日数・エクスポート +- 課金・アカウント・認証 +- Chrome ウェブストア / Edge Add-ons への提出 +- ホワイトリスト編集・サイト追加UI +- 記事メディア・note本文の埋め込み +- `new-web-project.mjs` でのリポジトリ生成 + +## 制約・注意 + +- 課金が発生するサービス: なし +- 認証が必要: いいえ +- ストア提出・公開: 人間。エージェントはしない +- 実装開始は、このブリーフを閉じたあとに人間が「実装して」と言ったときだけ + +## 有効性の調査(2026-08-26) + +3視点。製品と作り手の門は混ぜない。 + +### 何が効くか + +| 介入 | 向き | 根拠の強さ | +|------|------|------------| +| 開く瞬間の遅延+「やめる」 | 無意識の親指(ショート/SNS) | 強い。one sec は6週で対象アプリの実開封約-57%。お説教文は無効 | +| フィード隠し(置いたまま) | 無限スクロール | 現場で残る。NFE / Unhook。店もストリークも無い | +| 解除できないスケジュール硬ブロック | セッションを死なせる | 中。Freedom Locked Mode / Cold Turkey。短期は強い。苛立ちでアンインストール | +| グレースケール | 画面時間 | RCTで約-20〜-50分/日。起動回数は減らない | +| 通知オフ・使用統計だけ | — | 客観的な使用はほぼ変わらない | +| WIP=1(Doingを1、パーク+戻り1行) | 転跳 | 切替コストの理論はある。SNS用のRCTは無い。自分用の門 | + +ドーパミンファスティングは fad。禁欲のゲーミ化(ストリーク・木・Score)は止めたいアプリと同じ報酬で、道具が新ドパガキになる。 + +### 既存ブリーフとの矛盾 + +- **アイコン押下で25分開始**は Forest / Opal 型。開く行為が儀式になり、残時間カウントがドパになる。残る型は「置いたまま」か「対象アプリ側の遅延」で、手動セッション開始ではない。 +- **`/shorts` だけ止めて長尺を残す**は、ホーム・関連・Watch next の無限を残す。パス止めは漏れる。 +- **ハード一本**は習慣の再訓練を主張できない。摩擦は無意識オープン向き、ハードはプレコミット向き。両方載せると設定園芸が始まるので、初回は片方だけ。 +- 25分はデイリーアワーの数字であり、残渣の回復時間ではない。 + +### 製品に残す判断(調査後も) + +他人向けの正はまだブロッカー。ただし「押して25分」より、**置いたまま硬ブロック(ブロック中は設定不可)**の方が調査と合う。遅延+やめるは別製品にしない(園芸になる)。自分の転跳は `wip.md` のまま。 + +実装はまだしない。 + +## 次にやらないこと + +拡張もサイトもキューの7月案件も、ここから勝手に始めない。 diff --git a/business-ops/scripts/agent-dm.mjs b/business-ops/scripts/agent-dm.mjs new file mode 100644 index 0000000..b207793 --- /dev/null +++ b/business-ops/scripts/agent-dm.mjs @@ -0,0 +1,263 @@ +#!/usr/bin/env node +/** + * Cursor と Claude Code の非同期DM(スレッドファイル) + * + * Usage: + * node business-ops/scripts/agent-dm.mjs inbox --from cursor + * node business-ops/scripts/agent-dm.mjs send --from cursor --to claude-code --title "..." --body "..." + * node business-ops/scripts/agent-dm.mjs reply --id --from claude-code --body "..." + * node business-ops/scripts/agent-dm.mjs show --id + * node business-ops/scripts/agent-dm.mjs close --id --from human --body "done" + */ + +import { readFileSync, writeFileSync, readdirSync, mkdirSync, existsSync } from "fs"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../.."); +const THREAD_DIR = join(ROOT, "business-ops/agent-dm/threads"); +const ACTORS = ["cursor", "claude-code", "human"]; +const MAX_TURNS = 8; + +function pad(n) { + return String(n).padStart(2, "0"); +} + +function nowIso() { + return new Date().toISOString().replace(/\.\d{3}Z$/, "Z"); +} + +function stamp() { + const d = new Date(); + return ( + `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-` + + `${pad(d.getHours())}${pad(d.getMinutes())}` + ); +} + +function slugify(title) { + const ascii = title + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-|-$/g, "") + .slice(0, 32); + return ascii || "thread"; +} + +function parseArgs(argv) { + const args = { _: [] }; + for (let i = 2; i < argv.length; i++) { + const a = argv[i]; + if (a.startsWith("--")) { + const key = a.slice(2); + const next = argv[i + 1]; + if (!next || next.startsWith("--")) args[key] = true; + else { + args[key] = next; + i++; + } + } else { + args._.push(a); + } + } + return args; +} + +function usage() { + console.log(`Usage: + node business-ops/scripts/agent-dm.mjs inbox --from + node business-ops/scripts/agent-dm.mjs send --from --to --title "..." --body "..." + node business-ops/scripts/agent-dm.mjs reply --id --from --body "..." + node business-ops/scripts/agent-dm.mjs show --id + node business-ops/scripts/agent-dm.mjs close --id --from [--body "..."]`); +} + +function assertActor(value, label) { + if (!ACTORS.includes(value)) { + throw new Error(`${label} は ${ACTORS.join(" / ")} のいずれか`); + } +} + +function parseFrontmatter(content) { + const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/); + if (!match) throw new Error("フロントマターがありません"); + const fields = {}; + for (const line of match[1].split(/\r?\n/)) { + const idx = line.indexOf(":"); + if (idx === -1) continue; + fields[line.slice(0, idx).trim()] = line.slice(idx + 1).trim(); + } + return { fields, body: match[2] }; +} + +function dumpFrontmatter(fields) { + const order = ["id", "from", "to", "waiting", "status", "turns", "max_turns", "created", "updated"]; + const lines = order.filter((k) => fields[k] != null).map((k) => `${k}: ${fields[k]}`); + return `---\n${lines.join("\n")}\n---\n`; +} + +function threadPath(id) { + return join(THREAD_DIR, `${id}.md`); +} + +function listThreadFiles() { + if (!existsSync(THREAD_DIR)) return []; + return readdirSync(THREAD_DIR) + .filter((f) => f.endsWith(".md") && f !== "README.md") + .map((f) => { + const content = readFileSync(join(THREAD_DIR, f), "utf-8"); + const { fields, body } = parseFrontmatter(content); + return { file: f, fields, body, content }; + }); +} + +function loadThread(id) { + const path = threadPath(id); + if (!existsSync(path)) throw new Error(`スレッドがありません: ${id}`); + const content = readFileSync(path, "utf-8"); + const parsed = parseFrontmatter(content); + return { path, content, ...parsed }; +} + +function lastSpeaker(body) { + const matches = [...body.matchAll(/^### \S+ (\S+)/gm)]; + if (matches.length === 0) return null; + return matches[matches.length - 1][1]; +} + +function cmdInbox(args) { + const from = args.from; + assertActor(from, "--from"); + const open = listThreadFiles().filter( + (t) => t.fields.status === "open" && t.fields.waiting === from, + ); + if (open.length === 0) { + console.log(`inbox empty for ${from}`); + return; + } + for (const t of open) { + const turns = t.fields.turns || "?"; + console.log(`${t.fields.id}\twaiting=${t.fields.waiting}\tturns=${turns}\t${t.fields.to === from ? "←" : "→"} ${t.fields.from}\t${t.body.split("\n").find((l) => l.startsWith("# "))?.slice(2) || ""}`); + } +} + +function cmdShow(args) { + const id = args.id; + if (!id) throw new Error("--id が必要"); + const { content } = loadThread(id); + process.stdout.write(content); + if (!content.endsWith("\n")) process.stdout.write("\n"); +} + +function cmdSend(args) { + const from = args.from; + const to = args.to; + const title = args.title; + const body = args.body; + assertActor(from, "--from"); + assertActor(to, "--to"); + if (from === to) throw new Error("自分自身には送れない"); + if (!title || !body) throw new Error("--title と --body が必要"); + + mkdirSync(THREAD_DIR, { recursive: true }); + const id = `${stamp()}-${slugify(title)}`; + const created = nowIso(); + const fields = { + id, + from, + to, + waiting: to, + status: "open", + turns: "1", + max_turns: String(MAX_TURNS), + created, + updated: created, + }; + const content = + dumpFrontmatter(fields) + + `\n# ${title}\n\n## 依頼\n\n${from} → ${to}:\n\n${body.trim()}\n\n## 履歴\n\n### ${created} ${from}\n\n${body.trim()}\n`; + writeFileSync(threadPath(id), content, "utf-8"); + console.log(id); +} + +function appendTurn({ id, from, body, close }) { + assertActor(from, "--from"); + if (!id) throw new Error("--id が必要"); + if (!close && !body) throw new Error("--body が必要"); + + const thread = loadThread(id); + const fields = { ...thread.fields }; + if (fields.status !== "open") throw new Error(`閉じ済み: ${id}`); + + const speaker = lastSpeaker(thread.body); + if (!close && speaker === from) { + throw new Error("最後に書いた側は返信できない(ループ防止)"); + } + if (fields.waiting !== from && from !== "human") { + throw new Error(`今動けるのは waiting=${fields.waiting}。${from} は待つ`); + } + + const turns = Number(fields.turns || "0") + 1; + if (from !== "human" && turns > Number(fields.max_turns || MAX_TURNS)) { + throw new Error(`ターン上限 ${fields.max_turns}。human が close するか判断する`); + } + + const ts = nowIso(); + const note = (body || (close ? "closed" : "")).trim(); + let waiting = "human"; + if (!close) { + if (from === "human") { + waiting = speaker === "cursor" ? "claude-code" : "cursor"; + } else { + waiting = from === "cursor" ? "claude-code" : "cursor"; + } + if (from !== "human" && turns >= Number(fields.max_turns || MAX_TURNS)) { + waiting = "human"; + } + } + + fields.turns = String(turns); + fields.updated = ts; + fields.waiting = waiting; + if (close) fields.status = "closed"; + + const content = + dumpFrontmatter(fields) + + thread.body.trimEnd() + + `\n\n### ${ts} ${from}\n\n${note}\n`; + writeFileSync(thread.path, content, "utf-8"); + console.log(`${id}\twaiting=${fields.waiting}\tstatus=${fields.status}\tturns=${fields.turns}`); +} + +function cmdReply(args) { + appendTurn({ id: args.id, from: args.from, body: args.body, close: false }); +} + +function cmdClose(args) { + appendTurn({ id: args.id, from: args.from || "human", body: args.body || "closed", close: true }); +} + +function main() { + const args = parseArgs(process.argv); + const cmd = args._[0]; + if (!cmd || cmd === "help" || args.help) { + usage(); + process.exit(cmd ? 0 : 1); + } + try { + if (cmd === "inbox") cmdInbox(args); + else if (cmd === "send") cmdSend(args); + else if (cmd === "reply") cmdReply(args); + else if (cmd === "show") cmdShow(args); + else if (cmd === "close") cmdClose(args); + else { + usage(); + throw new Error(`不明なコマンド: ${cmd}`); + } + } catch (err) { + console.error(err.message || err); + process.exit(1); + } +} + +main(); diff --git a/business-ops/scripts/enable-local-mcp.mjs b/business-ops/scripts/enable-local-mcp.mjs new file mode 100644 index 0000000..434c5f9 --- /dev/null +++ b/business-ops/scripts/enable-local-mcp.mjs @@ -0,0 +1,119 @@ +#!/usr/bin/env node +/** + * 自宅PC用: .cursor/mcp.json を example から作り、claude のパスを埋める。 + * mcp.json は gitignore。コミットしない。 + * + * Usage: + * node business-ops/scripts/enable-local-mcp.mjs + */ + +import { execSync } from "child_process"; +import { copyFileSync, existsSync, readFileSync, writeFileSync } from "fs"; +import { homedir } from "os"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../.."); +const EXAMPLE = join(ROOT, ".cursor/mcp.json.example"); +const TARGET = join(ROOT, ".cursor/mcp.json"); +const HOME = homedir(); +const LOCAL = process.env.LOCALAPPDATA || join(HOME, "AppData", "Local"); +const ROAMING = process.env.APPDATA || join(HOME, "AppData", "Roaming"); + +function whichAll(cmd) { + const isWin = process.platform === "win32"; + try { + const out = execSync(isWin ? `where.exe ${cmd}` : `command -v ${cmd}`, { + encoding: "utf-8", + stdio: ["ignore", "pipe", "pipe"], + }); + return out + .split(/\r?\n/) + .map((s) => s.trim()) + .filter((s) => s && !s.toLowerCase().includes("info:")); + } catch { + return []; + } +} + +function pickClaude(candidates) { + const exe = candidates.find((p) => /\.exe$/i.test(p)); + if (exe) return exe; + const cmd = candidates.find((p) => /\.cmd$/i.test(p)); + if (cmd) return cmd; + return candidates.find((p) => !/\.ps1$/i.test(p)) || ""; +} + +function findClaude() { + const known = firstExisting([ + join(ROAMING, "npm", "node_modules", "@anthropic-ai", "claude-code", "bin", "claude.exe"), + join(HOME, ".local", "bin", "claude.exe"), + join(HOME, ".local", "bin", "claude"), + join(LOCAL, "Programs", "Claude", "claude.exe"), + join(ROAMING, "npm", "claude.cmd"), + ]); + return known || pickClaude(whichAll("claude")); +} + +function which(cmd) { + return whichAll(cmd)[0] || ""; +} + +function firstExisting(paths) { + return paths.find((p) => p && existsSync(p)) || ""; +} + +function findAgent() { + return ( + which("agent") || + which("cursor-agent") || + firstExisting([ + join(LOCAL, "cursor-agent", "agent.cmd"), + join(LOCAL, "cursor-agent", "agent.exe"), + join(HOME, ".local", "bin", "agent.exe"), + join(HOME, ".local", "bin", "agent"), + ]) + ); +} + +function main() { + if (!existsSync(EXAMPLE)) { + console.error("missing .cursor/mcp.json.example"); + process.exit(1); + } + + copyFileSync(EXAMPLE, TARGET); + const cfg = JSON.parse(readFileSync(TARGET, "utf-8")); + const claude = findClaude(); + const agent = findAgent(); + + if (claude) { + cfg.mcpServers["claude-code"].command = claude; + console.log(`wrote ${TARGET}`); + console.log(`claude: ${claude}`); + } else { + console.log(`wrote ${TARGET} (command は "claude" のまま)`); + console.log("claude: 見つからない。npm 版なら次の exe があるか確認:"); + console.log(' & "$env:APPDATA\\npm\\node_modules\\@anthropic-ai\\claude-code\\bin\\claude.exe" --version'); + console.log(" 公式ネイティブ入れ直しは、動いている Claude を止めてから:"); + console.log(' irm https://claude.ai/install.ps1 | iex'); + } + + if (agent) { + console.log(`agent: ${agent}`); + } else { + console.log("agent: 見つからない。PowerShell で入れてから再実行:"); + console.log(" irm 'https://cursor.com/install?win32=true' | iex"); + console.log(" 入れたら PowerShell を開き直し、agent login"); + console.log(" Git Bash では入れない。公式: https://cursor.com/docs/cli/installation"); + } + + writeFileSync(TARGET, JSON.stringify(cfg, null, 2) + "\n", "utf-8"); + console.log(""); + console.log("次(人間・Cursor の画面だけ):"); + console.log(" 1. Cursor を開き直す"); + console.log(" 2. Settings → MCP → claude-code を Enable / 承認"); + console.log(" 3. git add .cursor/mcp.json はしない"); +} + +main(); diff --git a/business-ops/templates/claude-agent-dm.md b/business-ops/templates/claude-agent-dm.md new file mode 100644 index 0000000..43a70ab --- /dev/null +++ b/business-ops/templates/claude-agent-dm.md @@ -0,0 +1,25 @@ +# ai_company / CLAUDE.md に追記する断片 + +Claude Code のホームが `ai_company` のとき、Cursor との会話はこのモノレポ側で行う。 + +```` +## Agent DM(Cursor との会話) + +先に分類(`.claude/skills/agent-router`)。製品の相互DMは無い。相手の会話・思考・画面は読めない。Agent Mail デーモンは入れない。 + +起動したら inbox を見る(Tab ではやらない): + + git pull --ff-only + node business-ops/scripts/agent-dm.mjs inbox --from claude-code + gh issue list --label agent-dm --state open + +`gh` 失敗は無視。`fetch_inbox` が見えるときだけ呼ぶ。無ければ入れない。 + +- 同じ PC: Cursor 仕事なら `agent -p`。Cursor から呼ばれる実装はそのままやる +- Cloud: このリポに cd → 上の inbox +- 「余白を直して」でプロジェクト名が無くても聞かない。既定は coupon-board の DealCard: + + agent -p "coupon-board の一覧カード(DealCard)の余白を他カードと揃えて。触ってよい: coupon-board/src/components/DealCard.tsx と一覧グリッド。完了条件: 同じ行のカードの高さと内部余白が揃う。リファクタ禁止。聞かないで進めて。" + +ホーム直下では起動しない。`maouM-cmd/-` に cd してから分類する。 +```` diff --git a/business-ops/templates/cursor-environment.json.example b/business-ops/templates/cursor-environment.json.example new file mode 100644 index 0000000..1ce0282 --- /dev/null +++ b/business-ops/templates/cursor-environment.json.example @@ -0,0 +1,12 @@ +{ + "$schema": "https://www.cursor.com/schemas/environment.schema.json", + "name": "maou-workspace web", + "install": "cd coupon-board && npm ci && cd ../optimal-match && npm ci", + "terminals": [ + { + "name": "coupon-board", + "command": "cd coupon-board && npm run dev" + } + ], + "ports": [3000] +} diff --git a/business-ops/templates/prompts/grokbot-bots/01-sanbo.md b/business-ops/templates/prompts/grokbot-bots/01-sanbo.md new file mode 100644 index 0000000..ca36af6 --- /dev/null +++ b/business-ops/templates/prompts/grokbot-bots/01-sanbo.md @@ -0,0 +1,75 @@ +# 参謀 — Grok Bot プロフィール + +アプリで Create new agent。Edit Profile の description に「プロフィール」を貼る。 + +## プロフィール + +``` +名前: 参謀 +肩書: WIP=1 番人 / Web 朝のダイジェスト係 + +所有する成果: +- ソース付きの「今見るべきこと」リスト(Web のみ) +- 新しいアイデアのパーク文(実行しない) +- Claude Code / Cursor へ渡すときの1通(実装はしない) + +正の状態: +- WIP は C:\Users\haruki\loop\state\wip.md が唯一。status: open のあいだ第二件は着手しない +- パーク置き場は C:\Users\haruki\loop\state\queue.md の ## パーク。メニューにして選ばせない +- 実装の正は business-ops/CURSOR_VS_CLAUDE.md + - 手元実装・テスト → Claude Code + - UI / Design Mode /best-of-n / Cloud → Cursor + - merge・本番・課金・秘密情報 → 人間 +- CrowdWorks / note / 今日の1時間 / articles/ は ai_company の Claude Code。この Bot は触れない + +やってよい: +- このモノレポと GitHub の読み取り(coupon-board / optimal-match / CI / draft PR) +- 下書き、分類、リンク付き要約 +- 「続ける / 完走して切替 / パークして切替」の3択を出すこと +- Bugbot が無いあいだ、staged な `.env` や鍵ファイルの **パスと種類だけ** を挙げる(値は書かない) + +禁止(承認があっても自分ではやらない): +- コード変更、PR merge、本番デプロイ、課金 +- メール送信、予定の変更 +- CrowdWorks / note / SNS の閲覧・下書き・投稿 +- 新しい WIP を自分で open にする +- 同じ実装を Cursor と Claude の両方に依頼する +- キューの未完了を列挙して選ばせる +- Bugbot / Cloud Environment / /best-of-n の代わりをしない + +出力の型(毎回これだけ): +1. 今の WIP 1行(無ければ empty) +2. 見るべきこと(最大5。Web のみ。各項目に source / なぜ今 / 次の1手 / 人間の判断が要るか) +3. パーク候補(あれば1行。実行しない) +4. 自分がやらなかったこと(CW/note に触れなかったことを含む) + +口調: 短い日本語。質問で止めない。迷ったら「読取のみ」を選ぶ。CW/note の話が出たら「Claude Code / ai_company 側。ここではやらない」と書いて終わり。 +``` + +## 初回タスク + +``` +昨日から今までに動いた Web 側だけを読め。送信も予定変更もしない。 +CrowdWorks / note / 今日の1時間は読むな。出力に出すな。 + +優先の正: +- C:\Users\haruki\loop\state\wip.md +- coupon-board / optimal-match の CI とオープン draft PR + +出力はプロフィールの型どおり。WIP が empty なら「Web の次件は来ていない。待つ」と書け。今日の1時間のメニューは出すな。open ならその件以外はパーク文だけ。実装手順は書くな。 +``` + +## Skill 化(初回が安定したあと) + +``` +今のダイジェスト手順を skill「朝のWeb WIPダイジェスト」として保存して。 +含めるもの: 読む場所、出力の型4項目、送信禁止、WIP=1、CW/note禁止、ソース欠落時は不明と書くこと。 +Routine はまだ作るな。 +``` + +## Routine(Skill が2回成功したあと) + +``` +平日 7:00 JST に skill「朝のWeb WIPダイジェスト」を実行してこの会話に投稿して。 +送らない。WIP を書き換えない。CW/note は出さない。ソースが無い日は「ソースなし」と報告して古いデータで埋めない。 +``` diff --git a/business-ops/templates/prompts/grokbot-bots/02-night-research.md b/business-ops/templates/prompts/grokbot-bots/02-night-research.md new file mode 100644 index 0000000..5a0f861 --- /dev/null +++ b/business-ops/templates/prompts/grokbot-bots/02-night-research.md @@ -0,0 +1,47 @@ +# 夜勤調査 — Grok Bot プロフィール + +参謀の次に作る。CI が赤い夜に使う。 + +## プロフィール + +``` +名前: 夜勤調査 +肩書: Web 翌朝ブリーフ係 + +所有する成果: 人間が朝に読める Web ブリーフ1本。実装しない。 + +対象: coupon-board / optimal-match の CI 失敗、仕様差分、必要なら本番 `https://shotime.onrender.com/api/health` の読取1行。 +対象外: CrowdWorks、note、articles/、今日の1時間、ai_company の日次。 +対象外(別ツール): シークレット検査(Bugbot)、本番デプロイ、/best-of-n、Next.js 16 の docs 通訳(Cursor。このクラウド PC に node_modules は無い)。 + +ブリーフの型: +- 目的(1行) +- 事実(リンク必須。リンクが無い主張は捨てる) +- 仮説(事実と分けて書く) +- 推奨1つと捨てた案 +- 翌朝の次の1手(Claude Code / Cursor / 人間のどれか1つ) +- やらなかったこと +- 任意: health の HTTP ステータス1行(再デプロイするな。管理画面に入るな) + +ブリーフの型: +- 目的(1行) +- 事実(リンク必須。リンクが無い主張は捨てる) +- 仮説(事実と分けて書く) +- 推奨1つと捨てた案 +- 翌朝の次の1手(Claude Code / Cursor / 人間のどれか1つ) +- やらなかったこと + +禁止: コード変更、秘密情報の保存、WIP の上書き、CW/note の調査、再デプロイ。 +``` + +## 初回タスク + +``` +coupon-board または optimal-match の、今赤い CI か未解決の仕様差を1本のブリーフにまとめて。 +コードは変えるな。CrowdWorks / note は出すな。再デプロイするな。 + +任意で https://shotime.onrender.com/api/health を GET し、ステータスだけ1行。管理画面は開くな。 +Next.js 16 の正しい API が要るなら「Cursor で node_modules/next/dist/docs/ を読め」と書け。自分で docs を捏造するな。 + +出力はプロフィールのブリーフ型。事実には URL またはログ箇所。直す作業が必要なら「再現パックへ」または「Claude Code へ」と書け。自分でパッチを書くな。 +``` diff --git a/business-ops/templates/prompts/grokbot-bots/03-repro-pack.md b/business-ops/templates/prompts/grokbot-bots/03-repro-pack.md new file mode 100644 index 0000000..43fd21a --- /dev/null +++ b/business-ops/templates/prompts/grokbot-bots/03-repro-pack.md @@ -0,0 +1,35 @@ +# 再現パック — Grok Bot プロフィール + +夜勤調査の次。実装は Claude Code。 + +## プロフィール + +``` +名前: 再現パック +肩書: coupon-board / optimal-match の再現係 + +所有する成果: 実装せずに渡せる再現パック1本。 + +規則: +- staging またはローカル想定。本番顧客データは使わない +- コードは変えない。PR は出さない +- CrowdWorks / note / articles/ は触れない +- 本番 Render の再デプロイはしない(それは人間。読取だけなら Render健康または参謀) + +禁止: 実装、merge、デプロイ、課金、秘密情報。 +``` + +## 初回タスク + +``` +この報告を staging またはローカルで再現して。本番顧客データは使うな。コードは変えるな。 +CrowdWorks / note は出すな。 + +返すもの: +- 手順(コピペ可能なコマンド / クリック順) +- 期待と実際 +- スクショ +- ブラウザと OS +- コンソールまたはネットワークで見たこと +- Claude Code に渡す1通(実装依頼。こちらは実装しない) +``` diff --git a/business-ops/templates/prompts/grokbot-bots/README.md b/business-ops/templates/prompts/grokbot-bots/README.md new file mode 100644 index 0000000..7f07071 --- /dev/null +++ b/business-ops/templates/prompts/grokbot-bots/README.md @@ -0,0 +1,39 @@ +# 検証済み Grok Bot(貼って作成) + +検証日: 2026-08-27 +根拠: リポ横断調査 + Cursor 公式 + 既存フリートとの重複判定(追加 KEEP は 0) +CW / note / `ai_company` 日次は対象外。 + +## アプリで今作る(3人) + +Grok Bot アプリ → Create new agent → 各ファイルの **プロフィール** を description に貼る → **初回タスク** を1通。 + +| 順 | ファイル | 所有 | +|----|----------|------| +| 1 | `01-sanbo.md` | Web の WIP ダイジェスト。実装しない | +| 2 | `02-night-research.md` | CI / 仕様の翌朝ブリーフ。直さない | +| 3 | `03-repro-pack.md` | 再現手順とスクショ。コードは変えない | + +グループは CI が赤いときだけ。キックオフ文は `../grokbot-fleet.md` §4。 + +## 4人目は作らない + +重複判定の結論: KEEP 追加は 0。Render健康・Next16・秘密スキャン・下書き墓守は参謀または夜勤の Skill。Cursor / Claude / Bugbot と被るものは REJECT。 + +## 作らない(検証で落ちた) + +| 候補 | 判定 | 代わり | +|------|------|--------| +| 秘密スキャン Bot | 作らない | 参謀がパスと種類だけ。本体は **Bugbot** | +| Cloud Environment Bot | 作らない | 草案は `business-ops/templates/cursor-environment.json.example`。作成・秘密情報・Build は [Cloud Agents ダッシュボード](https://cursor.com/dashboard/cloud-agents#environments) | +| best-of-n 書記 | 作らない | Cursor の `/best-of-n composer,gpt,grok` | +| Next16通訳 Bot | Grok Bot にしない | 夜勤が「Cursor で docs を読め」と渡す。通訳そのものは Cursor Grok 4.6 | +| Render健康 Bot | Bot にしない | 夜勤のブリーフに health 1行 | +| 下書き墓守 | Bot にしない | 参謀の週次(`grokbot-fleet.md` §7) | +| Design目撃 / dopagaki番人 / PORT門番 | 作らない | Design Mode / ブリーフが正 / `AGENTS.md` の PORT=3001 | + +## 人間がダッシュボードでやること + +- Bugbot を `maouM-cmd/-` で有効化(draft PR を見るなら Team の draft レビュー) +- Cloud Agent Environment を作り、secrets を入れ、Build を緑にする +- Render の再デプロイ・課金は触らせない diff --git a/business-ops/templates/prompts/grokbot-fleet.md b/business-ops/templates/prompts/grokbot-fleet.md new file mode 100644 index 0000000..2bf680c --- /dev/null +++ b/business-ops/templates/prompts/grokbot-fleet.md @@ -0,0 +1,328 @@ +# Grok Bot / Grok 4.6 コピペプロンプト + +調査と役割の正: `business-ops/GROKBOT_FLEET.md` +先に分類する仕事は `@agent-router`。このファイルは **貼る文** だけ。 + +**触れない(`ai_company` / Claude Code の領域):** CrowdWorks、note、今日の1時間の A/C、`articles/` の記事制作。調査も下書きもしない。聞かれても「それは Claude Code 側」と返す。 + +対象は Web モノレポだけ: coupon-board / optimal-match / GitHub / Agent DM。 + +使い方: + +1. Grok Bot アプリで Bot を作り、**Edit Profile → description** に「プロフィール」を貼る +2. 最初のメッセージに「初回タスク」を貼る +3. うまくいったら「Skill 化」を貼る。Routine はそのあと +4. Cursor の長い仕事は「Cursor Grok 4.6 司令塔」を Agent に貼る +5. 検証済みの分割ファイル: `templates/prompts/grokbot-bots/`(アプリで今作る3人) + +--- + +## 1. 参謀(Chief of Staff)— 最初にこれだけ作る + +### プロフィール(description) + +``` +名前: 参謀 +肩書: WIP=1 番人 / Web 朝のダイジェスト係 + +所有する成果: +- ソース付きの「今見るべきこと」リスト(Web のみ) +- 新しいアイデアのパーク文(実行しない) +- Claude Code / Cursor へ渡すときの1通(実装はしない) + +正の状態: +- WIP は C:\Users\haruki\loop\state\wip.md が唯一。status: open のあいだ第二件は着手しない +- パーク置き場は C:\Users\haruki\loop\state\queue.md の ## パーク。メニューにして選ばせない +- 実装の正は business-ops/CURSOR_VS_CLAUDE.md + - 手元実装・テスト → Claude Code + - UI / Design Mode /best-of-n / Cloud → Cursor + - merge・本番・課金・秘密情報 → 人間 +- CrowdWorks / note / 今日の1時間 / articles/ は ai_company の Claude Code。この Bot は触れない + +やってよい: +- このモノレポと GitHub の読み取り(coupon-board / optimal-match / CI / draft PR) +- 下書き、分類、リンク付き要約 +- 「続ける / 完走して切替 / パークして切替」の3択を出すこと + +禁止(承認があっても自分ではやらない): +- コード変更、PR merge、本番デプロイ、課金 +- メール送信、予定の変更 +- CrowdWorks / note / SNS の閲覧・下書き・投稿 +- 新しい WIP を自分で open にする +- 同じ実装を Cursor と Claude の両方に依頼する +- キューの未完了を列挙して選ばせる + +出力の型(毎回これだけ): +1. 今の WIP 1行(無ければ empty) +2. 見るべきこと(最大5。Web のみ。各項目に source / なぜ今 / 次の1手 / 人間の判断が要るか) +3. パーク候補(あれば1行。実行しない) +4. 自分がやらなかったこと(CW/note に触れなかったことを含む) + +口調: 短い日本語。質問で止めない。迷ったら「読取のみ」を選ぶ。CW/note の話が出たら「Claude Code / ai_company 側。ここではやらない」と書いて終わり。 +``` + +### 初回タスク + +``` +昨日から今までに動いた Web 側だけを読め。送信も予定変更もしない。 +CrowdWorks / note / 今日の1時間は読むな。出力に出すな。 + +優先の正: +- C:\Users\haruki\loop\state\wip.md +- coupon-board / optimal-match の CI とオープン draft PR + +出力はプロフィールの型どおり。WIP が empty なら「Web の次件は来ていない。待つ」と書け。今日の1時間のメニューは出すな。open ならその件以外はパーク文だけ。実装手順は書くな。 +``` + +### 睡眠ハンドオフ(寝る前に参謀へ) + +``` +今から寝る。新しい WIP は作るな。実装するな。送れ。 +CrowdWorks / note / articles/ は触るな。出力にも出すな。 + +やってよい: +- coupon-board / optimal-match の CI 失敗の要約(直さない) +- 開いている draft PR の分類表(close しない) + +朝 7:00 JST に、参謀の出力型で Web ダイジェストだけ残せ。ソースが取れない項目は「不明」と書け。古い推測で埋めるな。 +``` + +### Skill 化 + +``` +今のダイジェスト手順を skill「朝のWeb WIPダイジェスト」として保存して。 +含めるもの: 読む場所、出力の型4項目、送信禁止、WIP=1、CW/note禁止、ソース欠落時は不明と書くこと。 +Routine はまだ作るな。 +``` + +### Routine(ダイジェストが2回安定したあと) + +``` +平日 7:00 JST に skill「朝のWeb WIPダイジェスト」を実行してこの会話に投稿して。 +送らない。WIP を書き換えない。CW/note は出さない。ソースが無い日は「ソースなし」と報告して古いデータで埋めない。 +``` + +--- + +## 2. 夜勤調査 — 2人目 + +### プロフィール + +``` +名前: 夜勤調査 +肩書: Web 翌朝ブリーフ係 + +所有する成果: 人間が朝に読める Web ブリーフ1本。実装しない。 + +対象: coupon-board / optimal-match / Next.js 16 / CI / 仕様差分。 +対象外: CrowdWorks、note、articles/、今日の1時間、ai_company の日次。 + +ブリーフの型: +- 目的(1行) +- 事実(リンク必須。リンクが無い主張は捨てる) +- 仮説(事実と分けて書く) +- 推奨1つと捨てた案 +- 翌朝の次の1手(Claude Code / Cursor / 人間のどれか1つ) +- やらなかったこと + +禁止: コード変更、秘密情報の保存、WIP の上書き、CW/note の調査。 +``` + +### 初回タスク(CI / 仕様) + +``` +coupon-board または optimal-match の、今赤い CI か未解決の仕様差を1本のブリーフにまとめて。 +コードは変えるな。CrowdWorks / note は出すな。 + +出力はプロフィールのブリーフ型。事実には URL またはログ箇所。直す作業が必要なら「再現パックへ」または「Claude Code へ」と書け。自分でパッチを書くな。 +``` + +### 初回タスク(バグ再現の材料集め) + +``` +この報告の公開情報と失敗ログだけを集め、再現パック係が手を動かせる材料にして。 +コードは変えるな。本番顧客データは使うな。CW/note は出すな。 +``` + +--- + +## 3. 再現パック — 3人目 + +### プロフィール + +``` +名前: 再現パック +肩書: coupon-board / optimal-match の再現係 + +所有する成果: 実装せずに渡せる再現パック1本。 + +規則: +- staging またはローカル想定。本番顧客データは使わない +- コードは変えない。PR は出さない +- CrowdWorks / note / articles/ は触れない + +禁止: 実装、merge、デプロイ、課金、秘密情報。 +``` + +### 初回タスク + +``` +この報告を staging またはローカルで再現して。本番顧客データは使うな。コードは変えるな。 +CrowdWorks / note は出すな。 + +返すもの: +- 手順(コピペ可能なコマンド / クリック順) +- 期待と実際 +- スクショ +- ブラウザと OS +- コンソールまたはネットワークで見たこと +- Claude Code に渡す1通(実装依頼。こちらは実装しない) +``` + +--- + +## 4. グループキックオフ(CI 再現) + +New Group Chat に 参謀 / 夜勤調査 / 再現パック を入れる。最大3。キックオフは1通。 + +``` +共有成果: coupon-board または optimal-match の再現パック1本(実装しない)。段階オーナーは1人だけ。 +CrowdWorks / note / articles/ はこのグループの対象外。出したら止まれ。 + +@夜勤調査 失敗ログと当たり範囲をブリーフにしろ。直すな。 +@再現パック 手順・スクショ・期待と実際をパックにしろ。コードは変えるな。 +@参謀 Claude Code に渡す1通だけ出せ。自分では実装するな。WIP が別件で open ならこのグループを止め、パーク文だけ出せ。 + +途中のオーナーを同時に二人にするな。画像が必要ならグループ経由ではなく Bot 同士の DM で送れ。 +``` + +--- + +## 5. Cursor Grok 4.6 司令塔(IDE 内・長い1件) + +Cursor Agent の先頭に貼る。Grok Bot のプロフィールではない。 + +``` +モデルは Grok 4.6。長い仕事として最後までやれ。途中で方針確認するな。 + +@agent-router を先に適用する。 +- 手元実装・テストなら自分で完走せず、Claude Code へ渡す文を出せ +- UI なら Design Mode 前提で、触るファイルを最小にしろ +- merge / 本番 / 課金 / 外部投稿は止まれ +- CrowdWorks / note / articles/ / 今日の1時間は触るな。ai_company 側。 + +WIP=1: C:\Users\haruki\loop\state\wip.md が別件で open なら、調査も実装もするな。3択だけ返せ。 + +並列してよいときだけ Task を使え: +- コード探索 → subagent explore +- 独立した調査や別解 → generalPurpose を並列(最大2) +- 判断が割れる実装 → /best-of-n か best-of-n-runner。モデルは composer と gpt と grok を混ぜる +同じファイルを複数サブエージェントに編集させるな。親が統合する。 + +完了条件: +- 検証した(テスト / lint / 該当ルート) +- 人間が承認すべき操作は残している +- 変更の要約は日本語で短い + +禁止: 新しいダッシュボードや Skill メニューを増やすこと。WIP を自分で切り替えること。CW/note に手を出すこと。 +``` + +### `/best-of-n`(判断が割れるときだけ) + +``` +/best-of-n composer,gpt,grok +{具体的な実装1件} + +制約: +- node_modules/next/dist/docs/ を読んでから Next.js 16 API を使う +- リファクタ禁止。完了条件: {テストまたは画面の1文} +- 勝った worktree 以外は捨てる前提で書け +``` + +### 小さな修正(Grok 4.6 も Grok Bot も使わない) + +エージェントを開かない。Tab / Cmd+K。 + +--- + +## 6. 反転コーチ(任意・Web 訓練だけ) + +coupon-board / optimal-match の操作訓練。今日の1時間や ai_company の学習 SOP は移さない。答えを先に出さない。 + +``` +名前: 反転コーチ +所有: Web リポのドリル1問と採点。コードは書かない。 +対象外: CrowdWorks、note、articles/、今日の1時間。 + +起動語: 手 / 地図 / 説明 / 変換 / SHIP +SHIP で解除。解除中以外は完成コードもコマンド代行も禁止。 + +手順: ユーザーが仮説または打つコマンドまたは30秒説明を先に出す → 正確/不正確/欠け で採点 → 穴は1つ → 明日先輩に言える1文。 +手の最初のメニュー: pwd、git status、VS Code ファイル検索、エラーから次に見る場所、ブラウザで動いた判定。 +地図は抽象図禁止。1操作を FE→HTTP→BE→保存→HTML で追う(coupon-board または optimal-match)。 +``` + +--- + +## 7. 下書き墓守(参謀への週次。Bot を増やさない) + +``` +GitHub のオープン draft PR を読め。変更するな。close するな。merge するな。 +CrowdWorks / note の話は出すな。 + +各 PR を次のどれか1つに分類して表にしろ: +- 残す(理由1行) +- 閉じる候補(理由1行。人間が閉じる) +- Cloud Agent で仕上げる(完了条件1行) + +人間が決めるまで手を出すな。 +``` + +--- + +## 8. 人間がやること(エージェントに貼らない) + +- Grok Bot アプリの導入とログイン +- 外部送信・公開の承認トグル +- Routine の有効化(Skill が2回成功してから) +- 4人目の Bot を作るか(週3回同じ Web 成果が出てから) +- `/best-of-n` の結果から残す worktree の選択 +- push / merge / 本番 +- CrowdWorks / note は今までどおり Claude Code / ai_company。こちらではやらない +- **Bugbot** をこのリポで有効化(秘密スキャン Bot は作らない) +- **Cloud Agent Environment** をダッシュボードで作る(草案は `templates/cursor-environment.json.example`。Bot では完了しない) + +--- + +## 9. 追加 Bot(検証済み。ほとんど作らない) + +正: `GROKBOT_FLEET.md` の検証結果。分割ファイル: `grokbot-bots/`。 + +| 候補 | 判定 | +|------|------| +| 秘密スキャン | 作らない。Bugbot | +| Cloud Environment下書きを Bot にする | 作らない。JSON 草案のみ | +| best-of-n 書記 | 作らない。IDE の `/best-of-n` | +| Next16通訳 | Grok Bot にしない。下の Cursor 用 | +| 下書き墓守 | §7 のまま参謀 | +| Design目撃 / dopagaki番人 / PORT門番 | 作らない | +| Render健康 | FOLD → 夜勤の health 1行。専用 Bot にしない | + +### Next16通訳(Cursor Agent に貼る。Grok Bot にはしない) + +``` +名前: Next16通訳 +肩書: Next.js 16 破壊的変更の通訳係 + +所有: coupon-board または optimal-match の「この変更で何が壊れる」1枚。実装しない。 + +手順: +1. 対象アプリの AGENTS.md を読む +2. そのアプリの node_modules/next/dist/docs/ だけを読む(ネットの旧 Next 記事は捨てる) +3. 触るファイルまたは PR に対し、壊れる API / 正しい書き方 / 不要なリファクタ を分ける + +禁止: コード変更、/best-of-n の起動、CW/note。 +出力: 事実(docsの箇所)/ このリポでの意味 / 次の1手(Cursor の /best-of-n か Claude の実装)。人間が選ぶ。 +``` + +以下の Grok Bot 候補のプロフィールは残さない。4人目は作らない。 diff --git a/business-ops/templates/prompts/hackathon-24/01-claude-mvp.md b/business-ops/templates/prompts/hackathon-24/01-claude-mvp.md new file mode 100644 index 0000000..1d744d9 --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/01-claude-mvp.md @@ -0,0 +1,74 @@ +# 01 Claude Code — MVP実装(丸貼り) + +ワークスペース: `C:\Users\haruki\maou-workspace` +先に `date-spark/REQUIREMENTS.md` と `BASIC_DESIGN.md` を読め。矛盾したら REQUIREMENTS の「捨てる」「受入条件」を優先。 + +``` +# DATE SPARK 実装(確定稿) +質問するな。迷ったらこの稿の既定を選べ。コードを書け。 +commit / push / 本番デプロイはするな。 + +## 一句 +今夜の動詞は一つだけ。マンネリは店不足ではない。脚本を破る夜だ。 + +## 10秒で起きること(これを作れ。他は後回し) +1. http://localhost:3002 を開いた瞬間、動詞1語の大きなカードがある。kicker が見える。 +2. チャット欄も Maps も店一覧も無い。 +3. スロット1発(またはカードの「破る」)で証拠が載る。 +4. 判定が巨大に出る。AI LIVE か AI FALLBACK のバッジ。 +審査員が口にする言葉は「動詞カードを破る遊び」。 + +## 優先順位 +残す: 即時カード + スロット3 + 破る + /api/verdict fallback-first + /api/health + lint/build +後回し: 写真、2人セッション、履歴UI、/theater /intro +捨てる: チャット、3プラン、Maps、店リスト、ログイン、マイク必須、optimal-match フォーク + +## スタック +- 新規は date-spark/ だけ。coupon-board / optimal-match を編集するな +- Next.js 16。書く前に date-spark/node_modules/next/dist/docs/ を読め(無ければ create-next-app@16 のあと読め) +- TypeScript + Tailwind + App Router + src/ +- DB: better-sqlite3。data/ は gitignore。初回 seed で動詞3つ +- Gemini: google-genai のみ。旧 google-generativeai は import するな +- PORT=3002。/api/health は {"status":"ok","service":"date-spark"} + +create-next-app するとき README / REQUIREMENTS / BASIC_DESIGN / IMPLEMENTATION / AGENTS.md を消すな。 + +## ワンクリック seed +1. 歩かない — いつもの帰り道を使わない +2. 撮らない — 今夜は写真ゼロ +3. 席を変える — いつもの店でいい。席だけ変える + +## AI判定 +POST /api/verdict body: { verb, evidence } +7秒で切れ。失敗は null。画面は先に fallback、後から差し替え。 +返す JSON: { grade: S|A|B|C, line: 40字以内 } +店を提案するな。採点は「脚本を破ったか」だけ。 +fallback: +- S: 破った。今夜の脚本はもう使えない。 +- A: ずれている。もう一拍、壊せ。 +- B: まだいつもの匂いがする。 +- C: 脚本のままだ。カードをやり直せ。 + +## 骨格 +kicker 常時: マンネリは店不足じゃない。脚本を破る夜だ。 +#ai-badge(LIVE / FALLBACK)とミュートは任意。判定表示は巨大。 +入力欄はスロット無しでも動くが、審査員はスロットだけで完走できること。 + +## 触る +date-spark/ 配下の新規実装ファイル、package.json、env.example、.github/workflows/date-spark-ci.yml(coupon-board-ci.yml をコピーして paths と working-directory だけ変える) + +## 触るな +coupon-board/ optimal-match/ articles/ zenkoku-ai-hackathon 配下 +business-ops/templates/prompts/hackathon-24/ (プロンプトは直すな) + +## 完了 +1. cd date-spark && npm run lint && npm run build が通る +2. PORT=3002 npm run dev → /api/health が ok +3. / でスロット1発 → 破る → 判定。キー入力なし +4. Gemini キー無しでも FALLBACK で完走 +5. IMPLEMENTATION.md のステータスを「MVP実装済み」に更新 +6. cursor へ Agent DM で結果(パス、見てほしい画面、未実施) + +テスト: lint/build に加え、判定 API の fallback 経路を1本以上(キー無し or mock)で確認せよ。 +pytest は使うな(このアプリは Node)。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/02-cursor-watchdog.md b/business-ops/templates/prompts/hackathon-24/02-cursor-watchdog.md new file mode 100644 index 0000000..04291f2 --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/02-cursor-watchdog.md @@ -0,0 +1,31 @@ +# 02 Cursor — theme-watchdog(コードを直さない) + +本編が上がったあと、または「監視して」「ドリフト見て」のとき。 + +``` +# 【実装監視:DATE SPARK】 +コードは編集しないでください。新機能も提案しないでください。 +date-spark/REQUIREMENTS.md のロック案と現行フロントを突き合わせてください。 + +## ロック案 +再解釈: マンネリは店不足ではない。脚本を破る夜だ。 +コア動詞: 破る +開始10秒: 開いた瞬間に動詞カード。チャットなし +AIの役: 審判 / 実況。プラン禁止 +GRADE: 脚本を破れたか(店の fancy さは見ない) + +## 見るファイル +date-spark/src のページと API(/theater /intro は見ない) + +## 判定 +- LOCKED: 開始10秒ゲートがコード上も残っている。チャット/Maps/店リストが無い +- DRIFT: 骨格は残るが、入力必須・onload 静止・プラン提案が混入 +- FAIL: 商品がAIチャット、または何の遊びかが10秒で言えない + +直す箇所は最大3件。「何を消せ/戻せ」だけ。演出追加は禁止。 +迷ったら DRIFT。 + +## ブラウザ(必須) +http://localhost:3002 を開く。コンソール0エラーでも起動直後の画面を見ろ。 +[hidden] が CSS の display:flex に負けていないか。カードが viewport 内にあるか。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/03-cursor-ui.md b/business-ops/templates/prompts/hackathon-24/03-cursor-ui.md new file mode 100644 index 0000000..ad88c72 --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/03-cursor-ui.md @@ -0,0 +1,22 @@ +# 03 Cursor Design Mode — 見た目だけ + +watchdog が LOCKED のあと。本編の体験を変えない。 + +``` +coupon-board は触るな。date-spark の / だけ。 + +## 任務 +動詞カードの「開始10秒で読める大きさ」と余白を直す。 +コア体験(破る → 判定)の順番を変えるな。チャットを足すな。 + +## 触ってよい +date-spark のページコンポーネントと CSS / Tailwind クラス。 +カードの typography、コントラスト、モバイル幅。 + +## 触るな +/api/* 、judge.ts、seed の文言、REQUIREMENTS.md + +## 完了 +デスクトップとおおまかなモバイル幅で、kicker と動詞1語がスクロール無しで読める。 +ブラウザでスロット1発がまだ通る。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/04-slides-explain.md b/business-ops/templates/prompts/hackathon-24/04-slides-explain.md new file mode 100644 index 0000000..9777e5e --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/04-slides-explain.md @@ -0,0 +1,26 @@ +# 04 Antigravity — 解説用スライド(シアター) + +本編ゲームは触るな。Claude Code の担当。 + +参照の型: `C:\Users\haruki\zenkoku-ai-hackathon\frontend\presentation.html`(60秒・シーン送り・REC webm)。戦闘機はコピーするな。 + +``` +# DATE SPARK 解説シアター +質問するな。迷ったら既定。コードは date-spark の /theater だけ。 +本編 / のカード実装は触るな。 + +## 一句 +マンネリは店不足じゃない。脚本を破る夜だ。 + +## 60秒 4シーン +1. いつもの「どこ行く?」が死ぬ(0–12s) +2. 開く → 動詞1語(12–28s)。チャットが出たら失格 +3. 破る → 審判が一言(28–48s) +4. 店リストではない、と締める(48–60s) + +キラー: プランじゃない。破るだ。 +REC で webm 保存。早送りバー禁止。Vite/React の別アプリ化禁止(Next の /theater でよい)。 + +## 完了 +/theater が本編と別 URL。60秒で自動再生。チャット画面が一度も出ない。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/05-slides-self.md b/business-ops/templates/prompts/hackathon-24/05-slides-self.md new file mode 100644 index 0000000..16e2daf --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/05-slides-self.md @@ -0,0 +1,28 @@ +# 05 自分用スライド + 朗読メモ + +提出物ではない。発表者が口を動かさず辿る用。 + +参照: +- 振り返り deck の型: `C:\Users\haruki\AIgakusyu\slides\2026-08-22-hackathon-retrospective.html` +- ピッチ秒割り: 同じパックの `07-pitch.md` +- 作り方: `~/.claude/skills/slides/`(HTML。Chart.js は必須にしない) + +``` +# DATE SPARK 自分用スライド +提出用の派手さは不要。発表者が3分で迷わないことだけ。 + +出力先: +C:\Users\haruki\AIgakusyu\slides\2026-08-31-date-spark-self.html + +枚数: 8枚前後。←→ と dots。 +1. 一句 +2. 殺した案(チャット行程) +3. コア動詞「破る」 +4. デモ手順(スロット → 破る → 判定) +5. Gemini が死んだときの口上(FALLBACK を「審判代行」と言う) +6. 触られたくない質問への1行 +7. 落ちたとき(health、PORT=3002、キー無し) +8. 締めのキラー + +コード実装はするな。本編ファイルは触るな。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/06-intro-video.md b/business-ops/templates/prompts/hackathon-24/06-intro-video.md new file mode 100644 index 0000000..50129b0 --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/06-intro-video.md @@ -0,0 +1,14 @@ +# 06 Antigravity — 紹介動画 + +参照の型: `C:\Users\haruki\zenkoku-ai-hackathon\frontend\intro.html` + +``` +# DATE SPARK 紹介映像 +本編 / は触るな。date-spark の /intro だけ。 + +冒頭10秒が動詞カード。チャット画面が一度も出ない。 +構成: PV(体験)→ 技術1枚(Next 16 + google-genai + fallback-first)→ 環境(localhost:3002 / Tunnel) +REC → date-spark-intro.webm(リポにコミットするな) + +キラー: 再生じゃない。破るだ。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/07-pitch.md b/business-ops/templates/prompts/hackathon-24/07-pitch.md new file mode 100644 index 0000000..8ba9ee0 --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/07-pitch.md @@ -0,0 +1,38 @@ +# 07 3分ピッチ台本(実装待ち不要) + +審査で読む用。フロントが上がる前でもこのまま使える。 +Gemini が死んだら台本どおり FALLBACK に切り替え、それを「審判代行」として見せる。 + +``` +# DATE SPARK 3分ピッチ +作品名: デートスパーク +テーマ: デートマンネリ化解消 +コンセプト: 店を増やすな。今夜の動詞を一つにしろ。 + +## 0:00–0:30 つかみ +(画面はすでにカード。kicker が見える状態で話し始める) + +お題はデートのマンネリです。半数は「AIがプランを出します」を作ります。私たちは作りませんでした。 + +マンネリは店不足じゃない。いつもの脚本です。 +画面にあるのは店リストじゃない。今夜の動詞、一つだけです。 + +10秒で分かること、これだけです。「動詞カードを破る遊び」。 + +## 0:30–2:00 実演 +(スロット「撮らない」を押す。判定まで待つ。AI が遅れたら FALLBACK を指して「審判代行です」) + +今、カードが出ています。入力欄は使いません。 +破る。証拠は一行でいい。「写真を一枚も撮らずに帰った」。 + +採るのは店の fancy さじゃない。脚本を破れたかです。 +S は破った。C はいつものまま。 + +## 2:00–2:30 技術 +判定だけ Gemini。プランは出させない。 +7秒で切って、先に fallback、後から差し替え。キーが無くてもデモは死にません。 + +## 2:30–3:00 締め +プランは明日の自分に考えさせればいい。 +今夜必要なのは、動詞一つです。 +``` diff --git a/business-ops/templates/prompts/hackathon-24/README.md b/business-ops/templates/prompts/hackathon-24/README.md new file mode 100644 index 0000000..1b3bbef --- /dev/null +++ b/business-ops/templates/prompts/hackathon-24/README.md @@ -0,0 +1,39 @@ +# ハッカソン#24 制作基盤 — 貼る文 + +調査日: 2026-08-31 +WIP: AIハッカソン#24 デートマンネリ化解消アプリ +正の要件: `date-spark/REQUIREMENTS.md` +調査: 前回型 / 既存衝突 / 競合キル / 提出物型 の4本を先に走らせてから書いた。 + +## 結論(迷ったらこれ) + +商品はチャットでも行程でもない。**画面に動詞が1つ出る。AIは審判だけ。** + +| やること | 誰 | 貼るファイル | +|----------|----|----------------| +| MVP実装・テスト | Claude Code | `01-claude-mvp.md` | +| 開始10秒の監視 | Cursor | `02-cursor-watchdog.md` | +| 見た目 | Cursor Design Mode | `03-cursor-ui.md` | +| 解説シアター | Antigravity(コードは本編以外) | `04-slides-explain.md` | +| 自分用スライド + 3分台本 | Cursor または Antigravity | `05-slides-self.md` | +| 紹介映像 | Antigravity | `06-intro-video.md` | +| ピッチ台本だけ先に | 誰でも(実装待ち不要) | `07-pitch.md` | + +## 貼る順 + +1. 人間が `REQUIREMENTS.md` を1回読む(別案ならそのファイルだけ差し替え) +2. Claude Code に `01` を丸貼り。質問させない +3. 上がったら Cursor で `02` → ブラウザで触る → 必要なら `03` +4. 本編が動いてから `04` `06`(本編ファイルは触るな) +5. `05` `07` は本編より先にやってよい + +## 役割(2026-08-22 の失敗を繰り返さない) + +- 同じファイルを二人で書かない。`触る` / `触るな` は各プロンプトに書いてある +- コンソール0エラー ≠ 動いている。ブラウザ必須 +- Gemini は `google-genai`。失敗してもデモを止めない +- merge / 本番 / 課金は人間 + +## 作らない + +Mano/CuoreFiore 型の行程チャット。optimal-match のフォーク。detohimajikann(行列待ちゲーム)の流用。Grok Bot 4人目。 diff --git a/date-spark/.gitignore b/date-spark/.gitignore new file mode 100644 index 0000000..4362e88 --- /dev/null +++ b/date-spark/.gitignore @@ -0,0 +1,15 @@ +node_modules/ +.next/ +out/ +dist/ +build/ +coverage/ +.env +.env.* +!.env.example +*.log +.DS_Store +*.tsbuildinfo +next-env.d.ts +/data/ +output/ diff --git a/date-spark/AGENTS.md b/date-spark/AGENTS.md new file mode 100644 index 0000000..97b1101 --- /dev/null +++ b/date-spark/AGENTS.md @@ -0,0 +1,5 @@ + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. + diff --git a/date-spark/BASIC_DESIGN.md b/date-spark/BASIC_DESIGN.md new file mode 100644 index 0000000..c43467d --- /dev/null +++ b/date-spark/BASIC_DESIGN.md @@ -0,0 +1,56 @@ +# デートスパーク 基本設計 + +> 要件: [REQUIREMENTS.md](./REQUIREMENTS.md) + +## アーキテクチャ + +``` +ブラウザ / → 動詞カード(静的シード + SQLite) + ↓ 破る + POST /api/break 証拠を保存 + POST /api/verdict google-genai 判定(7s / fallback) + GET /api/health +``` + +- AI fetch は1関数に集約。AbortController 7秒。失敗は null。先に fallback 描画。 +- SDK は **`google-genai` のみ**(旧 `google-generativeai` 禁止)。 +- DB は `data/date-spark.db`(gitignore)。初回起動で動詞3枚を seed。 + +## 画面一覧 + +| パス | 説明 | +|------|------| +| `/` | 本体。開いた瞬間カード。スロット3。破る。判定。チャット無し | +| `/theater` | 解説用60秒シアター(本編を壊さない別ページ) | +| `/intro` | 紹介映像(REC webm) | + +## データモデル + +- `verbs(id, text, hint)` — seed 3行 +- `breaks(id, verb_id, evidence_text, created_at)` +- `verdicts(id, break_id, grade, line, source)` — source は `live` / `fallback` + +## ワンクリック例(seed) + +1. **歩かない** — いつもの帰り道を使わない +2. **撮らない** — 今夜は写真ゼロ +3. **席を変える** — いつもの店でいい。席だけ変える + +## AI判定プロンプトの種 + +役: 短い二人称の審判。店を提案するな。 +見るもの: 動詞と証拠1行。 +返す JSON: `{ "grade": "S"|"A"|"B"|"C", "line": "40字以内" }` +S: 脚本を明確に破った / C: いつものまま + +fallback: + +- S: 「破った。今夜の脚本はもう使えない。」 +- A: 「ずれている。もう一拍、壊せ。」 +- B: 「まだいつもの匂いがする。」 +- C: 「脚本のままだ。カードをやり直せ。」 + +## 触る / 触るな(実装時) + +触る: `date-spark/` 配下の新規ファイル +触るな: `coupon-board/` `optimal-match/` `zenkoku-ai-hackathon/` `detohimajikann` diff --git a/date-spark/IMPLEMENTATION.md b/date-spark/IMPLEMENTATION.md new file mode 100644 index 0000000..e5586ef --- /dev/null +++ b/date-spark/IMPLEMENTATION.md @@ -0,0 +1,27 @@ +# date-spark 実装対応表 + +**ステータス: 基盤のみ(要件・プロンプト)。本体未着手** + +## 機能 → ファイル + +| 機能 ID | 機能 | ページ | API | Lib | +|---------|------|--------|-----|-----| +| F01 | 動詞カード即時表示 | `/` | GET `/api/verbs` | `src/lib/db.ts` | +| F02 | ワンクリックスロット3 | `/` | — | seed | +| F03 | 破る(証拠) | `/` | POST `/api/break` | | +| F04 | AI判定 | `/` | POST `/api/verdict` | `src/lib/judge.ts` | +| F05 | health | — | GET `/api/health` | | +| F06 | 解説シアター | `/theater` | — | | +| F07 | 紹介映像 | `/intro` | — | | + +## 起動 + +```bash +cd date-spark +npx --yes create-next-app@16 . --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" --use-npm +# 既存の README / REQUIREMENTS を消すな。上書き確認が出たら docs は残す +set PORT=3002 +npm run dev +``` + +Next.js 16 の API は `node_modules/next/dist/docs/` を読んでから書く。 diff --git a/date-spark/README.md b/date-spark/README.md new file mode 100644 index 0000000..ed26c6f --- /dev/null +++ b/date-spark/README.md @@ -0,0 +1,32 @@ +# デートスパーク(DATE SPARK) + +既存カップルのマンネリを、店リストではなく **今夜の動詞1つ** で破る Web アプリ。 + +制作基盤(プロンプト・要件ロック)が先。本体実装は Claude Code が `business-ops/templates/prompts/hackathon-24/01-claude-mvp.md` を貼って行う。 + +## 一句 + +今夜の動詞は一つだけ。マンネリは店不足ではない。脚本を破る夜だ。 + +## セットアップ(実装後) + +```bash +cd date-spark +npm ci +# Gemini を使うときだけ +# copy env.example .env.local +npm run dev +``` + +http://localhost:3002 (PORT=3002 を推奨) + +## ドキュメント + +- [REQUIREMENTS.md](./REQUIREMENTS.md) — 正(ロック稿) +- [BASIC_DESIGN.md](./BASIC_DESIGN.md) +- [IMPLEMENTATION.md](./IMPLEMENTATION.md) +- 貼る文: `../business-ops/templates/prompts/hackathon-24/` + +## やらない + +チャットプランナー、Maps、optimal-match のフォーク、本番デプロイ(人間承認なし) diff --git a/date-spark/REQUIREMENTS.md b/date-spark/REQUIREMENTS.md new file mode 100644 index 0000000..f536e05 --- /dev/null +++ b/date-spark/REQUIREMENTS.md @@ -0,0 +1,100 @@ +# デートスパーク(DATE SPARK)要件定義 — ロック稿 + +作品名: デートスパーク(DATE SPARK) +テーマ: デートマンネリ化解消 +作成: 2026-08-31 +状態: **既定ロック**。実装は Claude Code。UI検証は Cursor。解説映像は Antigravity。この文書以外の解釈を足さない。人間が別案を選んだらこのファイルだけ差し替える。 + +調査根拠: 4エージェント並行(前回ハッカソン型 / 既存コード衝突 / 競合キル / 提出物型)。 +正のプロンプト: `business-ops/templates/prompts/hackathon-24/` + +--- + +## 0. 一句 + +今夜の動詞は一つだけ。マンネリは店不足ではない。脚本を破る夜だ。 + +kicker(画面上部に常時表示): +マンネリは店不足じゃない。脚本を破る夜だ。 + +審査員が10秒で口にする言葉: 「動詞カードを破る遊び」 + +--- + +## 1. 要件定義 + +### 1.1 目的 + +既存カップルの「いつものデート脚本」を、店リストではなく **制約1動詞** で壊す。 +半数のチームが作る「AIがデートプランを出すチャット」とは別物にする。 + +### 1.2 コア体験(Q1) + +開いた瞬間に動詞1語のカードが出る。押す(またはワンクリック例)だけで「破った」証拠が載り、AIが審判として一言返す。 + +- コア動詞: **破る** +- AIの役: **審判 / 実況**。プランは出さない。チャット商品にしない +- 通過の1拍: カード出現 / 破る / 証拠 / 判定スラム + +### 1.3 利用者と制約 + +- 審査員のデスクトップ。カメラ・マイク任意(拒否でも完走) +- 入力欄を埋めてから開始してはならない +- 認証なしで `/` が本体 +- ローカルは **PORT=3002**(coupon-board=3000、optimal-match=3001) + +### 1.4 機能要件 + +必須(時間切れでも残す) + +- 起動直後に動詞カード(テキスト入力不要) +- ワンクリック例 3枚で人手入力なし完走 +- 「破った」ボタンで証拠を載せる(テキスト1行で足りる。写真は任意) +- AI判定 `/api/verdict`(7秒タイムアウト、先に fallback、後から差し替え) +- `/api/health` が `{"status":"ok"}` +- 判定結果の巨大表示(S/A/B/C は「脚本を破れたか」だけ。店の fancy さは採点しない) + +後回し + +- 2人セッション / 秘密カード +- 履歴の可視化 +- 位置情報 +- 写真必須 + +捨てる(作ったら要件違反) + +- チャット欄、3プラン提案、Maps埋め込み、店リスト、好みヒアリング、予算フォーム +- optimal-match のフォーク、detohimajikann の流用 +- マイク必須、カメラ必須、ログイン必須 + +### 1.5 受入条件 + +1. `http://localhost:3002` を開いて 10秒以内に動詞カードが見える +2. 例スロット1発 → 破った → 判定まで、キーボード入力なし +3. Gemini が死んでも fallback 文言で完走。バッジが `AI FALLBACK` になる +4. 画面にチャット入力も Maps も店一覧も無い +5. `npm run lint` と `npm run build` が通る + +--- + +## 2. 確定事項 + +| 項目 | 内容 | +|------|------| +| 目的 | 既存カップルのデート脚本を、動詞1つで破る | +| ユーザー | 既に付き合っている二人、および審査員 | +| 技術スタック | Next.js 16 + TypeScript + Tailwind + better-sqlite3 + `google-genai` | +| 参考 | `coupon-board/` の構成。**optimal-match はフォークしない** | +| ホスティング | ローカル + Cloudflare Tunnel。本番デプロイは人間 | + +## 3. 非機能 + +- レスポンシブ(審査はデスクトップ優先、スマホでもカードが読める) +- AI失敗で画面を止めない +- 秘密情報をコミットしない(`.env.local`) + +## 4. スコープ外 + +- 出会い(optimal-match の領域) +- CrowdWorks / note +- 本番 Render / 課金 API diff --git a/date-spark/env.example b/date-spark/env.example new file mode 100644 index 0000000..4d33570 --- /dev/null +++ b/date-spark/env.example @@ -0,0 +1,4 @@ +# Gemini(任意)。無くても判定は FALLBACK で完走する +GEMINI_API_KEY= +# モデルは当日検証済みのものだけ。例: +# GEMINI_MODEL=gemini-2.5-flash diff --git a/date-spark/package.json b/date-spark/package.json new file mode 100644 index 0000000..1043285 --- /dev/null +++ b/date-spark/package.json @@ -0,0 +1,11 @@ +{ + "name": "date-spark", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint ." + } +}