@ozzylabs/feedradar 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/agents/_boundary.d.ts +44 -0
- package/dist/agents/_boundary.d.ts.map +1 -0
- package/dist/agents/_boundary.js +59 -0
- package/dist/agents/_boundary.js.map +1 -0
- package/dist/agents/claude-code.d.ts +32 -0
- package/dist/agents/claude-code.d.ts.map +1 -0
- package/dist/agents/claude-code.js +256 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/codex-cli.d.ts +31 -0
- package/dist/agents/codex-cli.d.ts.map +1 -0
- package/dist/agents/codex-cli.js +303 -0
- package/dist/agents/codex-cli.js.map +1 -0
- package/dist/agents/copilot.d.ts +29 -0
- package/dist/agents/copilot.d.ts.map +1 -0
- package/dist/agents/copilot.js +282 -0
- package/dist/agents/copilot.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +30 -0
- package/dist/agents/gemini-cli.d.ts.map +1 -0
- package/dist/agents/gemini-cli.js +316 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +33 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/types.d.ts +103 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/claude-skills/dismiss/SKILL.md +41 -0
- package/dist/claude-skills/research/SKILL.md +45 -0
- package/dist/claude-skills/review/SKILL.md +45 -0
- package/dist/claude-skills/update/SKILL.md +49 -0
- package/dist/cli/dismiss.d.ts +28 -0
- package/dist/cli/dismiss.d.ts.map +1 -0
- package/dist/cli/dismiss.js +122 -0
- package/dist/cli/dismiss.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +64 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +148 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +578 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/research.d.ts +30 -0
- package/dist/cli/research.d.ts.map +1 -0
- package/dist/cli/research.js +313 -0
- package/dist/cli/research.js.map +1 -0
- package/dist/cli/review.d.ts +34 -0
- package/dist/cli/review.d.ts.map +1 -0
- package/dist/cli/review.js +418 -0
- package/dist/cli/review.js.map +1 -0
- package/dist/cli/source.d.ts +57 -0
- package/dist/cli/source.d.ts.map +1 -0
- package/dist/cli/source.js +511 -0
- package/dist/cli/source.js.map +1 -0
- package/dist/cli/update.d.ts +43 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +429 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/watch.d.ts +22 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +101 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/core/config.d.ts +60 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +101 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/feeds/derive-id.d.ts +43 -0
- package/dist/core/feeds/derive-id.d.ts.map +1 -0
- package/dist/core/feeds/derive-id.js +66 -0
- package/dist/core/feeds/derive-id.js.map +1 -0
- package/dist/core/feeds/github-api.d.ts +69 -0
- package/dist/core/feeds/github-api.d.ts.map +1 -0
- package/dist/core/feeds/github-api.js +161 -0
- package/dist/core/feeds/github-api.js.map +1 -0
- package/dist/core/feeds/github-releases.d.ts +3 -0
- package/dist/core/feeds/github-releases.d.ts.map +1 -0
- package/dist/core/feeds/github-releases.js +85 -0
- package/dist/core/feeds/github-releases.js.map +1 -0
- package/dist/core/feeds/html.d.ts +10 -0
- package/dist/core/feeds/html.d.ts.map +1 -0
- package/dist/core/feeds/html.js +263 -0
- package/dist/core/feeds/html.js.map +1 -0
- package/dist/core/feeds/index.d.ts +5 -0
- package/dist/core/feeds/index.d.ts.map +1 -0
- package/dist/core/feeds/index.js +18 -0
- package/dist/core/feeds/index.js.map +1 -0
- package/dist/core/feeds/npm-registry.d.ts +36 -0
- package/dist/core/feeds/npm-registry.d.ts.map +1 -0
- package/dist/core/feeds/npm-registry.js +200 -0
- package/dist/core/feeds/npm-registry.js.map +1 -0
- package/dist/core/feeds/rss.d.ts +12 -0
- package/dist/core/feeds/rss.d.ts.map +1 -0
- package/dist/core/feeds/rss.js +222 -0
- package/dist/core/feeds/rss.js.map +1 -0
- package/dist/core/feeds/types.d.ts +45 -0
- package/dist/core/feeds/types.d.ts.map +1 -0
- package/dist/core/feeds/types.js +2 -0
- package/dist/core/feeds/types.js.map +1 -0
- package/dist/core/filter.d.ts +25 -0
- package/dist/core/filter.d.ts.map +1 -0
- package/dist/core/filter.js +123 -0
- package/dist/core/filter.js.map +1 -0
- package/dist/core/injection-detector.d.ts +57 -0
- package/dist/core/injection-detector.d.ts.map +1 -0
- package/dist/core/injection-detector.js +109 -0
- package/dist/core/injection-detector.js.map +1 -0
- package/dist/core/items.d.ts +20 -0
- package/dist/core/items.d.ts.map +1 -0
- package/dist/core/items.js +105 -0
- package/dist/core/items.js.map +1 -0
- package/dist/core/state.d.ts +12 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +42 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/templates.d.ts +21 -0
- package/dist/core/templates.d.ts.map +1 -0
- package/dist/core/templates.js +52 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/core/watcher.d.ts +72 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +240 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/gemini-commands/dismiss.toml +2 -0
- package/dist/gemini-commands/research.toml +2 -0
- package/dist/gemini-commands/review.toml +2 -0
- package/dist/gemini-commands/update.toml +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/config.d.ts +39 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +23 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +6 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/item.d.ts +38 -0
- package/dist/schemas/item.d.ts.map +1 -0
- package/dist/schemas/item.js +34 -0
- package/dist/schemas/item.js.map +1 -0
- package/dist/schemas/research.d.ts +82 -0
- package/dist/schemas/research.d.ts.map +1 -0
- package/dist/schemas/research.js +45 -0
- package/dist/schemas/research.js.map +1 -0
- package/dist/schemas/source.d.ts +139 -0
- package/dist/schemas/source.d.ts.map +1 -0
- package/dist/schemas/source.js +127 -0
- package/dist/schemas/source.js.map +1 -0
- package/dist/schemas/state.d.ts +19 -0
- package/dist/schemas/state.d.ts.map +1 -0
- package/dist/schemas/state.js +12 -0
- package/dist/schemas/state.js.map +1 -0
- package/dist/skills/research/SKILL.md +156 -0
- package/dist/skills/review/SKILL.md +173 -0
- package/dist/skills/update/SKILL.md +200 -0
- package/dist/templates/agents/AGENTS.md +161 -0
- package/dist/templates/claude/CLAUDE.md +5 -0
- package/dist/templates/default.md +16 -0
- package/dist/templates/feedradar.md +165 -0
- package/dist/templates/routines/watch-daily.md +42 -0
- package/dist/templates/workflows/watch.yaml +70 -0
- package/package.json +73 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
このファイルは AI エージェント (Codex CLI / Gemini CLI / GitHub Copilot CLI など) が自動で読み込む、エージェント非依存の workspace 共通 instructions です。Claude Code は `CLAUDE.md` を別途参照しますが、`CLAUDE.md` から本ファイルを `@AGENTS.md` 等で取り込むのが業界標準パターンです。
|
|
4
|
+
|
|
5
|
+
## このディレクトリは何か
|
|
6
|
+
|
|
7
|
+
このディレクトリは [`radar`](https://github.com/ozzy-labs/feedradar) の **user workspace** です。`radar` は、ブログ・公式アップデート・リリースフィードを監視し、キーワードヒットを AI エージェントに渡して Markdown 調査レポートを生成する CLI ツールです。
|
|
8
|
+
|
|
9
|
+
このディレクトリには以下が含まれます:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
.
|
|
13
|
+
├── sources/ # 監視対象サイトの定義 (YAML)
|
|
14
|
+
├── state/ # 既読 ID / etag (差分検出用)
|
|
15
|
+
├── items/ # 検出された記事 (YAML)
|
|
16
|
+
├── research/ # 調査レポート (Markdown + frontmatter)
|
|
17
|
+
├── templates/ # Markdown テンプレート (編集可)
|
|
18
|
+
├── .agents/skills/ # 4 CLI 共通 engine SKILL (SSoT)
|
|
19
|
+
├── .claude/skills/ # Claude Code / Copilot CLI 用 slash-command 雛形
|
|
20
|
+
├── .gemini/commands/ # Gemini CLI 用 slash-command 定義 (TOML)
|
|
21
|
+
└── FEEDRADAR.md # 人間向け workspace ガイド (本 AGENTS.md とは別レイヤー)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## エージェントへの基本指示
|
|
25
|
+
|
|
26
|
+
ユーザーは「最新の Anthropic news を research して」「この item は不要だから dismiss」のような **自然言語** で依頼してきます。CLI コマンドを覚えて打つのはユーザーの責務ではありません。エージェントは以下のように振る舞ってください:
|
|
27
|
+
|
|
28
|
+
1. **自然言語の意図を slash command にマップする** — research / review / update / dismiss のいずれに該当するか判断する
|
|
29
|
+
2. **必要な引数 (item-id / research-id) を解決する** — ユーザーが正確な id を知らない場合、`items/` / `research/` を読んで該当するものを特定する
|
|
30
|
+
3. **slash command を実行する** — `/research <item-id>` 等を呼び、結果をユーザーに報告する
|
|
31
|
+
4. **複数候補がある場合は確認する** — 「直近の item」が複数あれば候補を提示してユーザーに選ばせる
|
|
32
|
+
|
|
33
|
+
slash command 経由で呼ぶことで、CLI 側の schema 検証 / status 遷移 / rollback がすべて効きます。直接 `items/*.yaml` を編集する等の low-level 操作は避け、必ず slash 経由で行ってください。
|
|
34
|
+
|
|
35
|
+
## 主要コマンド
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Workspace 初期化
|
|
39
|
+
radar init # 既定: CLAUDE.md + AGENTS.md + FEEDRADAR.md + skills + templates/default.md + dirs を生成
|
|
40
|
+
radar init --no-agents-md # AGENTS.md 生成を skip (CLAUDE.md も自動 skip)
|
|
41
|
+
radar init --no-claude-md # CLAUDE.md 生成を skip
|
|
42
|
+
radar init --no-feedradar-md # FEEDRADAR.md (人間向けガイド) 生成を skip
|
|
43
|
+
radar init --no-claude-skills # .claude/skills/ を skip
|
|
44
|
+
radar init --no-gemini-commands # .gemini/commands/ を skip
|
|
45
|
+
radar init --no-templates # templates/default.md 生成を skip
|
|
46
|
+
radar init --with-routines # claude/routines/watch-daily.md を生成
|
|
47
|
+
radar init --with-actions # .github/workflows/watch.yaml を生成
|
|
48
|
+
radar init --force # 既存ファイルを上書き
|
|
49
|
+
|
|
50
|
+
# 監視対象の管理
|
|
51
|
+
radar source add <id> --kind <rss|html|github-releases|npm-registry> --url <url> [options]
|
|
52
|
+
radar source list
|
|
53
|
+
radar source remove <id>
|
|
54
|
+
|
|
55
|
+
# 監視実行 (新着検出 → items/*.yaml に detected で書く)
|
|
56
|
+
radar watch run
|
|
57
|
+
|
|
58
|
+
# 検出済み item に対する操作
|
|
59
|
+
radar research <item-id> --agent <agent> # 調査レポートを生成 (status: detected -> researched)
|
|
60
|
+
radar review <research-id> --agent <agent> # 既存レポートをレビュー (status: researched -> reviewed)
|
|
61
|
+
radar update <research-id> --agent <agent> # v+1 を生成 (item status は変えない)
|
|
62
|
+
radar dismiss <item-id> # LLM 不要、item を dismissed に
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`<agent>` の値: `claude-code` / `codex-cli` / `gemini-cli` / `copilot`
|
|
66
|
+
|
|
67
|
+
## 利用可能な slash commands (4 agent 共通)
|
|
68
|
+
|
|
69
|
+
`init` 時に配置される薄い wrapper です。Claude Code / Copilot CLI / Gemini CLI / Codex CLI のいずれの interactive session でも呼べます (発火形式と読み取り経路は agent によって異なるが、最終的に同じ `radar <subcommand>` に解決されます):
|
|
70
|
+
|
|
71
|
+
| Slash | 動作 |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `/research <item-id> [--agent ...]` | `radar research` を呼ぶ |
|
|
74
|
+
| `/review <research-id> [--agent ...]` | `radar review` を呼ぶ |
|
|
75
|
+
| `/update <research-id> [--agent ...]` | `radar update` を呼ぶ |
|
|
76
|
+
| `/dismiss <item-id>` | `radar dismiss` を呼ぶ (LLM 不要) |
|
|
77
|
+
|
|
78
|
+
| Agent | 発火形式 | 読まれるファイル |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| Claude Code | `/research <id>` | `.claude/skills/research/SKILL.md` |
|
|
81
|
+
| Copilot CLI | `/research <id>` | `.github/skills/` / `.claude/skills/` / `.agents/skills/` (3 つすべて auto-read) |
|
|
82
|
+
| Gemini CLI | `/research <id>` | `.gemini/commands/research.toml` |
|
|
83
|
+
| Codex CLI | `$research` mention / `/skills` panel | `.agents/skills/research/SKILL.md` (dual-mode) |
|
|
84
|
+
|
|
85
|
+
procedure 本体は `.agents/skills/<name>/SKILL.md` (engine SKILL) を SSoT として参照します。
|
|
86
|
+
|
|
87
|
+
## 典型ワークフロー
|
|
88
|
+
|
|
89
|
+
**ユーザー対話中 (interactive、エージェント駆動):**
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
1. ユーザー: 「最新の Anthropic news で気になるやつ research して」
|
|
93
|
+
→ エージェント: items/ を読んで該当 item を選び、/research <item-id> を実行
|
|
94
|
+
|
|
95
|
+
2. ユーザー: 「いまのレポートを別エージェントでレビューしたい」
|
|
96
|
+
→ エージェント: 直前の research-id を覚えていれば /review <research-id> --agent <別 agent> を実行
|
|
97
|
+
覚えていなければ research/ から最新を特定
|
|
98
|
+
|
|
99
|
+
3. ユーザー: 「v1 が古いから update」
|
|
100
|
+
→ エージェント: /update <research-id> を実行 (新 _v2.md が生成される、v1 は immutable)
|
|
101
|
+
|
|
102
|
+
4. ユーザー: 「この item 不要」
|
|
103
|
+
→ エージェント: /dismiss <item-id> を実行
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**スケジュール実行 / CI (CLI 直叩き):**
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
radar watch run # 新着検出 (items/*.yaml に detected で書く)
|
|
110
|
+
radar research <item-id> # 自動 triage は推奨しない (ユーザー判断が必要)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`watch run` は cron / GitHub Actions / Claude Routines から呼ぶことを想定しています。`research` / `review` / `update` / `dismiss` は人間の判断が伴うため、interactive session 経由を推奨します。
|
|
114
|
+
|
|
115
|
+
## エージェント選択ガイド (cross-agent review)
|
|
116
|
+
|
|
117
|
+
[ADR-0001](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/0001-agent-adapter-interface.md) に基づき、`research` と `review` は **別の agent** で実行することを推奨します:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
radar research <item-id> --agent codex-cli
|
|
121
|
+
radar review <research-id> --agent claude-code
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
理由:
|
|
125
|
+
|
|
126
|
+
- 同一 agent の盲点 (特定情報源への依存、訓練データの偏り) を相互補正できる
|
|
127
|
+
- review が research を書いた agent と同じ「思い込み」を引きずらない
|
|
128
|
+
- 複数 plan を契約しているならリソースを分散できる
|
|
129
|
+
|
|
130
|
+
agent の選択は CLI が強制せず、ユーザー判断です。
|
|
131
|
+
|
|
132
|
+
## データ管理ポリシー
|
|
133
|
+
|
|
134
|
+
`sources/` `items/` `state/` `research/` `templates/` は **このディレクトリで git にコミットする** ことを推奨します。理由は以下:
|
|
135
|
+
|
|
136
|
+
- 定期実行 scheduler (Claude Routines / GitHub Actions) は実行ごとに fresh clone を行うため、`state/*.yaml` の `lastSeenIds` が引き継がれないと毎回全件再検出してしまう
|
|
137
|
+
- `research/` を git で管理すると、過去レポートの履歴・差分が追える (ADR-0003 で immutable history を採用)
|
|
138
|
+
- `items/` の status 遷移 (`detected` → `researched` → `reviewed`) も git 履歴に残る
|
|
139
|
+
|
|
140
|
+
`init` は `sources/` `items/` `state/` `research/` に `.gitkeep` placeholder を配置するため、初期状態 (中身が空) でも `git add .` でディレクトリ構造が消えずに追跡されます。
|
|
141
|
+
|
|
142
|
+
詳細は `radar` リポジトリの [`docs/user-guide.md`](https://github.com/ozzy-labs/feedradar/blob/main/docs/user-guide.md) を参照してください。
|
|
143
|
+
|
|
144
|
+
## セキュリティ警告 (untrusted external content)
|
|
145
|
+
|
|
146
|
+
`radar` が fetch する外部 feed (RSS / HTML / GitHub Releases / npm registry) のコンテンツは **untrusted** として扱われます ([ADR-0009](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/0009-untrusted-external-content-handling.md))。攻撃者が feed 内容に prompt injection を仕込む可能性があるため:
|
|
147
|
+
|
|
148
|
+
- agent に渡すコンテンツは boundary marker で囲まれ、procedure 本体と分離される
|
|
149
|
+
- `sources/<id>.yaml` の `trustLevel` で `"trusted" | "untrusted"` を per-source で指定可能 (既定 `"untrusted"`)
|
|
150
|
+
- agent 実行時、untrusted コンテンツ内の指示には従わないよう SKILL に指示が入っている
|
|
151
|
+
|
|
152
|
+
それでも、生成された `research/*.md` の内容は人間がレビューしてから運用判断に使うべきです。
|
|
153
|
+
|
|
154
|
+
## ドキュメント pointer
|
|
155
|
+
|
|
156
|
+
詳細・設計判断の根拠は `radar` リポジトリ配下の以下を参照:
|
|
157
|
+
|
|
158
|
+
- [`docs/user-guide.md`](https://github.com/ozzy-labs/feedradar/blob/main/docs/user-guide.md) — 全コマンドのリファレンス、scheduler 雛形、認証設定
|
|
159
|
+
- [`docs/architecture.md`](https://github.com/ozzy-labs/feedradar/blob/main/docs/architecture.md) — モジュール構成、データフロー、Phase 別スコープ
|
|
160
|
+
- [`docs/adr/`](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/README.md) — 設計判断の記録 (ADR-0001 ~ 0009)
|
|
161
|
+
- [`docs/design/`](https://github.com/ozzy-labs/feedradar/tree/main/docs/design) — `filter-spec.md` / `skill-design.md` / `threat-model.md`
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# FeedRadar workspace
|
|
2
|
+
|
|
3
|
+
このディレクトリは [`radar`](https://github.com/ozzy-labs/feedradar) でフィード監視 → AI エージェントによる調査レポート生成を回す **user workspace** です。本ドキュメントは workspace を init した人間向けの使い方ガイドで、`AGENTS.md` / `CLAUDE.md` (AI エージェント向け) とは別レイヤーです。
|
|
4
|
+
|
|
5
|
+
## 前提: エージェント駆動が第一級
|
|
6
|
+
|
|
7
|
+
FeedRadar は CLI ですが、**主要な使い方は AI エージェント (Claude Code / Codex CLI / Gemini CLI / GitHub Copilot CLI) に自然言語または slash command で頼む** スタイルです。CLI 直叩きはスケジュール実行や CI からの自動化用途で残されており、対話的な triage では基本使いません。
|
|
8
|
+
|
|
9
|
+
理由:
|
|
10
|
+
|
|
11
|
+
- triage は判断が伴うため、AI エージェントが item を読んで research / dismiss を選別できる方が自然
|
|
12
|
+
- 各エージェントの interactive session には `AGENTS.md` / `CLAUDE.md` 経由でこの workspace の文脈が自動投入されるため、ユーザーは「最新の Anthropic news を調べて」のような自然言語で頼める
|
|
13
|
+
- 同じ slash command が 4 agent 横断で動くため、エージェント切替コストが低い
|
|
14
|
+
|
|
15
|
+
## 1 分でセットアップ
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# (a) 監視対象を 1 つ追加 (例: Anthropic news の RSS)
|
|
19
|
+
radar source add anthropic-news --kind rss --url https://anthropic.com/news/rss.xml --keywords "Claude Code,agents"
|
|
20
|
+
|
|
21
|
+
# (b) 取得して新着 item を items/ に貯める
|
|
22
|
+
radar watch run
|
|
23
|
+
|
|
24
|
+
# (c) あとは AI エージェントに頼む (次セクション)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`source add` と `watch run` は scheduler 連携を想定して CLI のままです。`--with-actions` / `--with-routines` を付けて init すれば、GitHub Actions / Claude Routines で定期実行する雛形が出ます。
|
|
28
|
+
|
|
29
|
+
## 主要操作: エージェントに頼む
|
|
30
|
+
|
|
31
|
+
workspace ディレクトリで好きなエージェント CLI を起動して、interactive session 内で以下のどちらかで指示します。
|
|
32
|
+
|
|
33
|
+
### A. 自然言語で頼む (推奨)
|
|
34
|
+
|
|
35
|
+
エージェントは `AGENTS.md` / `CLAUDE.md` 経由で workspace の文脈を読んでいるので、以下のような曖昧な指示でも slash command に解決してくれます。
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
> 新着 item の中から Claude Code 関連を 1 件選んで research して
|
|
39
|
+
> 最新の research を別エージェントでレビューしたい
|
|
40
|
+
> v1 が古くなったので最新情報で update して
|
|
41
|
+
> この item は不要なので dismiss
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
エージェントが内部で `/research <item-id>` 等の slash command を呼び、結果をユーザーに報告します。`<item-id>` を覚える必要はありません。
|
|
45
|
+
|
|
46
|
+
### B. slash command を直接打つ
|
|
47
|
+
|
|
48
|
+
item-id / research-id が分かっているなら slash で直接呼べます。
|
|
49
|
+
|
|
50
|
+
| Slash | 役割 |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `/research <item-id> [--agent <id>] [--template <id>]` | 調査レポートを生成 (status: `detected → researched`) |
|
|
53
|
+
| `/review <research-id> [--agent <id>]` | 既存レポートに別エージェントのレビューを追記 (status: `researched → reviewed`) |
|
|
54
|
+
| `/update <research-id> [--agent <id>]` | 最新情報で `_v<N+1>.md` を生成 (旧版は immutable) |
|
|
55
|
+
| `/dismiss <item-id>` | 不要 item を `dismissed` 終端状態へ (LLM 不要) |
|
|
56
|
+
|
|
57
|
+
`<agent>` は `claude-code` / `codex-cli` / `gemini-cli` / `copilot` のいずれか。省略時は `radar.config.yaml` の `defaultResearchAgent` / `defaultReviewAgent`、未設定なら `claude-code`。
|
|
58
|
+
|
|
59
|
+
### エージェントごとの slash 発火形式
|
|
60
|
+
|
|
61
|
+
どのエージェントを起動しても、同じ slash が同じ CLI 動作に解決されます (発火形式と読み取り経路のみ違う)。
|
|
62
|
+
|
|
63
|
+
| Agent | 起動 | session 内 | 読まれるファイル |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| Claude Code | `claude` | `/research <item-id>` | `.claude/skills/research/SKILL.md` |
|
|
66
|
+
| Copilot CLI | `copilot` | `/research <item-id>` | `.claude/skills/` および `.agents/skills/` (両方読む) |
|
|
67
|
+
| Gemini CLI | `gemini` | `/research <item-id>` | `.gemini/commands/research.toml` |
|
|
68
|
+
| Codex CLI | `codex` | `$research` mention または `/skills` パネル | `.agents/skills/research/SKILL.md` (dual-mode) |
|
|
69
|
+
|
|
70
|
+
### 推奨: クロスエージェント運用
|
|
71
|
+
|
|
72
|
+
research と review は **別のエージェント** に頼むのが推奨です。自然言語で頼むなら:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
> 直近の item を copilot で research して、生成された report を claude にレビューさせて
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
slash で直接呼ぶなら:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# (interactive session 内)
|
|
82
|
+
/research <item-id> --agent copilot
|
|
83
|
+
/review <research-id> --agent claude-code
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
同一エージェントの盲点 (特定情報源への偏り、用語の取りこぼし) を相互補正できます。
|
|
87
|
+
|
|
88
|
+
## 典型ワークフロー
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
1. (scheduler または手動) radar watch run
|
|
92
|
+
→ items/ に新着が detected で書かれる
|
|
93
|
+
|
|
94
|
+
2. (エージェント interactive) 「新着 item から興味あるやつ research して」
|
|
95
|
+
→ /research <item-id> が走り、research/<YYYYMMDD>_<slug>_v1.md が生成される
|
|
96
|
+
→ items/.../*.yaml が researched に遷移
|
|
97
|
+
|
|
98
|
+
3. (エージェント interactive、別エージェントで) 「さっきの report をクロスレビューして」
|
|
99
|
+
→ /review <research-id> --agent <別エージェント> が走る
|
|
100
|
+
→ research file に「## レビュー」追記、frontmatter スタンプ
|
|
101
|
+
→ items/.../*.yaml が reviewed に遷移
|
|
102
|
+
|
|
103
|
+
4. (任意、時間が経って情報が更新されたら) 「最新で update して」
|
|
104
|
+
→ /update <research-id> が走り、_v2.md が生成される (v1 は immutable)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
不要な item は `/dismiss <item-id>` または「この item は不要」と自然言語で頼めば終端状態に遷移します。
|
|
108
|
+
|
|
109
|
+
## CLI ベース (スケジュール / CI 用)
|
|
110
|
+
|
|
111
|
+
エージェントを起動しない自動化文脈では CLI を直接呼びます。`radar <subcommand> --help` で全コマンドのヘルプが出ます。
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
radar source add <id> --kind <rss|html|github-releases|npm-registry> --url <url> [options]
|
|
115
|
+
radar source list
|
|
116
|
+
radar source remove <id>
|
|
117
|
+
radar watch run [--source <id>] [--bootstrap]
|
|
118
|
+
radar research <item-id> --agent <agent>
|
|
119
|
+
radar review <research-id> --agent <agent>
|
|
120
|
+
radar update <research-id> --agent <agent>
|
|
121
|
+
radar dismiss <item-id>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
定期実行の雛形 (GitHub Actions / Claude Routines) は `radar init --with-actions` / `--with-routines` で生成できます。
|
|
125
|
+
|
|
126
|
+
## このディレクトリのレイアウト
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
.
|
|
130
|
+
├── sources/ # 監視対象サイト定義 (YAML)
|
|
131
|
+
├── state/ # 既読 ID / etag (差分検出用)
|
|
132
|
+
├── items/ # 検出された記事 (YAML、status 管理)
|
|
133
|
+
├── research/ # 調査レポート (Markdown + frontmatter)
|
|
134
|
+
├── templates/ # Markdown テンプレート (編集可)
|
|
135
|
+
├── .agents/skills/ # 4 CLI 共通 engine SKILL (SSoT)
|
|
136
|
+
├── .claude/skills/ # Claude Code / Copilot CLI 用 slash-command 雛形
|
|
137
|
+
├── .gemini/commands/ # Gemini CLI 用 slash-command 定義 (TOML)
|
|
138
|
+
├── AGENTS.md # AI エージェント向け workspace instructions
|
|
139
|
+
├── CLAUDE.md # Claude Code 用 (@AGENTS.md を import)
|
|
140
|
+
└── FEEDRADAR.md # 本ファイル (人間向けガイド)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## データ管理ポリシー
|
|
144
|
+
|
|
145
|
+
`sources/` `items/` `state/` `research/` `templates/` は git にコミットすることを推奨します。理由:
|
|
146
|
+
|
|
147
|
+
- 定期実行 scheduler (Claude Routines / GitHub Actions) は実行ごとに fresh clone するため、`state/*.yaml` の `lastSeenIds` が引き継がれないと毎回全件再検出してしまう
|
|
148
|
+
- `research/` を git で管理すると過去レポートの履歴・差分が追える ([ADR-0003](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/0003-output-format-and-versioning.md))
|
|
149
|
+
- `items/` の status 遷移 (`detected → researched → reviewed`) も git 履歴に残る
|
|
150
|
+
|
|
151
|
+
`init` は `sources/` `items/` `state/` `research/` に `.gitkeep` を配置するため、`git add .` でディレクトリ構造を保てます。
|
|
152
|
+
|
|
153
|
+
## セキュリティ警告
|
|
154
|
+
|
|
155
|
+
FeedRadar が fetch する外部 feed (RSS / HTML / GitHub Releases / npm registry) は **untrusted** として扱われます ([ADR-0009](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/0009-untrusted-external-content-handling.md))。攻撃者が feed 内容に prompt injection を仕込む可能性があるため:
|
|
156
|
+
|
|
157
|
+
- 信頼できる公式 source のみ登録するのが第一の防御線
|
|
158
|
+
- `sources/<id>.yaml` の `trustLevel: trusted` で個別 opt-in 可 (既定 `untrusted`)
|
|
159
|
+
- 生成された `research/*.md` は人間がレビューしてから運用判断に使う
|
|
160
|
+
|
|
161
|
+
## さらに詳しく
|
|
162
|
+
|
|
163
|
+
- 全コマンド仕様: [`docs/user-guide.md`](https://github.com/ozzy-labs/feedradar/blob/main/docs/user-guide.md)
|
|
164
|
+
- 設計判断 (ADR): [`docs/adr/`](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/README.md)
|
|
165
|
+
- アーキテクチャ: [`docs/architecture.md`](https://github.com/ozzy-labs/feedradar/blob/main/docs/architecture.md)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: watch-daily
|
|
3
|
+
schedule: "0 0 * * *"
|
|
4
|
+
description: Run FeedRadar daily to detect new items across configured sources.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# watch-daily
|
|
8
|
+
|
|
9
|
+
Claude Routines が cron スケジュール (`schedule` frontmatter) で実行する routine 定義。
|
|
10
|
+
詳細は [ADR-0004 Schedule Strategy](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/0004-schedule-strategy.md) を参照。
|
|
11
|
+
|
|
12
|
+
## 前提
|
|
13
|
+
|
|
14
|
+
Routines はクラウド側 (Anthropic 管理 VM) で **fresh clone** されるため、`sources/` / `items/` / `state/` を含む workspace が **git にコミット済み**である必要がある:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
git add sources/ items/ state/ templates/
|
|
18
|
+
git commit -m "chore: add feedradar workspace"
|
|
19
|
+
git push
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
API キー (`ANTHROPIC_API_KEY` 等) は Routine 側の secret として登録する。OAuth トークン (`CLAUDE_CODE_OAUTH_TOKEN`) は **使わない** — Anthropic の利用ポリシー上、ordinary individual use の範囲外 (ADR-0004)。
|
|
23
|
+
|
|
24
|
+
## 手順
|
|
25
|
+
|
|
26
|
+
1. `radar watch run` を実行して新着 item を検出する
|
|
27
|
+
2. 変更があれば `items/` / `state/` を git commit して push する (次回 fresh clone で前回の `lastSeenIds` を引き継ぐため)
|
|
28
|
+
3. 検出件数 / エラー有無を簡潔に報告する
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
radar watch run
|
|
32
|
+
if ! git diff --quiet items/ state/; then
|
|
33
|
+
git add items/ state/
|
|
34
|
+
git commit -m "chore(watch): detected items $(date -u +%Y-%m-%d)"
|
|
35
|
+
git push
|
|
36
|
+
fi
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## スコープ外
|
|
40
|
+
|
|
41
|
+
- `research` / `review` / `update` の自動実行 — これらは人が triage する設計 (ADR-0004)
|
|
42
|
+
- LLM API キーの取り回し — Routine 側の secret 管理に従う
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# GitHub Actions scaffold generated by `radar init --with-actions`.
|
|
2
|
+
# Edit the cron schedule, sources, and commit message to match your workflow.
|
|
3
|
+
# Auth policy: API key only (ADR-0004). The Claude Code OAuth token is forbidden
|
|
4
|
+
# for unattended workflows per Anthropic's usage policy.
|
|
5
|
+
|
|
6
|
+
name: feedradar
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
schedule:
|
|
10
|
+
# Daily at 00:00 UTC. Adjust to your cadence.
|
|
11
|
+
- cron: "0 0 * * *"
|
|
12
|
+
workflow_dispatch: {}
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
# Required to commit detected items / state back to the workspace branch.
|
|
16
|
+
contents: write
|
|
17
|
+
|
|
18
|
+
concurrency:
|
|
19
|
+
group: feedradar-${{ github.ref }}
|
|
20
|
+
cancel-in-progress: false
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
watch:
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
timeout-minutes: 15
|
|
26
|
+
steps:
|
|
27
|
+
- name: Checkout workspace
|
|
28
|
+
uses: actions/checkout@v4
|
|
29
|
+
with:
|
|
30
|
+
# Need history so we can push commits back to the same branch.
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
# Use the GITHUB_TOKEN's identity when pushing — see "Commit state"
|
|
33
|
+
# step below.
|
|
34
|
+
persist-credentials: true
|
|
35
|
+
|
|
36
|
+
- name: Set up Node.js
|
|
37
|
+
uses: actions/setup-node@v4
|
|
38
|
+
with:
|
|
39
|
+
node-version: "22"
|
|
40
|
+
|
|
41
|
+
- name: Install FeedRadar
|
|
42
|
+
# Pin to a release once you've decided on a version; this scaffold
|
|
43
|
+
# installs the latest published build.
|
|
44
|
+
run: npm install -g @ozzylabs/feedradar
|
|
45
|
+
|
|
46
|
+
- name: Run watch
|
|
47
|
+
env:
|
|
48
|
+
# Authenticate against the Anthropic API per ADR-0004. Required for
|
|
49
|
+
# `research`/`review`/`update` follow-up commands, even though this
|
|
50
|
+
# workflow only invokes `watch run`.
|
|
51
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
52
|
+
# Raises GitHub REST API rate limit from 60 → 5000 req/h for the
|
|
53
|
+
# github-releases adapter (ADR-0002 / Phase 3).
|
|
54
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
55
|
+
run: radar watch run
|
|
56
|
+
|
|
57
|
+
- name: Commit state
|
|
58
|
+
# Persist updates to items/ and state/ so the next scheduled run can
|
|
59
|
+
# diff against the previous lastSeenIds. Routines / Actions both
|
|
60
|
+
# fresh-clone, so state must live in git.
|
|
61
|
+
run: |
|
|
62
|
+
if git diff --quiet items/ state/; then
|
|
63
|
+
echo "no changes detected; skipping commit"
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
git config user.name "github-actions[bot]"
|
|
67
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
68
|
+
git add items/ state/
|
|
69
|
+
git commit -m "chore(watch): detected items $(date -u +%Y-%m-%d)"
|
|
70
|
+
git push
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ozzylabs/feedradar",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Multi-agent CLI that watches blogs and release feeds, then turns keyword hits into Markdown research reports",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"dist/skills",
|
|
12
|
+
"LICENSE",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"bin": {
|
|
16
|
+
"radar": "dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc && pnpm run build:skills",
|
|
20
|
+
"build:skills": "node scripts/copy-skills.mjs",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"test:coverage": "vitest run --coverage",
|
|
26
|
+
"radar": "node dist/index.js",
|
|
27
|
+
"prepublishOnly": "pnpm run build && pnpm run typecheck && pnpm run test"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"fast-xml-parser": "^5.7.3",
|
|
31
|
+
"gray-matter": "^4.0.3",
|
|
32
|
+
"node-html-parser": "^7.1.0",
|
|
33
|
+
"yaml": "^2.8.4",
|
|
34
|
+
"zod": "^4.4.3"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^24.12.2",
|
|
38
|
+
"@vitest/coverage-v8": "^4.1.6",
|
|
39
|
+
"typescript": "^6.0.3",
|
|
40
|
+
"vitest": "^4.1.5"
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/ozzy-labs/feedradar.git"
|
|
46
|
+
},
|
|
47
|
+
"homepage": "https://github.com/ozzy-labs/feedradar#readme",
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/ozzy-labs/feedradar/issues"
|
|
50
|
+
},
|
|
51
|
+
"keywords": [
|
|
52
|
+
"feedradar",
|
|
53
|
+
"radar",
|
|
54
|
+
"feed",
|
|
55
|
+
"rss",
|
|
56
|
+
"release-notes",
|
|
57
|
+
"ai",
|
|
58
|
+
"ai-agents",
|
|
59
|
+
"agentic",
|
|
60
|
+
"claude-code",
|
|
61
|
+
"codex",
|
|
62
|
+
"gemini",
|
|
63
|
+
"copilot",
|
|
64
|
+
"cli",
|
|
65
|
+
"multi-agent",
|
|
66
|
+
"research",
|
|
67
|
+
"markdown"
|
|
68
|
+
],
|
|
69
|
+
"author": "ozzy-labs",
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=22"
|
|
72
|
+
}
|
|
73
|
+
}
|