tripwire は何をしますか?
Tripwire は、競合他社が重要なページを変更したときにそれを通知し、何をすべきかを提案します。
スキャナーは scripts/tripwire.py(Python 3.9 以降、pyyaml が必要、API キー不要)です。
すべてのデータは、現在のプロジェクト内のウォッチリスト watch/targets.yml の隣に保持されます。
watch/targets.yml 監視対象の設定
watch/snapshots/*.txt 各ページの最後に取得したテキスト
watch/data/changes.json すべての変更イベント(新しい順)
watch/data/status.json 最新スキャン時のページごとの状態
watch/reports/latest.md 最新のスキャンまたはダイジェストのマークダウンレポート
SKILL_DIR は、このファイルが存在するディレクトリを指します。
1. ウォッチリストが存在することを確認する
watch/targets.yml が存在しない場合は、python SKILL_DIR/scripts/tripwire.py init を実行し、ユーザーに監視する競合とページを尋ねてファイルに書き込みます。適切なページの例:ホームページ、料金ページ、変更履歴 / リリースノート、採用情報、「vs」や比較ページ。公式 URL を使用し、読み込めることを確認してください。
項目を追加または削除するには、watch/targets.yml を編集します(ページを一時停止するには enabled: false を設定します)。
2. データを取得する
ユーザーのリクエストに応じて、適切なコマンドを選択します。
| リクエスト内容 | コマンド |
|---|---|
| 「何が変わった?」/「スキャンを実行」(本日まだスキャンがない場合) | python SKILL_DIR/scripts/tripwire.py scan |
| 特定の競合のみ | python SKILL_DIR/scripts/tripwire.py scan --only "名称" |
| 「今週」/ ダイジェスト | python SKILL_DIR/scripts/tripwire.py report --days 7 |
| 「先月」 | python SKILL_DIR/scripts/tripwire.py report --days 30 |
リポジトリに本日のスキャンがすでにある場合(watch/data/status.json の last_run を確認)、スキャンをスキップしてレポートを読みます。初回スキャンではベースラインが記録されるだけです。その旨を伝え、変更は次回のスキャンから表示されることを説明します。
その後、watch/reports/latest.md(または出力されたレポート)を読みます。ハイライトする変更については、watch/data/changes.json の added / removed 行を確認し、正確に引用します。
3. GTM 読み上げレポートを作成する
ユーザーの言語で返信します。簡潔にし、重要なことから述べます。
- 主要な変更(最大5件、重要度順)。各項目:競合名、変更内容を平易な言葉で、具体的な詳細(旧価格 → 新価格、新機能名、新しい見出し)とともに。ページへのリンクを付けてください。
- なぜ重要か:各変更につき1行。料金とパッケージング > 新製品 / ローンチ > ポジショニング / 見出し > 採用シグナル > コピーの微調整。
- 何をすべきか:1~3個の具体的なアクション(バトルカードの更新、自社の価格ページで回答、営業に伝える、比較記事を公開する)。対応する価値がない場合は省略してください。
- カバレッジ:読み取れなかったページがあれば、1行で記載します。
ルール:
- 差分に表示されているもののみを報告します。意図を事実として推測せず、推測する場合は「おそらく」と述べてください。
- 回転するお客様の声、カウンター、日付、Cookie テキストはノイズとして扱い、報告しません。スキャンごとにページがノイズだらけの場合は、
watch/targets.ymlに無視する正規表現を追加する提案をしてください。 - 「変更なし」も有効な回答です。1行でその旨を述べ、カバレッジに触れてください。
読み取れないページの修正
HTTP Error 403:サイトがボットをブロックしています。同じ情報が掲載されている別の公式 URL(ドキュメントやヘルプセンターのページ、RSS フィード)を試してください。それもだめな場合は、理由をコメントに書いてenabled: falseに設定します。no readable text (JS-only page?):ページがブラウザでレンダリングされます。静的な代替ページ(/の代わりに/pricing、ブログフィード、サイトマップページ)を探してください。- URL が間違っている、または移動している:公式ページを見つけて
watch/targets.ymlを更新してください。