@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.
Files changed (86) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/dismiss.d.ts +2 -1
  3. package/dist/cli/dismiss.d.ts.map +1 -1
  4. package/dist/cli/dismiss.js +4 -1
  5. package/dist/cli/dismiss.js.map +1 -1
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +7 -1
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/items.d.ts +44 -0
  10. package/dist/cli/items.d.ts.map +1 -0
  11. package/dist/cli/items.js +288 -0
  12. package/dist/cli/items.js.map +1 -0
  13. package/dist/cli/research.d.ts +21 -0
  14. package/dist/cli/research.d.ts.map +1 -1
  15. package/dist/cli/research.js +54 -10
  16. package/dist/cli/research.js.map +1 -1
  17. package/dist/cli/review.d.ts +23 -0
  18. package/dist/cli/review.d.ts.map +1 -1
  19. package/dist/cli/review.js +293 -2
  20. package/dist/cli/review.js.map +1 -1
  21. package/dist/cli/source.d.ts.map +1 -1
  22. package/dist/cli/source.js +3 -0
  23. package/dist/cli/source.js.map +1 -1
  24. package/dist/cli/triage.d.ts +136 -0
  25. package/dist/cli/triage.d.ts.map +1 -0
  26. package/dist/cli/triage.js +1110 -0
  27. package/dist/cli/triage.js.map +1 -0
  28. package/dist/cli/undismiss.d.ts +30 -0
  29. package/dist/cli/undismiss.d.ts.map +1 -0
  30. package/dist/cli/undismiss.js +133 -0
  31. package/dist/cli/undismiss.js.map +1 -0
  32. package/dist/cli/watch.d.ts.map +1 -1
  33. package/dist/cli/watch.js +2 -0
  34. package/dist/cli/watch.js.map +1 -1
  35. package/dist/cli/workflow/generate-combined-with-triage.d.ts +115 -0
  36. package/dist/cli/workflow/generate-combined-with-triage.d.ts.map +1 -0
  37. package/dist/cli/workflow/generate-combined-with-triage.js +446 -0
  38. package/dist/cli/workflow/generate-combined-with-triage.js.map +1 -0
  39. package/dist/cli/workflow.d.ts +6 -5
  40. package/dist/cli/workflow.d.ts.map +1 -1
  41. package/dist/cli/workflow.js +13 -8
  42. package/dist/cli/workflow.js.map +1 -1
  43. package/dist/core/feeds/json-api.d.ts +26 -0
  44. package/dist/core/feeds/json-api.d.ts.map +1 -1
  45. package/dist/core/feeds/json-api.js +360 -223
  46. package/dist/core/feeds/json-api.js.map +1 -1
  47. package/dist/core/recipes.d.ts.map +1 -1
  48. package/dist/core/recipes.js +10 -0
  49. package/dist/core/recipes.js.map +1 -1
  50. package/dist/core/transitions.d.ts +30 -0
  51. package/dist/core/transitions.d.ts.map +1 -0
  52. package/dist/core/transitions.js +103 -0
  53. package/dist/core/transitions.js.map +1 -0
  54. package/dist/core/triage/adapter.d.ts +80 -0
  55. package/dist/core/triage/adapter.d.ts.map +1 -0
  56. package/dist/core/triage/adapter.js +128 -0
  57. package/dist/core/triage/adapter.js.map +1 -0
  58. package/dist/core/triage/index.d.ts +105 -0
  59. package/dist/core/triage/index.d.ts.map +1 -0
  60. package/dist/core/triage/index.js +246 -0
  61. package/dist/core/triage/index.js.map +1 -0
  62. package/dist/core/triage/prompt.d.ts +30 -0
  63. package/dist/core/triage/prompt.d.ts.map +1 -0
  64. package/dist/core/triage/prompt.js +157 -0
  65. package/dist/core/triage/prompt.js.map +1 -0
  66. package/dist/core/triage/response.d.ts +114 -0
  67. package/dist/core/triage/response.d.ts.map +1 -0
  68. package/dist/core/triage/response.js +188 -0
  69. package/dist/core/triage/response.js.map +1 -0
  70. package/dist/recipes/aws-whats-new.yaml +62 -7
  71. package/dist/recipes/dev-to.yaml +24 -0
  72. package/dist/schemas/item.d.ts +151 -5
  73. package/dist/schemas/item.d.ts.map +1 -1
  74. package/dist/schemas/item.js +164 -4
  75. package/dist/schemas/item.js.map +1 -1
  76. package/dist/schemas/recipe.d.ts +22 -0
  77. package/dist/schemas/recipe.d.ts.map +1 -1
  78. package/dist/schemas/recipe.js +13 -1
  79. package/dist/schemas/recipe.js.map +1 -1
  80. package/dist/schemas/source.d.ts +135 -0
  81. package/dist/schemas/source.d.ts.map +1 -1
  82. package/dist/schemas/source.js +138 -0
  83. package/dist/schemas/source.js.map +1 -1
  84. package/dist/templates/agents/AGENTS.md +36 -4
  85. package/dist/templates/workflows/combined-with-triage.template.yaml.tmpl +133 -0
  86. 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 200
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
- radar watch run --source aws-whats-new --backfill --max-pages 200
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ozzylabs/feedradar",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Multi-agent CLI that watches blogs and release feeds, then turns keyword hits into Markdown research reports",
5
5
  "type": "module",
6
6
  "publishConfig": {