@ozzylabs/feedradar 0.2.0 → 0.2.2
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.ja.md +51 -13
- package/README.md +51 -13
- package/dist/agents/_boundary.d.ts +21 -0
- package/dist/agents/_boundary.d.ts.map +1 -1
- package/dist/agents/_boundary.js +34 -0
- package/dist/agents/_boundary.js.map +1 -1
- package/dist/agents/claude-code.d.ts.map +1 -1
- package/dist/agents/claude-code.js +14 -6
- package/dist/agents/claude-code.js.map +1 -1
- package/dist/agents/codex-cli.d.ts.map +1 -1
- package/dist/agents/codex-cli.js +13 -7
- package/dist/agents/codex-cli.js.map +1 -1
- package/dist/agents/copilot.d.ts.map +1 -1
- package/dist/agents/copilot.js +13 -6
- package/dist/agents/copilot.js.map +1 -1
- package/dist/agents/gemini-cli.d.ts.map +1 -1
- package/dist/agents/gemini-cli.js +13 -6
- package/dist/agents/gemini-cli.js.map +1 -1
- package/dist/agents/types.d.ts +26 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/claude-skills/dismiss/SKILL.md +4 -4
- package/dist/claude-skills/research/SKILL.md +2 -3
- package/dist/claude-skills/review/SKILL.md +2 -2
- package/dist/claude-skills/update/SKILL.md +7 -7
- package/dist/cli/_locale.d.ts +96 -0
- package/dist/cli/_locale.d.ts.map +1 -0
- package/dist/cli/_locale.js +130 -0
- package/dist/cli/_locale.js.map +1 -0
- package/dist/cli/_progress.d.ts +30 -1
- package/dist/cli/_progress.d.ts.map +1 -1
- package/dist/cli/_progress.js +9 -1
- package/dist/cli/_progress.js.map +1 -1
- package/dist/cli/dismiss.d.ts.map +1 -1
- package/dist/cli/dismiss.js +61 -54
- package/dist/cli/dismiss.js.map +1 -1
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +91 -60
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +36 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +79 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +15 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +149 -51
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/items.d.ts.map +1 -1
- package/dist/cli/items.js +51 -30
- package/dist/cli/items.js.map +1 -1
- package/dist/cli/research.d.ts.map +1 -1
- package/dist/cli/research.js +138 -109
- package/dist/cli/research.js.map +1 -1
- package/dist/cli/review.d.ts.map +1 -1
- package/dist/cli/review.js +114 -92
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/routine/fire.d.ts +3 -2
- package/dist/cli/routine/fire.d.ts.map +1 -1
- package/dist/cli/routine/fire.js +30 -25
- package/dist/cli/routine/fire.js.map +1 -1
- package/dist/cli/routine/generate-pipeline.d.ts +70 -1
- package/dist/cli/routine/generate-pipeline.d.ts.map +1 -1
- package/dist/cli/routine/generate-pipeline.js +273 -44
- package/dist/cli/routine/generate-pipeline.js.map +1 -1
- package/dist/cli/routine/generate-watch.d.ts +10 -1
- package/dist/cli/routine/generate-watch.d.ts.map +1 -1
- package/dist/cli/routine/generate-watch.js +49 -37
- package/dist/cli/routine/generate-watch.js.map +1 -1
- package/dist/cli/routine.d.ts.map +1 -1
- package/dist/cli/routine.js +28 -24
- package/dist/cli/routine.js.map +1 -1
- package/dist/cli/source.d.ts.map +1 -1
- package/dist/cli/source.js +206 -182
- package/dist/cli/source.js.map +1 -1
- package/dist/cli/triage.d.ts.map +1 -1
- package/dist/cli/triage.js +146 -130
- package/dist/cli/triage.js.map +1 -1
- package/dist/cli/undismiss.d.ts.map +1 -1
- package/dist/cli/undismiss.js +32 -25
- package/dist/cli/undismiss.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +77 -61
- package/dist/cli/update.js.map +1 -1
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +71 -31
- package/dist/cli/watch.js.map +1 -1
- package/dist/cli/workflow/generate-combined-with-triage.d.ts +9 -2
- package/dist/cli/workflow/generate-combined-with-triage.d.ts.map +1 -1
- package/dist/cli/workflow/generate-combined-with-triage.js +120 -71
- package/dist/cli/workflow/generate-combined-with-triage.js.map +1 -1
- package/dist/cli/workflow/generate-combined.d.ts +8 -1
- package/dist/cli/workflow/generate-combined.d.ts.map +1 -1
- package/dist/cli/workflow/generate-combined.js +39 -33
- package/dist/cli/workflow/generate-combined.js.map +1 -1
- package/dist/cli/workflow/generate-watch.d.ts +10 -1
- package/dist/cli/workflow/generate-watch.d.ts.map +1 -1
- package/dist/cli/workflow/generate-watch.js +37 -30
- package/dist/cli/workflow/generate-watch.js.map +1 -1
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +28 -23
- package/dist/cli/workflow.js.map +1 -1
- package/dist/core/config.d.ts +2 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +14 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/feeds/html-js.d.ts.map +1 -1
- package/dist/core/feeds/html-js.js +16 -9
- package/dist/core/feeds/html-js.js.map +1 -1
- package/dist/core/feeds/types.d.ts +9 -0
- package/dist/core/feeds/types.d.ts.map +1 -1
- package/dist/core/locale.d.ts +69 -0
- package/dist/core/locale.d.ts.map +1 -0
- package/dist/core/locale.js +74 -0
- package/dist/core/locale.js.map +1 -0
- package/dist/core/watcher.d.ts +11 -0
- package/dist/core/watcher.d.ts.map +1 -1
- package/dist/core/watcher.js +21 -5
- package/dist/core/watcher.js.map +1 -1
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +49 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/messages/en.d.ts +993 -0
- package/dist/i18n/messages/en.d.ts.map +1 -0
- package/dist/i18n/messages/en.js +1096 -0
- package/dist/i18n/messages/en.js.map +1 -0
- package/dist/i18n/messages/ja.d.ts +13 -0
- package/dist/i18n/messages/ja.d.ts.map +1 -0
- package/dist/i18n/messages/ja.js +970 -0
- package/dist/i18n/messages/ja.js.map +1 -0
- package/dist/schemas/config.d.ts +7 -0
- package/dist/schemas/config.d.ts.map +1 -1
- package/dist/schemas/config.js +5 -0
- package/dist/schemas/config.js.map +1 -1
- package/dist/schemas/recipe.d.ts +1 -1
- package/dist/schemas/source.d.ts +3 -3
- package/dist/skills/research/SKILL.md +13 -12
- package/dist/skills/review/SKILL.md +13 -12
- package/dist/skills/update/SKILL.md +19 -19
- package/dist/templates/en/agents/AGENTS.md +284 -0
- package/dist/templates/en/claude/CLAUDE.md +5 -0
- package/dist/templates/en/default.md +16 -0
- package/dist/templates/en/digest.md +66 -0
- package/dist/templates/en/feedradar.md +235 -0
- package/dist/templates/{routines → en/routines}/pipeline.yaml.tmpl +30 -41
- package/dist/templates/{routines → en/routines}/watch-daily.yaml +12 -15
- package/dist/templates/{routines → en/routines}/watch.yaml.tmpl +11 -14
- package/dist/templates/{workflows → en/workflows}/combined-with-triage.template.yaml.tmpl +3 -3
- package/dist/templates/{workflows → en/workflows}/combined.template.yaml.tmpl +6 -6
- package/dist/templates/{workflows → en/workflows}/watch.template.yaml.tmpl +8 -8
- package/dist/templates/{workflows → en/workflows}/watch.yaml +3 -3
- package/dist/templates/{agents → ja/agents}/AGENTS.md +16 -16
- package/dist/templates/{digest.md → ja/digest.md} +5 -6
- package/dist/templates/{feedradar.md → ja/feedradar.md} +12 -12
- package/dist/templates/ja/routines/pipeline.yaml.tmpl +211 -0
- package/dist/templates/ja/routines/watch-daily.yaml +151 -0
- package/dist/templates/ja/routines/watch.yaml.tmpl +145 -0
- package/dist/templates/ja/workflows/combined-with-triage.template.yaml.tmpl +123 -0
- package/dist/templates/ja/workflows/combined.template.yaml.tmpl +109 -0
- package/dist/templates/ja/workflows/watch.template.yaml.tmpl +100 -0
- package/dist/templates/ja/workflows/watch.yaml +73 -0
- package/package.json +1 -1
- /package/dist/templates/{claude → ja/claude}/CLAUDE.md +0 -0
- /package/dist/templates/{default.md → ja/default.md} +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# `radar workflow generate combined-with-triage` が生成。
|
|
2
|
+
# watch run -> LLM triage -> キャップ付き research --batch -> グループ別
|
|
3
|
+
# research --digest -> review --batch を 1 つの GitHub Actions ジョブで連結する。
|
|
4
|
+
# triage 層が検出量をリサーチ価値のあるアイテムだけに絞り込むため、LoC を多く消費する
|
|
5
|
+
# research/review ステップは生の検出件数の約 5〜15% だけを見ることになり、全量を浴びずに済む。
|
|
6
|
+
# テンプレートのプレースホルダ / ハードキャップの根拠は
|
|
7
|
+
# `src/cli/workflow/generate-combined-with-triage.ts` に記載。
|
|
8
|
+
#
|
|
9
|
+
# 最終ステップは `--output-mode`(デフォルト `pr`)からレンダリングされる:
|
|
10
|
+
# pr — peter-evans/create-pull-request@v6(research/ がデフォルトブランチに
|
|
11
|
+
# 入る前に人間が PR をレビューする)。
|
|
12
|
+
# direct-commit — デフォルトブランチへ直接 commit & push(PR ゲートなし。
|
|
13
|
+
# `permissions:` から `pull-requests: write` を外す)。このモードを
|
|
14
|
+
# 使うときはデフォルトブランチに PR 必須の branch protection を
|
|
15
|
+
# 設定しないこと — bot が直接 push する。
|
|
16
|
+
|
|
17
|
+
name: feedradar-daily
|
|
18
|
+
|
|
19
|
+
on:
|
|
20
|
+
schedule:
|
|
21
|
+
- cron: "{{watchCron}}"
|
|
22
|
+
workflow_dispatch: {}
|
|
23
|
+
|
|
24
|
+
{{permissionsBlock}}
|
|
25
|
+
|
|
26
|
+
concurrency:
|
|
27
|
+
# feedradar-watch / feedradar-combined とは別にすることで、同じブランチ上で
|
|
28
|
+
# 直列化せずによりシンプルなワークフローと共存できる。
|
|
29
|
+
group: feedradar-daily-${{ github.ref }}
|
|
30
|
+
cancel-in-progress: false
|
|
31
|
+
|
|
32
|
+
jobs:
|
|
33
|
+
daily:
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
timeout-minutes: 45
|
|
36
|
+
env:
|
|
37
|
+
{{envBlock}}
|
|
38
|
+
steps:
|
|
39
|
+
- name: ワークスペースをチェックアウト
|
|
40
|
+
uses: actions/checkout@v4
|
|
41
|
+
with:
|
|
42
|
+
fetch-depth: 0
|
|
43
|
+
persist-credentials: true
|
|
44
|
+
|
|
45
|
+
- name: Node.js をセットアップ
|
|
46
|
+
uses: actions/setup-node@v4
|
|
47
|
+
with:
|
|
48
|
+
node-version: "22.21"
|
|
49
|
+
|
|
50
|
+
- name: FeedRadar をインストール
|
|
51
|
+
run: npm install -g @ozzylabs/feedradar
|
|
52
|
+
|
|
53
|
+
- name: watch を実行(新規アイテムを検出)
|
|
54
|
+
run: radar watch run
|
|
55
|
+
|
|
56
|
+
- name: 検出アイテムを triage(agent={{triageAgent}})
|
|
57
|
+
# source ごとの `triagePolicy:` が安価なモデルでの分類を駆動する。
|
|
58
|
+
# ポリシーのないアイテムはスキップされ `detected` のまま残るので、既存の
|
|
59
|
+
# 未 triage フィード向けワークフローが引き続き拾う。
|
|
60
|
+
run: radar triage --apply --triage-agent {{triageAgent}}
|
|
61
|
+
|
|
62
|
+
- name: triaged_research のアイテムを research(最大 {{maxItems}} 件, agent={{researchAgent}})
|
|
63
|
+
# `--batch --status triaged_research` は triage ステップが昇格させたアイテムだけを
|
|
64
|
+
# 消費し、`triaged_digest` は digest ステップに、`triaged_unsure` は人間レビューの
|
|
65
|
+
# キューに残す。ハードキャップは全件昇格してしまう triage の誤射から守る。
|
|
66
|
+
run: radar research --batch --status triaged_research --max-items {{maxItems}} --agent {{researchAgent}}
|
|
67
|
+
|
|
68
|
+
- name: digest グループを research(triage.group ごとに 1 レポート)
|
|
69
|
+
# `radar items list --triage-group <g>` は triage アダプタが同じグループヒントを
|
|
70
|
+
# 付けた全アイテムを返し、それを `radar research --digest` が単一の統合レポートに
|
|
71
|
+
# まとめる。各 digest が自己完結するよう、ユニークなグループを 1 つずつ走査する。
|
|
72
|
+
# `items list --field` は一致アイテムごとに 1 行を出すため、`sort -u` で重複排除する。
|
|
73
|
+
run: |
|
|
74
|
+
set -euo pipefail
|
|
75
|
+
# `mapfile` はグループ一覧を配列に読み込み、各要素が単一かつ適切にクォートされた
|
|
76
|
+
# トークンになるようにする。以前のコマンド置換によるスカラ代入は、下のループが
|
|
77
|
+
# 配列のように扱った時点で actionlint/shellcheck の SC2128(添字なしで配列を展開)/
|
|
78
|
+
# SC2178(同じ名前をスカラと配列の両方で再利用)に引っかかっていた。パイプラインは
|
|
79
|
+
# 引き続き重複排除し、ungrouped アイテムに `--field` が出す `-` センチネルを落とす。
|
|
80
|
+
#
|
|
81
|
+
# 注意: この配列は `GROUPS` という名前にしない — それは bash の特殊配列
|
|
82
|
+
# (呼び出し側のグループ ID)であり、その予約名にグループ一覧を読み込むと
|
|
83
|
+
# `set -e` 下で即座に失敗する。予約されていない名前を使う。
|
|
84
|
+
mapfile -t DIGEST_GROUPS < <(radar items list --status triaged_digest --field triage.group | sort -u | grep -v '^-$' || true)
|
|
85
|
+
if [ "${#DIGEST_GROUPS[@]}" -eq 0 ]; then
|
|
86
|
+
echo "no triaged_digest groups to process"
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
for GROUP in "${DIGEST_GROUPS[@]}"; do
|
|
90
|
+
[ -z "$GROUP" ] && continue
|
|
91
|
+
echo "::group::digest for triage.group=$GROUP"
|
|
92
|
+
IDS=$(radar items list --triage-group "$GROUP" --status triaged_digest --field id | tr '\n' ' ')
|
|
93
|
+
# `--triage-group "$GROUP"` は digest ファイルをグループ名にちなんで命名するため、
|
|
94
|
+
# 単一キーワード source の同日 2 グループが `<date>_digest_<slug>_v1.md` で衝突
|
|
95
|
+
# しなくなる(#255)。
|
|
96
|
+
# shellcheck disable=SC2086
|
|
97
|
+
radar research --digest $IDS --triage-group "$GROUP" --agent {{researchAgent}}
|
|
98
|
+
echo "::endgroup::"
|
|
99
|
+
done
|
|
100
|
+
|
|
101
|
+
- name: research 済みアイテムを review(agent={{reviewAgent}})
|
|
102
|
+
# クロスエージェントレビュー: review ステップは意図的に research ステップとは
|
|
103
|
+
# 異なるエージェントを使い、レビュアーが同じモデルの盲点を引き継がないようにする。
|
|
104
|
+
run: radar review --batch --status researched --agent {{reviewAgent}}
|
|
105
|
+
|
|
106
|
+
- name: unsure キューを通知
|
|
107
|
+
# `if: always()` により、下流の research ステップが失敗しても triage スパイクは
|
|
108
|
+
# 通知される。Slack 通知は `--slack-webhook secrets.<NAME>` でオプトイン。空の
|
|
109
|
+
# webhook では curl 分岐が no-op に縮むため、アラートを漏らさずステップは成功する。
|
|
110
|
+
if: always()
|
|
111
|
+
env:
|
|
112
|
+
SLACK_WEBHOOK_URL: {{slackWebhookExpr}}
|
|
113
|
+
run: |
|
|
114
|
+
set -euo pipefail
|
|
115
|
+
UNSURE=$(radar items list --status triaged_unsure --json | jq length)
|
|
116
|
+
echo "triaged_unsure queue depth: $UNSURE"
|
|
117
|
+
if [ "$UNSURE" -gt 0 ] && [ -n "${SLACK_WEBHOOK_URL:-}" ]; then
|
|
118
|
+
curl -X POST "$SLACK_WEBHOOK_URL" \
|
|
119
|
+
-H 'Content-Type: application/json' \
|
|
120
|
+
-d "{\"text\":\"feedradar: $UNSURE items need human triage review\"}"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
{{finalStep}}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# `radar workflow generate combined` テンプレート。
|
|
2
|
+
#
|
|
3
|
+
# `radar watch run` -> 「新規アイテムがなければスキップ」ガード -> `radar research
|
|
4
|
+
# --batch` -> `git commit/push --rebase` リトライを単一ジョブ内で連結し、検出から
|
|
5
|
+
# リサーチまでの遅延を 2 つに分かれたワークフローではなく cron 1 ティックに収める。
|
|
6
|
+
#
|
|
7
|
+
# `src/cli/workflow/generate-combined.ts` が差し込むプレースホルダ:
|
|
8
|
+
# {{cron}} — スケジュールの cron 式(デフォルト "0 0 * * *")
|
|
9
|
+
# {{maxItems}} — `--max-items` のハードキャップ(デフォルト 10)
|
|
10
|
+
# {{filterTags}} — `--filter-tags` 引数を単一の CLI リテラルとして(フィルタが
|
|
11
|
+
# 無効なときは空になり、行は素の `--batch` に縮む)
|
|
12
|
+
# {{agent}} — エージェント ID リテラル(claude-code|codex-cli|gemini-cli|copilot)
|
|
13
|
+
# {{secretsBlock}} — エージェント固有の `env:` 本体(共通デフォルトはなく、CLI
|
|
14
|
+
# ジェネレータが 4 種のプリビルト断片から 1 つを選ぶ。OAuth
|
|
15
|
+
# トークンは決して注入しない)
|
|
16
|
+
#
|
|
17
|
+
# ハードキャップの根拠: この YAML は `--max-items {{maxItems}}` をリテラルで埋め込み、
|
|
18
|
+
# ワークフローを監査すれば CLI ソースを読み直さずともキャップが分かるようにしている。
|
|
19
|
+
# CLI 側もキャップを再強制する(`src/cli/research.ts` の
|
|
20
|
+
# `RESEARCH_BATCH_DEFAULT_MAX_ITEMS`)ため、手で編集した YAML でも 1 回の呼び出し内で
|
|
21
|
+
# 超過できない(多層防御: YAML リテラル + CLI デフォルト)。
|
|
22
|
+
|
|
23
|
+
name: feedradar-combined
|
|
24
|
+
|
|
25
|
+
on:
|
|
26
|
+
schedule:
|
|
27
|
+
- cron: "{{cron}}"
|
|
28
|
+
workflow_dispatch: {}
|
|
29
|
+
|
|
30
|
+
permissions:
|
|
31
|
+
contents: write
|
|
32
|
+
|
|
33
|
+
concurrency:
|
|
34
|
+
# 種別スコープの concurrency グループ。watch のみと combined のワークフローは
|
|
35
|
+
# 互いを直列化してはならない(cadence もスコープも異なる)ため、種別ごとに
|
|
36
|
+
# 独自の `feedradar-<type>-${{ github.ref }}` グループを持つ。
|
|
37
|
+
group: feedradar-combined-${{ github.ref }}
|
|
38
|
+
cancel-in-progress: false
|
|
39
|
+
|
|
40
|
+
jobs:
|
|
41
|
+
combined:
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
timeout-minutes: 30
|
|
44
|
+
steps:
|
|
45
|
+
- name: ワークスペースをチェックアウト
|
|
46
|
+
uses: actions/checkout@v4
|
|
47
|
+
with:
|
|
48
|
+
fetch-depth: 0
|
|
49
|
+
persist-credentials: true
|
|
50
|
+
|
|
51
|
+
- name: Node.js をセットアップ
|
|
52
|
+
uses: actions/setup-node@v4
|
|
53
|
+
with:
|
|
54
|
+
node-version: "22.21"
|
|
55
|
+
|
|
56
|
+
- name: FeedRadar をインストール
|
|
57
|
+
run: npm install -g @ozzylabs/feedradar
|
|
58
|
+
|
|
59
|
+
- name: watch を実行
|
|
60
|
+
env:
|
|
61
|
+
{{secretsBlock}}
|
|
62
|
+
run: radar watch run
|
|
63
|
+
|
|
64
|
+
- name: 新規アイテムがなければ research をスキップ
|
|
65
|
+
id: detect_changes
|
|
66
|
+
# `watch run` が新規アイテムを生まなかったときは research ステップを
|
|
67
|
+
# まるごとスキップする。さもないと、暴走検出キャップがあっても空のキューに対して
|
|
68
|
+
# 丸ごと 1 回の `radar research --batch` 呼び出し(テンプレ読み込み・アイテム走査)を
|
|
69
|
+
# 消費してしまう。
|
|
70
|
+
run: |
|
|
71
|
+
if [ -z "$(git status --porcelain items/)" ]; then
|
|
72
|
+
echo "no new items in items/; skipping research step"
|
|
73
|
+
echo "has_changes=false" >> "$GITHUB_OUTPUT"
|
|
74
|
+
else
|
|
75
|
+
echo "has_changes=true" >> "$GITHUB_OUTPUT"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
- name: 検出したアイテムを research(最大 {{maxItems}} 件, agent={{agent}})
|
|
79
|
+
if: steps.detect_changes.outputs.has_changes == 'true'
|
|
80
|
+
env:
|
|
81
|
+
{{secretsBlock}}
|
|
82
|
+
# `--batch` は items/ を status=detected で走査し、filter-tags の許可リストを
|
|
83
|
+
# 適用し、`--max-items` 件のレポートを書き終えたら停止する。CLI 側もキャップを
|
|
84
|
+
# 再強制するため、手で編集した YAML でも超過できない。
|
|
85
|
+
run: radar research --batch --status detected --max-items {{maxItems}}{{filterTags}} --agent {{agent}}
|
|
86
|
+
|
|
87
|
+
- name: リトライ付きでコミットして push
|
|
88
|
+
if: steps.detect_changes.outputs.has_changes == 'true'
|
|
89
|
+
# 失敗のあいだに `git pull --rebase --autostash` を挟む 3 回試行 push。
|
|
90
|
+
# items/ / state/ / research/ を奪い合う 2 つの並行 feedradar ワークフロー
|
|
91
|
+
# (例: watch-hourly + combined-weekly)向けに調整している。
|
|
92
|
+
run: |
|
|
93
|
+
git config user.name "feedradar-bot"
|
|
94
|
+
git config user.email "feedradar-bot@users.noreply.github.com"
|
|
95
|
+
git add items/ state/ research/
|
|
96
|
+
if git diff --cached --quiet; then
|
|
97
|
+
echo "nothing staged; exiting cleanly"
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
git commit -m "chore(feedradar): combined watch + research $(date -u +%Y-%m-%d)"
|
|
101
|
+
for attempt in 1 2 3; do
|
|
102
|
+
if git push origin "${GITHUB_REF_NAME}"; then
|
|
103
|
+
exit 0
|
|
104
|
+
fi
|
|
105
|
+
echo "push failed (attempt ${attempt}/3), rebasing..."
|
|
106
|
+
git pull --rebase --autostash origin "${GITHUB_REF_NAME}"
|
|
107
|
+
done
|
|
108
|
+
echo "push failed after 3 attempts" >&2
|
|
109
|
+
exit 1
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# `radar workflow generate watch` が生成する GitHub Actions の雛形。
|
|
2
|
+
# cron スケジュール・sources・コミットメッセージは自分のワークフローに合わせて編集する。
|
|
3
|
+
# 認証ポリシー: API キーのみ。Claude Code の OAuth トークンは
|
|
4
|
+
# Anthropic の利用規約により無人ワークフローでは禁止。
|
|
5
|
+
#
|
|
6
|
+
# このテンプレートはプレースホルダ駆動で、init 後に再生成するための変種。
|
|
7
|
+
# `src/templates/en/workflows/watch.yaml`(init --with-actions が初回ブートストラップで
|
|
8
|
+
# 出力するもの)は後方互換のため別に保持している。違いは次のとおり:
|
|
9
|
+
#
|
|
10
|
+
# - cron スケジュール・出力先・エージェントの secret 名は、書き込み前に
|
|
11
|
+
# `generate-watch.ts` が CLI フラグから差し込む。
|
|
12
|
+
# - `concurrency.group` を `feedradar-watch-` にスコープし、複数のワークフロー種別
|
|
13
|
+
# (watch / combined)が互いをキャンセルせず並走できるようにしている。下記の
|
|
14
|
+
# rebase リトライと組み合わせて push 衝突を緩和する。
|
|
15
|
+
# - `Commit and push with retry` ステップは、並行 cron による push を吸収するため
|
|
16
|
+
# 最大 3 回まで `git pull --rebase` をリトライする。
|
|
17
|
+
|
|
18
|
+
name: feedradar-watch
|
|
19
|
+
|
|
20
|
+
on:
|
|
21
|
+
schedule:
|
|
22
|
+
- cron: "{{cron}}"
|
|
23
|
+
workflow_dispatch: {}
|
|
24
|
+
|
|
25
|
+
permissions:
|
|
26
|
+
# 検出したアイテム / state をワークスペースのブランチへコミットするのに必要。
|
|
27
|
+
contents: write
|
|
28
|
+
|
|
29
|
+
concurrency:
|
|
30
|
+
# 種別ごとのグループ。`watch` と `combined` のワークフローが互いをキャンセルしない。
|
|
31
|
+
# 同一種別の並行実行はこのグループで直列化される。
|
|
32
|
+
group: feedradar-watch-${{ github.ref }}
|
|
33
|
+
cancel-in-progress: false
|
|
34
|
+
|
|
35
|
+
jobs:
|
|
36
|
+
watch:
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
timeout-minutes: 15
|
|
39
|
+
steps:
|
|
40
|
+
- name: ワークスペースをチェックアウト
|
|
41
|
+
uses: actions/checkout@v4
|
|
42
|
+
with:
|
|
43
|
+
# 並行 push の上に rebase できるよう履歴が必要。
|
|
44
|
+
fetch-depth: 0
|
|
45
|
+
persist-credentials: true
|
|
46
|
+
|
|
47
|
+
- name: Node.js をセットアップ
|
|
48
|
+
uses: actions/setup-node@v4
|
|
49
|
+
with:
|
|
50
|
+
# radar が HTTPS_PROXY / HTTP_PROXY を自動検出して --use-env-proxy で
|
|
51
|
+
# 再起動するには Node 22.21+(または 24.5+)が必要。
|
|
52
|
+
node-version: "22.21"
|
|
53
|
+
|
|
54
|
+
- name: FeedRadar をインストール
|
|
55
|
+
# バージョンを決めたらリリースに固定する。この雛形では
|
|
56
|
+
# 最新の公開ビルドをインストールする。
|
|
57
|
+
run: npm install -g @ozzylabs/feedradar
|
|
58
|
+
|
|
59
|
+
- name: watch を実行
|
|
60
|
+
env:
|
|
61
|
+
# エージェント API に対して認証する(API キーのみ、OAuth は使わない)。
|
|
62
|
+
# 下記の secret 名はエージェント別の規約に従う。追加すべき正確な
|
|
63
|
+
# secret 名は生成後の標準出力を参照。
|
|
64
|
+
{{agentEnvKey}}: ${{ secrets.{{agentEnvKey}} }}
|
|
65
|
+
# github-releases アダプタの GitHub REST API レート上限を
|
|
66
|
+
# 60 → 5000 req/h に引き上げる。
|
|
67
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
68
|
+
run: radar watch run
|
|
69
|
+
|
|
70
|
+
- name: リトライ付きでコミットして push
|
|
71
|
+
# items/ と state/ の更新を永続化し、次回の定期実行が前回の
|
|
72
|
+
# lastSeenIds と差分を取れるようにする。Routines / Actions はどちらも
|
|
73
|
+
# 毎回クリーンに clone するため、state は git に置く必要がある。
|
|
74
|
+
#
|
|
75
|
+
# push 衝突の緩和: 別のワークフロー(例: combined.yaml)が並行して
|
|
76
|
+
# push すると `git push` が non-fast-forward で失敗する。各試行で
|
|
77
|
+
# rebase しながら最大 3 回リトライする。autostash により index 外の
|
|
78
|
+
# bot 側変更も rebase をまたいで保全される。4 回以上は構造的な問題
|
|
79
|
+
# (branch protection・トークン障害・本当のマージ衝突)を示すため、
|
|
80
|
+
# それ以上リトライせず即座に失敗させる。
|
|
81
|
+
run: |
|
|
82
|
+
set -euo pipefail
|
|
83
|
+
git config user.name "github-actions[bot]"
|
|
84
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
85
|
+
if git diff --quiet items/ state/; then
|
|
86
|
+
echo "no changes detected; skipping commit"
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
git add items/ state/
|
|
90
|
+
git commit -m "chore(watch): detected items $(date -u +%Y-%m-%d)"
|
|
91
|
+
for attempt in 1 2 3; do
|
|
92
|
+
if git push origin "${GITHUB_REF_NAME}"; then
|
|
93
|
+
echo "push succeeded on attempt ${attempt}"
|
|
94
|
+
exit 0
|
|
95
|
+
fi
|
|
96
|
+
echo "push failed (attempt ${attempt}/3), rebasing..."
|
|
97
|
+
git pull --rebase --autostash origin "${GITHUB_REF_NAME}"
|
|
98
|
+
done
|
|
99
|
+
echo "push failed after 3 attempts" >&2
|
|
100
|
+
exit 1
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# `radar init --with-actions` が生成する GitHub Actions の雛形。
|
|
2
|
+
# cron スケジュール・sources・コミットメッセージは自分のワークフローに合わせて編集する。
|
|
3
|
+
# 認証ポリシー: API キーのみ。Claude Code の OAuth トークンは
|
|
4
|
+
# Anthropic の利用規約により無人ワークフローでは禁止。
|
|
5
|
+
|
|
6
|
+
name: feedradar
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
schedule:
|
|
10
|
+
# 毎日 00:00 UTC。自分のペースに合わせて調整する。
|
|
11
|
+
- cron: "0 0 * * *"
|
|
12
|
+
workflow_dispatch: {}
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
# 検出したアイテム / state をワークスペースのブランチへコミットするのに必要。
|
|
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: ワークスペースをチェックアウト
|
|
28
|
+
uses: actions/checkout@v4
|
|
29
|
+
with:
|
|
30
|
+
# 同じブランチへコミットを push し戻せるよう履歴が必要。
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
# push 時に GITHUB_TOKEN の identity を使う — 下記の
|
|
33
|
+
# "Commit state" ステップを参照。
|
|
34
|
+
persist-credentials: true
|
|
35
|
+
|
|
36
|
+
- name: Node.js をセットアップ
|
|
37
|
+
uses: actions/setup-node@v4
|
|
38
|
+
with:
|
|
39
|
+
# radar が HTTPS_PROXY / HTTP_PROXY を自動検出して --use-env-proxy で
|
|
40
|
+
# 再起動するには Node 22.21+(または 24.5+)が必要。
|
|
41
|
+
# 古い 22.x はこのフラグを欠くため、HTTPS_PROXY を設定しても
|
|
42
|
+
# `radar` は proxy サポートなしで動作してしまう。
|
|
43
|
+
node-version: "22.21"
|
|
44
|
+
|
|
45
|
+
- name: FeedRadar をインストール
|
|
46
|
+
# バージョンを決めたらリリースに固定する。この雛形では
|
|
47
|
+
# 最新の公開ビルドをインストールする。
|
|
48
|
+
run: npm install -g @ozzylabs/feedradar
|
|
49
|
+
|
|
50
|
+
- name: watch を実行
|
|
51
|
+
env:
|
|
52
|
+
# Anthropic API に対して認証する。このワークフローは `watch run` しか
|
|
53
|
+
# 呼ばないが、後続の `research`/`review`/`update` コマンドに必要。
|
|
54
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
55
|
+
# github-releases アダプタの GitHub REST API レート上限を
|
|
56
|
+
# 60 → 5000 req/h に引き上げる。
|
|
57
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
58
|
+
run: radar watch run
|
|
59
|
+
|
|
60
|
+
- name: state をコミット
|
|
61
|
+
# items/ と state/ の更新を永続化し、次回の定期実行が前回の
|
|
62
|
+
# lastSeenIds と差分を取れるようにする。Routines / Actions はどちらも
|
|
63
|
+
# 毎回クリーンに clone するため、state は git に置く必要がある。
|
|
64
|
+
run: |
|
|
65
|
+
if git diff --quiet items/ state/; then
|
|
66
|
+
echo "no changes detected; skipping commit"
|
|
67
|
+
exit 0
|
|
68
|
+
fi
|
|
69
|
+
git config user.name "github-actions[bot]"
|
|
70
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
71
|
+
git add items/ state/
|
|
72
|
+
git commit -m "chore(watch): detected items $(date -u +%Y-%m-%d)"
|
|
73
|
+
git push
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|