Agent Skills by ALSEL
汎用LLM・AI開発⭐ リポ 0品質スコア 65/100

repost-learnings

ペアごとの learnings.md ファイルの読み書きを行い、実行中のエージェントが時間をかけて組織知識を蓄積し、毎回同じプラットフォームの特性を再発見しなくて済むようにします。実行時、バックフィル時、またはペアに表示する際のリファレンスとして活用でき、保存する価値のある特性を発見したときにいつでも記録できます。

description の原文を見る

Read + write the per-pair learnings.md file so the running agent builds up institutional knowledge over time and doesn't re-figure the same platform quirks every run. Use as a reference when running, backfilling, or showing a pair — and whenever you discover a quirk worth saving.

SKILL.md 本文

Repost Learnings

エージェントは ~/.repost-with-agent/pairs/<id>/learnings.md にフリーフォーマットの Markdown ファイルを保持しており、複数の実行にわたってプラットフォームの癖、アカウント固有の落とし穴、および DOM の観察結果を蓄積します。これはプロジェクトの機関記憶ファイルであり、すべての実行はこれを最初に読み込み、終了時に追記します。

このファイルが存在する理由。 これがないと、定期実行するたびに同じ DOM の変更 / 短縮リダイレクト の癖 / レート制限パターンをゼロから解決し直すことになります。learnings ファイルは、エージェントがこの特定のペアを実行する際に時間をかけてスマートになるための方法です。(Ethan voice 6029、2026-05-01: 「エージェントが learnings.md ファイルを保持するように指示してください。それにより、奇妙な癖など、後続の処理がより速く進む可能性があります。毎回ゼロからそれを解決する必要がないようにします。」)

このスキルはリファレンスであり、トップレベルのスラッシュコマンドターゲットではありません。他のスキルからリンクされます。

ライフサイクル

  1. すべての実行の開始時 (repost-runrepost-backfill、スケジューラー生成のサブエージェント): ~/.repost-with-agent/pairs/<id>/learnings.md が存在する場合はそれを読み込みます。これを最初のコンテキストとして扱います。スクレイピングまたはコンポーズを開始する前に認識しておくべき癖です。最新のエントリの ### Selectors### Step playbook の小見出しを優先してください。プラットフォームの一般的な docs/destinations/<platform>.md のヒントにフォールバックする前に、それらを最初に正確に試してください。 キャッシュされたセレクターが失敗した場合(DOM が再度シフトした)、これ自体が更新された仕組みとともにこの実行の終わりに新しいエントリとして記録する価値があります。

  2. 実行中: 癖、落とし穴、または予期しない DOM / 動作が発生した場合、ドラフトメモ(推論内または一時変数内)として記録してください。可能であれば実行中にファイルに追記しないようにしてください。クラッシュでファイルが半分書き込まれたエントリで破損しないよう、終わりに書き込みをバッチ処理します。

  3. 実行終了時: learnings.md に新しく発見された癖をタイムスタンプ + 簡潔な説明とともに追記してください。安全のため Bash で >> を使用してください(追記のみ。既存エントリを書き直さないでください)。

  4. 古い学習の削除: 学習が新しい観察で矛盾する場合(例:「Bluesky のコンポーズボタンが右上に戻った」)、古いエントリを編集するのではなく新しいエントリを追記してください。ただし、新しいエントリの見出しで古いエントリを廃止済みとしてマークしてください。古いエントリの見出しを更新して [obsoleted YYYY-MM-DD] を追加してください。これは歴史的エントリに許可される唯一の編集です。履歴を削除せず、注釈を付けるだけです。

ファイル形式

プレーン Markdown。ファイルの最上部の見出しは # <pair-id> learnings です。各エントリは以下の形式の ## 見出しです:

## YYYY-MM-DD HH:MM — <1行サマリー>

<2~5 文の自由形式の文章:何を見たのか、なぜそれが重要なのか、
その影響。これを短く保ってください。実行可能な「次回これをやる」という
詳細は以下のオプション構造化セクションに含まれ、文章には含まれません。>

### Selectors  (オプション)
- <要素ラベル>: `<CSS セレクターまたはアクセシビリティパス>` (<プラットフォーム>, <フロー内の位置>)
- ...

### Step playbook  (オプション)
1. <上記のセレクターを使用した命令形のステップ>
2. ...

