@ozzylabs/feedradar 0.1.5 → 0.1.7
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/README.md +1 -1
- package/dist/cli/dismiss.d.ts +2 -1
- package/dist/cli/dismiss.d.ts.map +1 -1
- package/dist/cli/dismiss.js +4 -1
- package/dist/cli/dismiss.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +7 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/items.d.ts +44 -0
- package/dist/cli/items.d.ts.map +1 -0
- package/dist/cli/items.js +288 -0
- package/dist/cli/items.js.map +1 -0
- package/dist/cli/research.d.ts +21 -0
- package/dist/cli/research.d.ts.map +1 -1
- package/dist/cli/research.js +54 -10
- package/dist/cli/research.js.map +1 -1
- package/dist/cli/review.d.ts +23 -0
- package/dist/cli/review.d.ts.map +1 -1
- package/dist/cli/review.js +293 -2
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/source.d.ts.map +1 -1
- package/dist/cli/source.js +3 -0
- package/dist/cli/source.js.map +1 -1
- package/dist/cli/triage.d.ts +136 -0
- package/dist/cli/triage.d.ts.map +1 -0
- package/dist/cli/triage.js +1110 -0
- package/dist/cli/triage.js.map +1 -0
- package/dist/cli/undismiss.d.ts +30 -0
- package/dist/cli/undismiss.d.ts.map +1 -0
- package/dist/cli/undismiss.js +133 -0
- package/dist/cli/undismiss.js.map +1 -0
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +2 -0
- package/dist/cli/watch.js.map +1 -1
- package/dist/cli/workflow/generate-combined-with-triage.d.ts +115 -0
- package/dist/cli/workflow/generate-combined-with-triage.d.ts.map +1 -0
- package/dist/cli/workflow/generate-combined-with-triage.js +446 -0
- package/dist/cli/workflow/generate-combined-with-triage.js.map +1 -0
- package/dist/cli/workflow.d.ts +6 -5
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +13 -8
- package/dist/cli/workflow.js.map +1 -1
- package/dist/core/feeds/json-api.d.ts +26 -0
- package/dist/core/feeds/json-api.d.ts.map +1 -1
- package/dist/core/feeds/json-api.js +360 -223
- package/dist/core/feeds/json-api.js.map +1 -1
- package/dist/core/recipes.d.ts.map +1 -1
- package/dist/core/recipes.js +10 -0
- package/dist/core/recipes.js.map +1 -1
- package/dist/core/transitions.d.ts +30 -0
- package/dist/core/transitions.d.ts.map +1 -0
- package/dist/core/transitions.js +103 -0
- package/dist/core/transitions.js.map +1 -0
- package/dist/core/triage/adapter.d.ts +80 -0
- package/dist/core/triage/adapter.d.ts.map +1 -0
- package/dist/core/triage/adapter.js +128 -0
- package/dist/core/triage/adapter.js.map +1 -0
- package/dist/core/triage/index.d.ts +105 -0
- package/dist/core/triage/index.d.ts.map +1 -0
- package/dist/core/triage/index.js +246 -0
- package/dist/core/triage/index.js.map +1 -0
- package/dist/core/triage/prompt.d.ts +30 -0
- package/dist/core/triage/prompt.d.ts.map +1 -0
- package/dist/core/triage/prompt.js +157 -0
- package/dist/core/triage/prompt.js.map +1 -0
- package/dist/core/triage/response.d.ts +114 -0
- package/dist/core/triage/response.d.ts.map +1 -0
- package/dist/core/triage/response.js +188 -0
- package/dist/core/triage/response.js.map +1 -0
- package/dist/recipes/aws-whats-new.yaml +62 -7
- package/dist/recipes/dev-to.yaml +24 -0
- package/dist/schemas/item.d.ts +151 -5
- package/dist/schemas/item.d.ts.map +1 -1
- package/dist/schemas/item.js +164 -4
- package/dist/schemas/item.js.map +1 -1
- package/dist/schemas/recipe.d.ts +22 -0
- package/dist/schemas/recipe.d.ts.map +1 -1
- package/dist/schemas/recipe.js +13 -1
- package/dist/schemas/recipe.js.map +1 -1
- package/dist/schemas/source.d.ts +135 -0
- package/dist/schemas/source.d.ts.map +1 -1
- package/dist/schemas/source.js +138 -0
- package/dist/schemas/source.js.map +1 -1
- package/dist/templates/agents/AGENTS.md +36 -4
- package/dist/templates/workflows/combined-with-triage.template.yaml.tmpl +133 -0
- package/package.json +1 -1
|
@@ -56,12 +56,13 @@ radar source test <id> [--limit N] [--show-content] # state/items を書き換
|
|
|
56
56
|
radar source remove <id>
|
|
57
57
|
|
|
58
58
|
# JSON API recipe を pagination 付きで追加(ADR-0012)
|
|
59
|
+
# `facets:` (年・カテゴリ単位の sweep) は flag では設定できず recipe のみ (ADR-0017)
|
|
59
60
|
radar source add aws-whats-new --kind json-api \
|
|
60
|
-
--url "https://aws.amazon.com/api/dirs/items/search?item.directoryId=whats-new&size=100&page=0" \
|
|
61
|
+
--url "https://aws.amazon.com/api/dirs/items/search?item.directoryId=whats-new-v2&size=100&page=0" \
|
|
61
62
|
--keywords "Bedrock,Claude" \
|
|
62
|
-
--pagination-strategy page --page-size 100 --max-pages
|
|
63
|
+
--pagination-strategy page --page-size 100 --max-pages 30
|
|
63
64
|
|
|
64
|
-
# 同じことを bundled recipe で 1 行で
|
|
65
|
+
# 同じことを bundled recipe で 1 行で (year facet sweep 付き、全 21,834 件カバー)
|
|
65
66
|
radar source add aws-watch --recipe aws-whats-new --keywords "Bedrock,Claude"
|
|
66
67
|
|
|
67
68
|
# JSON Feed (1.0 / 1.1) は URL のみで動く zero-config
|
|
@@ -73,7 +74,8 @@ radar source add example-microblog --kind json-feed \
|
|
|
73
74
|
radar watch run
|
|
74
75
|
|
|
75
76
|
# 過去全履歴の一括取り込み (kind: json-api / github-releases / npm-registry)
|
|
76
|
-
|
|
77
|
+
# AWS は recipe の facets.year + per-facet maxPages=30 で 21,834 件を完全カバー (ADR-0017)
|
|
78
|
+
radar watch run --source aws-whats-new --backfill
|
|
77
79
|
|
|
78
80
|
# 検出済み item に対する操作
|
|
79
81
|
radar research <item-id> --agent <agent> [--verbose] # 調査レポートを生成 (status: detected -> researched)。--verbose で agent stdout を直接見る (ADR-0015)
|
|
@@ -142,6 +144,36 @@ radar research <item-id> # 自動 triage は推奨しない (ユーザー
|
|
|
142
144
|
|
|
143
145
|
`watch run` は cron / GitHub Actions / Claude Routines から呼ぶことを想定しています。`research` / `review` / `update` / `dismiss` は人間の判断が伴うため、interactive session 経由を推奨します。
|
|
144
146
|
|
|
147
|
+
### scheduled triage workflow 例 (ADR-0018 §W5)
|
|
148
|
+
|
|
149
|
+
`triagePolicy:` を持つ source を登録済みの場合、scheduled GHA cron で `watch → triage → research → review` を**無人実行**できます。雛形は `radar workflow generate combined-with-triage` で生成:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
radar workflow generate combined-with-triage \
|
|
153
|
+
--watch-cron "0 6 * * *" \
|
|
154
|
+
--triage-agent gemini-cli \
|
|
155
|
+
--research-agent claude-code \
|
|
156
|
+
--review-agent codex-cli \
|
|
157
|
+
--max-items 10
|
|
158
|
+
# → .github/workflows/feedradar-daily.yaml
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
生成される workflow が 1 cron tick で走らせる 5 ステップ:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
1. radar watch run # 新着 → detected
|
|
165
|
+
2. radar triage --apply --triage-agent gemini-cli # detected → triaged_research / triaged_digest / triaged_unsure / dismissed
|
|
166
|
+
3. radar research --batch --status triaged_research \
|
|
167
|
+
--max-items 10 --agent claude-code # triaged_research → researched (1 item 1 report)
|
|
168
|
+
4. radar research --digest <ids per triage.group> \
|
|
169
|
+
--agent claude-code # triaged_digest → researched (group ごとに 1 report 集約)
|
|
170
|
+
5. radar review --batch --status researched --agent codex-cli # researched → reviewed (cross-agent)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
末尾には `triaged_unsure` キュー深度を Slack 通知する `if: always()` step と、`peter-evans/create-pull-request@v6` で `items/ state/ research/` を 1 PR にまとめる step が付く。**triage の cost は research に比べて 1-2 桁安い** (cheap-model channel、`gemini-2.5-flash-lite` 想定で月数千 item でも \$0.10 未満) ため、cost gating の主防御は引き続き `--max-items` (ADR-0014 D3a)。
|
|
174
|
+
|
|
175
|
+
詳細・secrets setup・policy 書き方・cost 試算・troubleshooting は `radar` リポジトリの [`docs/user-guide.md` §triage workflow](https://github.com/ozzy-labs/feedradar/blob/main/docs/user-guide.md#triage-workflow) を参照。
|
|
176
|
+
|
|
145
177
|
## エージェント選択ガイド (cross-agent review)
|
|
146
178
|
|
|
147
179
|
[ADR-0001](https://github.com/ozzy-labs/feedradar/blob/main/docs/adr/0001-agent-adapter-interface.md) に基づき、`research` と `review` は **別の agent** で実行することを推奨します:
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Generated by `radar workflow generate combined-with-triage` (ADR-0018 §W5).
|
|
2
|
+
# Chains watch run -> LLM triage -> capped research --batch -> per-group
|
|
3
|
+
# research --digest -> review --batch in one GitHub Actions job. The triage
|
|
4
|
+
# layer slashes detection volume to research-worthy items only, so the
|
|
5
|
+
# LoC-heavy research/review steps see ~5-15% of the raw detected count
|
|
6
|
+
# instead of the full firehose. Template placeholders / hard-cap rationale
|
|
7
|
+
# are documented in `src/cli/workflow/generate-combined-with-triage.ts`.
|
|
8
|
+
|
|
9
|
+
name: feedradar-daily
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
schedule:
|
|
13
|
+
- cron: "{{watchCron}}"
|
|
14
|
+
workflow_dispatch: {}
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write
|
|
18
|
+
pull-requests: write
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
# Distinct from feedradar-watch / feedradar-combined so this can co-exist
|
|
22
|
+
# with the simpler workflows on the same branch without serializing.
|
|
23
|
+
group: feedradar-daily-${{ github.ref }}
|
|
24
|
+
cancel-in-progress: false
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
daily:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
timeout-minutes: 45
|
|
30
|
+
env:
|
|
31
|
+
{{envBlock}}
|
|
32
|
+
steps:
|
|
33
|
+
- name: Checkout workspace
|
|
34
|
+
uses: actions/checkout@v4
|
|
35
|
+
with:
|
|
36
|
+
fetch-depth: 0
|
|
37
|
+
persist-credentials: true
|
|
38
|
+
|
|
39
|
+
- name: Set up Node.js
|
|
40
|
+
uses: actions/setup-node@v4
|
|
41
|
+
with:
|
|
42
|
+
node-version: "22.21"
|
|
43
|
+
|
|
44
|
+
- name: Install FeedRadar
|
|
45
|
+
run: npm install -g @ozzylabs/feedradar
|
|
46
|
+
|
|
47
|
+
- name: Run watch (detect new items)
|
|
48
|
+
run: radar watch run
|
|
49
|
+
|
|
50
|
+
- name: Triage detected items (agent={{triageAgent}})
|
|
51
|
+
# ADR-0018 §W3: per-source `triagePolicy:` drives the cheap-model
|
|
52
|
+
# classification. Items without a policy are skipped and remain in
|
|
53
|
+
# `detected` so the existing untriaged-feeds workflow still picks
|
|
54
|
+
# them up.
|
|
55
|
+
run: radar triage --apply --triage-agent {{triageAgent}}
|
|
56
|
+
|
|
57
|
+
- name: Research triaged_research items (capped at {{maxItems}}, agent={{researchAgent}})
|
|
58
|
+
# `--batch --status triaged_research` consumes only items the triage
|
|
59
|
+
# step promoted, leaving `triaged_digest` for the digest step and
|
|
60
|
+
# `triaged_unsure` for the human-review queue. The hard cap protects
|
|
61
|
+
# against a triage misfire that promotes everything.
|
|
62
|
+
run: radar research --batch --status triaged_research --max-items {{maxItems}} --agent {{researchAgent}}
|
|
63
|
+
|
|
64
|
+
- name: Research digest groups (one report per triage.group)
|
|
65
|
+
# `radar items list --triage-group <g>` returns every item the triage
|
|
66
|
+
# adapter tagged with the same group hint, which `radar research
|
|
67
|
+
# --digest` then collapses into a single combined report. We walk
|
|
68
|
+
# the unique groups one at a time so each digest stays self-contained.
|
|
69
|
+
# `sort -u` dedupes since `items list --field` emits one row per
|
|
70
|
+
# matching item.
|
|
71
|
+
run: |
|
|
72
|
+
set -euo pipefail
|
|
73
|
+
GROUPS=$(radar items list --status triaged_digest --field triage.group | sort -u | grep -v '^-$' || true)
|
|
74
|
+
if [ -z "$GROUPS" ]; then
|
|
75
|
+
echo "no triaged_digest groups to process"
|
|
76
|
+
exit 0
|
|
77
|
+
fi
|
|
78
|
+
while IFS= read -r GROUP; do
|
|
79
|
+
[ -z "$GROUP" ] && continue
|
|
80
|
+
echo "::group::digest for triage.group=$GROUP"
|
|
81
|
+
IDS=$(radar items list --triage-group "$GROUP" --status triaged_digest --field id | tr '\n' ' ')
|
|
82
|
+
# shellcheck disable=SC2086
|
|
83
|
+
radar research --digest $IDS --agent {{researchAgent}}
|
|
84
|
+
echo "::endgroup::"
|
|
85
|
+
done <<< "$GROUPS"
|
|
86
|
+
|
|
87
|
+
- name: Review researched items (agent={{reviewAgent}})
|
|
88
|
+
# Cross-agent review (ADR-0001): the review step intentionally uses
|
|
89
|
+
# a different agent than the research step so the reviewer does not
|
|
90
|
+
# inherit the same model's blind spots.
|
|
91
|
+
run: radar review --batch --status researched --agent {{reviewAgent}}
|
|
92
|
+
|
|
93
|
+
- name: Notify unsure queue
|
|
94
|
+
# `if: always()` so a triage spike still alerts even when a
|
|
95
|
+
# downstream research step failed. The Slack notification is
|
|
96
|
+
# opt-in via `--slack-webhook secrets.<NAME>`; an empty webhook
|
|
97
|
+
# collapses the curl branch into a no-op so the step still succeeds
|
|
98
|
+
# without leaking the alert.
|
|
99
|
+
if: always()
|
|
100
|
+
env:
|
|
101
|
+
SLACK_WEBHOOK_URL: {{slackWebhookExpr}}
|
|
102
|
+
run: |
|
|
103
|
+
set -euo pipefail
|
|
104
|
+
UNSURE=$(radar items list --status triaged_unsure --json | jq length)
|
|
105
|
+
echo "triaged_unsure queue depth: $UNSURE"
|
|
106
|
+
if [ "$UNSURE" -gt 0 ] && [ -n "${SLACK_WEBHOOK_URL:-}" ]; then
|
|
107
|
+
curl -X POST "$SLACK_WEBHOOK_URL" \
|
|
108
|
+
-H 'Content-Type: application/json' \
|
|
109
|
+
-d "{\"text\":\"feedradar: $UNSURE items need human triage review\"}"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
- name: Create PR with research output
|
|
113
|
+
# `peter-evans/create-pull-request@v6` stages items/ state/ research/
|
|
114
|
+
# into a single PR per cron tick. Human reviews the PR before
|
|
115
|
+
# research/ lands on main, giving an explicit gate on auto-generated
|
|
116
|
+
# content (ADR-0014 §X5 / ADR-0018 §W5).
|
|
117
|
+
uses: peter-evans/create-pull-request@v6
|
|
118
|
+
with:
|
|
119
|
+
commit-message: "chore(feedradar): daily watch + triage + research"
|
|
120
|
+
# peter-evans/create-pull-request does not run shell on these
|
|
121
|
+
# fields, so `$(date ...)` would land literally in the PR title.
|
|
122
|
+
# Use the `github.run_id` expression to keep titles unique per run.
|
|
123
|
+
title: "feedradar: daily triage + research (run ${{ github.run_id }})"
|
|
124
|
+
body: |
|
|
125
|
+
Automated feedradar pipeline output. Review the research/ Markdown
|
|
126
|
+
before merging — generated content is untrusted (ADR-0009).
|
|
127
|
+
branch: feedradar/daily
|
|
128
|
+
base: ${{ github.ref_name }}
|
|
129
|
+
delete-branch: true
|
|
130
|
+
add-paths: |
|
|
131
|
+
items/
|
|
132
|
+
state/
|
|
133
|
+
research/
|
package/package.json
CHANGED