### Quirks  (オプション)
- <エッジケース、競合状態、または「X の場合はスキップ」の1行説明>
- ...

廃止されたエントリは見出しのサフィックスを取得します:

## 2026-04-15 09:30 — Bluesky のコンポーズボタンはサイドバーにある [obsoleted 2026-05-12]

文章段落は自由形式 Markdown のままです(インラインコード、箇条書き、小さなスニペットはすべて問題ありません)。3 つの ### 小見出しはオプションであり、関連がある場合にのみ追記されます。ただし、実行可能な仕組みをキャプチャするエントリについては強く推奨されます。次の実行に再発見する仕組みではなく、従うレシピを提供するためです。

構造化セクションが存在する理由

自由形式の文章はコンテキストに適しています(「LinkedIn がボタンを移動」)。仕組みには適していません(「次回使用する正確なセレクター + クリック順序はここ」)。それらを分離することで、将来の実行は grep + スキム で実行可能な部分を見つけることができ、すべての文章段落を読み直す必要がなくなります。(Ethan voice 6083、2026-05-01: 「再投稿用の指示、学習に追記するための指示で、セレクターなどを追加してください。そうすることで、次回に彼らがゼロから解決する必要があるステップを素早く簡単に従うことができるようになります。それは多くの時間を節約します。」)

セクション ガイダンス

  • ### Selectors — 要素ごとに 1 つの箇条書き。形式: `<ラベル>`: `<セレクター>` (<プラットフォーム>, <位置>)。現在のハーネス ブラウザオートメーションが再利用できるセレクター形式を使用してください(CSS、ARIA パス、テキストベースのロケーター)。わからない場合は、ARIA / ロールベースのセレクターを優先してください。見た目の再設計よりもクラスチェーンよりも優れています。

  • ### Step playbook — セレクターラベルで上記のセレクターを参照する(セレクター文字列を引用して繰り返さない)番号付き命令形ステップ。次の実行がプレイブックを上から下へ読み、ステップを正確に試し、ステップが失敗した場合のみプラットフォームの一般的な docs/destinations/<platform>.md にフォールバックします。

  • ### Quirks — ステップに合わないエッジケースの 1 行説明(「「Reposted by」ヘッダーを持つ再投稿をスキップ」、「モーダルは入力を受け入れる前に 200ms のスリープが必要な場合があります」、「60 番目のアイテムの過去をスクロールすると 'You're caught up' フッターがトリガーされます」)。次の実行が ガード する必要があるが、これは肯定的なステップではないことです。

内容がないセクションは省略してください。空の ### Selectors や「n/a」プレースホルダーを書かないでください。文章のみのエントリは有効です(例えば、実行可能なセレクターはまだない行動観察)。

記録するもの

保存してください (シグナル):

  • 永続的な DOM 変更。セレクターが移動した、ボタンが名前変更された、モーダルがオートフォーカスしなくなった。
  • このアカウントまたはプラットフォームに固有のページネーション癖。「LinkedIn の最近のアクティビティは~100 の履歴投稿に制限されています」、「X タイムラインはスクロール後 5 回目以降、画面外のツイートをアンマウントします」。
  • 短縮 / URL 拡張のエッジケース。「lnkd.in は時々ログインウォールにリダイレクトされます。その場合は canonicalUrl にフォールバックしてください」。
  • アカウント固有のパターン。「この LinkedIn アカウントはすべての再共有に自動的に #repost タグを付けます。X にミラーリングする前にそのタグを削除してください」。
  • レート制限のシグネチャ。「宛先はこのアカウントから 10 分以内に ~3 投稿後に 429-モーダルを返し始めます」。
  • 宛先デデュプの癖。「X の t.co 書き直しにより、プレフィックスによるデデュプが失敗します。URL は既に削除していますが、新しい短縮子ドメインに注意してください」。
  • プラットフォームごとのタイミング。「LinkedIn 共有モーダルは最初の keydown 後に追加入力を受け入れる前に 800ms が必要です」。

保存しないでください (ノイズ):

  • 再試行で解決した 1 回限りの一時的なエラー(net::ERR_TIMEOUT、ランダムな 503s)。
  • docs/destinations/<platform>.md に既に記載されているもの。それはプラットフォームのデフォルトです。learnings ファイルはデフォルトから デルタ です。
  • 一般的な「実行は成功しました」という概要。監査ログが既にそれをカバーしています。
  • 再現可能である 75% 以上確実ではないもの。1 回限りの可能性がある場合は除外してください。後で再度見かけたら追加できます。
  • シークレット、トークン、クッキー、セッションデータ。決してしてください。ファイルは 0644 です。

良いエントリの例(3 つすべての構造化セクション付き)

## 2026-05-12 14:22 — LinkedIn の最近のアクティビティページネーション上限が~60 に低下

バックフィル実行が `/recent-activity/all/` の終わりに達しました。~60 の投稿がロードされた後(ドキュメントでは~100 だった)。8 回スクロールして、より多くの投稿ではなく「You're caught up」フッターを取得しました。おそらく LinkedIn 側の変更です。フッターをハードストップとして扱い、再試行ではなく `pair.fetch.exhausted` を出力します。

### Selectors
- Profile feed list: `main ul.feed-shared-update-list` (linkedin, source scrape)
- Each post item: `ul.feed-shared-update-list > li` (linkedin, source scrape)
- Post permalink anchor: `a.update-components-actor__meta-link[href*="/feed/update/"]` (linkedin, per-post)
- Reposted-by header (skip these): `[data-test-reshared-mini-update-v2-header]` (linkedin, per-post)
- "You're caught up" footer: `div[data-finite-scroll-hotkey-context="FEED"] >> text="You're all caught up"` (linkedin, end-of-feed marker)
- Compose modal textbox: `div[role="textbox"][contenteditable="true"]` (linkedin, share modal)
- Compose modal Post button: `button.share-actions__primary-action` (linkedin, share modal)

### Step playbook
1. `<source.url>``/in/<handle>/recent-activity/all/`)に移動します。
2. `Profile feed list` がレンダリングされるまで待機します。
3. フィードコンテナを 1 回スクロールして、新しいアイテムがマウントされるまで 600ms 待機します。
4. 見える `Each post item` ごと:
   - `Reposted-by header` が含まれている場合、スキップしてください(他のユーザーのコンテンツを再投稿しないでください)。
   - それ以外の場合、`Post permalink anchor``href`(正規 URL)と投稿本文を抽出します。
5. 次のいずれかまで繰り返しスクロールします:(a) ≥ `--max` 個の重複しない候補がある、または (b) `"You're caught up" footer` が表示される。これはハードストップです。
6. 収集した候補を `posted.jsonl`(ローカルデデュプ)に対してフィルタリングします。

### Quirks
- LinkedIn はフィードを積極的に仮想化します。スクロール時に投稿をスクレイプし、ロードされたすべての投稿が DOM に留まることに依存しないでください。
- 投稿本文の `lnkd.in` 短縮子は公開前に `repost-url-expand` で展開する必要がありますが、スクレイプ中はそのままにしておきます(スクレイプ中に解決しないでください)。
- バックフィル `--max` ~60 以上は、フッターが表示されるとサイレント停止します。フェッチループはそれを失敗ではなく疲弊として扱うべきです。

トップの文章がコンテキストを提供します。セレクターは次の実行に既製のリファレンスを提供します。プレイブックは次の実行が正確に従うことができるレシピを提供します。quirks ブロックはステップに合わないエッジケースを表示します。

このエントリは意図的にセレクター(docs/destinations/linkedin.md にもある)の一部の素材を複製することに注意してください。これは大丈夫です。ペアごとのファイルは競合で勝ちます(最新の観察動作を反映します)。セレクターをペアごとに 1 つの grep 可能な場所に持つことで、次の実行が 2 つのファイルを相互参照することを強制するのは良くありません。

悪いエントリの例(これらのようなエントリを書かないでください)

ハートビート(ゼロシグナル)

## 2026-05-12 14:25 — 実行は機能しました

実行は成功しました。LinkedIn から X に 1 つのアイテムを投稿しました。Telegram が確認しました。奇妙なことは起きませんでした。

なぜそれが悪いのか:ゼロシグナル。監査ログは既に pair.publish.success + pair.publish.notify.success を記録しています。将来の実行はこのエントリを読むことで何も得られません。

実行可能な仕組みのない曖昧な文章

## 2026-05-12 14:25 — LinkedIn は今日遅かった

コンポーズモーダルが開くのに時間がかかりました。最終的には機能しました。

なぜそれが悪いのか:セレクター、タイミング番号、ステップはありません。次の実行は「しばらく」では何もできません。問題が再現可能な場合、エントリは遅かったセレクター、観察されたおおよその遅延を特定し、そこにスリープを追加する ### Step playbook ステップを追加すべきです。

実行が無事に終わった場合は、何も書かないでください。ファイルは実行可能なデルタ用であり、ハートビート用ではありません。セレクター / ステッププレイブック / または鋭く説明された quirks を持たないエントリは、純粋なハートビートではない場合でもそれでも低値と見なされます:自由形式の「ページが奇妙だった」という文章はそれです。避けようとしています。実行可能な詳細をピンダウンするか、エントリをスキップしてください。

追記スニペット(Bash)

最小限(文章のみのエントリ):

PAIR_ID="<id>"
LEARNINGS="$HOME/.repost-with-agent/pairs/$PAIR_ID/learnings.md"
TS="$(date -u +'%Y-%m-%d %H:%M')"
SUMMARY="<1行サマリー>"
{
  printf '\n## %s — %s\n\n' "$TS" "$SUMMARY"
  printf '%s\n' "<2~5文の文章。>"
} >> "$LEARNINGS"

完全版(構造化セクション付き。エントリに実行可能な仕組みがある場合は推奨):

PAIR_ID="<id>"
LEARNINGS="$HOME/.repost-with-agent/pairs/$PAIR_ID/learnings.md"
TS="$(date -u +'%Y-%m-%d %H:%M')"
SUMMARY="<1行サマリー>"
{
  printf '\n## %s — %s\n\n' "$TS" "$SUMMARY"
  printf '%s\n\n' "<2~5文の文章:何を見たのか、なぜそれが重要なのか、その影響。>"

  printf '### Selectors\n'
  printf -- '- <ラベル>: `<セレクター>` (<プラットフォーム>, <位置>)\n'
  printf -- '- ...\n\n'

  printf '### Step playbook\n'
  printf '1. <上記のセレクターを使用した命令形のステップ>\n'
  printf '2. ...\n\n'

  printf '### Quirks\n'
  printf -- '- <1行のエッジケース>\n'
} >> "$LEARNINGS"

内容がないブロックはすべて省略してください。空で書くのではなく。

常に >> を使用してください。ファイルを書き直さないでください。歴史的エントリへの許可される唯一の編集は、見出しの末尾に [obsoleted YYYY-MM-DD] を追記することです。その場合でも、ファイルの書き直しではなく、ターゲットの Edit 呼び出しであるべきです。

以前のエントリを廃止する

新しい観察が古いものと矛盾する場合:

  1. 古いエントリの見出しを見つけます。
  2. Edit ツールを使用して、見出しの末尾に [obsoleted YYYY-MM-DD] を追加します。本文を触らないでください。
  3. 新しい観察を説明する新しいエントリを下部に追記してください。本文内で古いエントリの日付を言及してください(2026-04-15 エントリに代わります。)。

これにより、クリーンな監査証跡が保たれます。将来のエージェントは、最新の状態だけでなく、プラットフォーム動作がいつ変わったかを確認できます。

初期プレースホルダー

ペアにまだ学習がない場合でも、ファイルは実行するたびにエージェントが存在をテストする必要がないようにプレースホルダーとして存在するべきです:

# <pair-id> learnings

_記録された学習はまだありません。エージェントは実行中に癖を発見すると、エントリを追記します。_

正規形式については templates/learnings.md.template を参照してください。

関連項目

  • skills/repost-run/SKILL.md — learnings を読み込み、書き込むシングルポストフロー。
  • skills/repost-backfill/SKILL.md — learnings をバッチ処理するマルチポストフロー。
  • skills/repost-pair-show/SKILL.md — ペア出力で最近の learnings を表示します。
  • skills/repost-history/SKILL.md — オプションの learnings テール。
  • docs/state-files.md — 正式なステートファイル スキーマ(learnings.md が含まれています)。
  • templates/learnings.md.template — プレースホルダー形式。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
EthanSK
リポジトリ
EthanSK/Repost-with-agent
ライセンス
MIT
最終更新
2026/5/9

Source: https://github.com/EthanSK/Repost-with-agent / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: EthanSK · EthanSK/Repost-with-agent · ライセンス: MIT