mcpField
F
felo-twitter-writer

felo-twitter-writer

github.com/felo-incマーケティング・グロース25065 回インストール14 週間前に更新
リポジトリ

felo-twitter-writer について

felo-twitter-writerは、Twitter/Xの文体分析やツイート、スレッド、長文投稿の作成に使うスキルです。Felo SuperAgentで生成し、抽出した文体DNAやスタイルライブラリの項目を反映できます。

主な機能

  1. 01Twitter/Xアカウントの文体分析
  2. 02文体DNAの抽出
  3. 03ツイートとスレッドの作成
  4. 04X長文投稿の作成
  5. 05スタイルライブラリから選択

活用シーン

  1. 01アカウントの投稿傾向を分析
  2. 02指定された文体DNAで投稿を下書き
  3. 03複数投稿のスレッドを作成
  4. 04X向け長文記事を執筆

MCP 対応

このスキルはコンテンツ生成にFelo SuperAgentを呼び出します。入力にはMCPインターフェースの説明はありません。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/felo-inc/felo-skills --skill felo-twitter-writer

インストール後、Claude Code で/felo-twitter-writerを入力して読み込まれたか確認します。

同梱ファイルclawhub.jsonREADME.md

詳細

Felo Twitter Writer スキル

制約(最初に必ずお読みください)

これらのルールは必須です。いずれかに違反すると、誤った動作につながります。

  1. このスキルは SuperAgent を直接使用します。 すべての生成は felo-superAgent/scripts/run_superagent.mjs に --skill-id twitter-writer を指定して行います。ツイートの内容を自分で生成しようとしないでください。

  2. SuperAgent を呼び出すときは、必ず --json フラグを使用してください。 Claude Code の Bash ツールでは、標準出力は常にキャプチャされ、ユーザーに直接ストリーミングされることはありません。JSON モードでは、構造化されたレスポンスで回答全体が返されます。スクリプトの実行後、JSON 出力から data.answer を読み取り、そのままレスポンステキストとして出力してください。

  3. data.answer は必ずそのまま出力してください。 スクリプトの実行後、data.answer を一字一句変えずにレスポンステキストとして出力してください。要約、言い換え、補足説明の追加はしないでください。

  4. すべての SuperAgent 呼び出しで --live-doc-id は必須です。 以下のルールを厳守してください。

    • このセッションですでに利用可能な live_doc_id があれば再利用します(以前の SuperAgent または livedoc の呼び出しから取得したもの)。
    • なければ、node felo-livedoc/scripts/run_livedoc.mjs list --json を実行し、data.items の中から 最初に見つかった is_shared === false の項目を選びます(リストは更新日時の降順で並んでいるため、これが最も最近更新された非公開 LiveDoc です)。その short_id を使用します。
    • is_shared === false の項目がない場合(またはリストが空の場合)は、node felo-livedoc/scripts/run_livedoc.mjs create --name "Twitter Writer" --json を実行し、data.short_id を使用します。
    • is_shared === true の LiveDoc は絶対に使用しないでください。 共有 LiveDoc は別のプロジェクトに属しており、502 エラーの原因になります。
  5. 状態は必ず保持してください。 SuperAgent を呼び出すたびに、JSON レスポンスの data.thread_short_id と data.live_doc_short_id から thread_short_id と live_doc_short_id を取得し、以降の呼び出しで使用してください。

  6. 出力言語はユーザーの入力言語に合わせてください。 デフォルトは en です。ユーザーの言語を判定し、対応する --accept-language の値を指定してください。日本語は ja、英語は en、韓国語は ko、中国語は zh です。判断できない場合は en を使用してください。

  7. SuperAgent スクリプトに --timeout を渡さないでください。 スクリプトが接続のライフサイクルを独自に管理します。

  8. ブランドスタイルの選択は、Mode 2 の新しい会話でのみ行います。 コンテンツ作成のために新しい会話を開始する場合(Mode 2、thread_short_id なし)、SuperAgent を呼び出す前に、必ず TWITTER スタイルライブラリの取得を試み、ユーザーにスタイルを選択してもらってください。スタイルは --ext '{"brand_style_requirement":"..."}' で渡します。詳しい手順は以下の「スタイル選択」セクションを参照してください。

    • スタイルカテゴリは常に TWITTER です(固定値。このスキルはツイートのみを作成します)。
    • --ext は新しい会話でのみ有効です。フォローアップモード(--thread-id)では絶対に渡さないでください。
    • スタイルライブラリに項目がない場合は、何も伝えずにスキップし、--ext なしで続行してください。
    • Mode 1(スタイル DNA の抽出)では、この手順は使用しません。

使用するタイミング

ユーザーが次のことを希望している場合に、このスキルを起動します。

  • Twitter/Xアカウントの文体を分析する
  • ツイートから文体DNAドキュメントを抽出する
  • ツイート/X投稿を書く、下書きする、または作成する
  • Xのスレッド(複数のツイートからなるシリーズ)を書く
  • Xの長文記事/長文投稿を書く
  • 誰かのツイートの文体を模倣する
  • 誰かに代わってツイートをゴーストライティングする
  • 特定のアカウントの書き方を理解する

トリガーキーワード:

  • 英語:analyze twitter style、twitter style analysis、extract writing style、style DNA、write a tweet、write tweets、draft a tweet、write a thread、twitter thread、X article、X long post、imitate tweet style、mimic tweet style、tweet in the style of、write like [account]、X account analysis、analyze X account、ghostwrite tweets、how does [account] write
  • 日本語:ツイートを書く、ツイートスタイル分析、スタイルDNA、ツイートを模倣、Xアカウント分析、ツイートのスタイルを抽出、〇〇風のツイートを書く、ツイートを代筆、Xアカウントを分析、このアカウントはどう書いている

明示的なコマンド: /felo-twitter-writer、use felo twitter writer

次の場合は使用しないでください:

  • Twitter/Xの一般的な検索のみを行う場合(felo-x-searchを使用)
  • SuperAgentとの一般的な会話の場合(felo-superAgentを使用)
  • ウェブ検索の場合(felo-searchを使用)

2つのモード

モード1 — 文体DNAの抽出

対象: ユーザーがTwitter/Xアカウント名を指定し、その文体を理解または抽出したい場合。

手順:

ステップ1:felo-x-searchでツイートを取得する
node felo-x-search/scripts/run_x_search.mjs --id "USERNAME" --user --tweets --limit 30

アカウントのプロフィールも取得します。

node felo-x-search/scripts/run_x_search.mjs --id "USERNAME" --user
ステップ2:live_doc_idを取得する

上記の制約 #4 に従ってください。

ステップ3:ツイートの内容を指定してSuperAgentを呼び出す

まず会話モードを判断します。

  • このセッションにthread_short_idが存在しない場合 → 新しい会話(--skill-id twitter-writerを渡す)
  • このセッションにthread_short_idがすでに存在する場合 → フォローアップ(--thread-idを渡す)

LANGをユーザーの言語に置き換えます:en(英語)、zh(中国語)、ja(日本語)、ko(韓国語)。制約 #6 を参照してください。

新しい会話(セッションでの初回呼び出し):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer ENRICHED_QUERY_WITH_TWEET_CONTENT" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --accept-language LANG \
  --json

フォローアップ(thread_short_idがすでに存在する場合):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer ENRICHED_QUERY_WITH_TWEET_CONTENT" \
  --thread-id "THREAD_SHORT_ID" \
  --live-doc-id "LIVE_DOC_ID" \
  --accept-language LANG \
  --json

クエリの作成例:

@USERNAMEの以下のツイートを分析し、文体DNAドキュメントを抽出してください。トーン、文の構造、冒頭のフック、締めくくりの行動喚起、よく使われる単語、ハッシュタグの使い方、絵文字の使い方、その他の特徴的なパターンなどの観点を取り上げてください。

アカウントの自己紹介: [BIO]

ツイート: [TWEET_1] [TWEET_2] ...

クエリは2000文字以内にしてください。ツイートの内容が長すぎる場合は、代表的なツイートを10~15件含めてください。

ステップ4:状態を保存する

JSONレスポンスのフィールドdata.thread_short_idとdata.live_doc_short_idからthread_short_idとlive_doc_short_idを抽出します。フォローアップの呼び出しに備えて保存してください。


モード2 — コンテンツの作成

対象: ユーザーがツイート、スレッド、またはXの長文投稿を作成したい場合(文体DNAの有無は問いません)。

手順:

ステップ1:文体DNAが利用可能か判断する
  • このセッションでモード1を実行した直後の場合 → 文体DNAはすでにLiveDocキャンバスにあるため、フォローアップモードを使用します
  • ユーザーが文体DNAを直接提示した場合 → クエリに含めます
  • ユーザーがアカウント名を提示した場合 → まずモード1を実行し、その後モード2に進みます
  • 文体DNAがない場合 → 文体ライブラリの選択に進みます(ステップ1.5)
Step 1.5: ブランドスタイルの選択(新しい会話のみ)

このステップを実行するのは、次の場合のみです:

  • 新しい会話である(セッションに thread_short_id がない)、かつ
  • Mode 1 を実行した直後ではない(スタイル DNA のコンテキストを引き継ぐ既存のスレッドがない)

次の場合は、このステップを完全にスキップしてください:

  • thread_short_id がすでに存在する(フォローアップ)— --ext はフォローアップモードでは効果がありません
  • このセッションで Mode 1 を実行した直後である — スタイルのコンテキストはすでにスレッド内にあります

1.5a. ユーザーがすでにスタイルを指定しているか確認します:

ユーザーがスタイル名を挙げている場合(例:「Bold Voice スタイルを使って」)、またはスタイルブロックを貼り付けている場合は、それを記録し、ステップ 1.5d に進みます。

1.5b. TWITTER スタイルライブラリを取得します(名前のみ):

重要:スタイルライブラリの出力は非常に大きくなる場合があります(各 Style DNA は数千文字に及ぶことがあります)。Bash ツールの出力が切り詰められるのを避けるため、必ず --json を使い、名前/ラベルのみを抽出してください。一覧表示の目的で run_style_library.mjs を --json なしで実行してはいけません。

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language LANG --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const list=j.list||[];
const user=list.filter(s=>!s.recommended);
const rec=list.filter(s=>s.recommended);
if(user.length) { console.log('[Your styles]'); user.forEach((s,i)=>{ const labels=(s.content?.labels?.LANG||s.content?.labels?.en||[]).join(', '); console.log((i+1)+'. '+s.name+(labels?' — '+labels:'')); }); }
if(rec.length) { console.log('[Recommended styles]'); rec.forEach((s,i)=>{ const labels=(s.content?.labels?.LANG||s.content?.labels?.en||[]).join(', '); console.log((user.length+i+1)+'. '+s.name+(labels?' — '+labels:'')); }); }
if(!list.length) console.log('(No styles found)');
"

--accept-language と、node スクリプト内の labels?.LANG の両方で、LANG をユーザーの言語コード(zh、ja、ko、en)に置き換えてください。

必ずユーザーの言語に合わせた --accept-language を指定してください(SuperAgent で使う値と同じです)。

1.5c. 結果を処理します:

リストが空の場合: 何も表示せずにスキップします。--ext を指定せずにステップ 2 に進みます。

スタイルがある場合: API から返されたスタイルをすべて、種類ごとにグループ化し、通し番号を付けてプレーンテキストで完全に表示します。AskUserQuestion ツールは絶対に使用しないでください(選択肢が 4 つに制限され、スタイルが通知なく除外されます)。ユーザーに代わってスタイルを事前選択したり、絞り込んだりしてはいけません。最後の項目として必ず「こだわりなし」を追加してください。その後、ユーザーがプレーンテキストで返信するまで待ってから先に進みます。

表示例(ユーザーの言語に合わせて調整してください):

Here are the available Twitter writing styles — choosing one will make the output more accurate:

[Your styles]
1. My Bold Voice

[Recommended styles]
2. elonmusk — Shitposting provocateur
3. naval — Pithy aphorism master
...(list ALL styles, do not omit any)

0. No preference — use default style

1.5d. 選択したスタイルから --ext を作成します:

ユーザーがスタイルを選択した後、--json を使ってそのスタイルの Style DNA 全体を取得し、Node.js で抽出してください。Bash ツールによって出力が切り詰められるため、全文のテキスト出力を再度読み込んではいけません。

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language LANG --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const s=(j.list||[]).find(s=>s.name==='CHOSEN_STYLE_NAME');
if(!s){process.stderr.write('Style not found\n');process.exit(1);}
const labels=(s.content?.labels?.LANG||s.content?.labels?.en||[]).join(', ');
const dna=s.content?.styleDna||'';
const block='Style name: '+s.name+'\nStyle labels: '+labels+'\nStyle DNA: '+dna;
console.log(JSON.stringify({brand_style_requirement:block}));
"

CHOSEN_STYLE_NAME をユーザーが選択したスタイル名に、LANG を言語コードに置き換えてください。

出力された JSON を --ext の値として直接渡します:

--ext "$(node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language LANG --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const s=(j.list||[]).find(s=>s.name==='CHOSEN_STYLE_NAME');
const labels=(s.content?.labels?.LANG||s.content?.labels?.en||[]).join(', ');
const dna=s.content?.styleDna||'';
const block='Style name: '+s.name+'\nStyle labels: '+labels+'\nStyle DNA: '+dna;
console.log(JSON.stringify({brand_style_requirement:block}));
")"

ユーザーが「こだわりなし」(選択肢 0)を選んだ場合は、--ext を渡してはいけません。

Step 2: live_doc_id を取得する

制約 #4 に従ってください。Mode 1 をすでに実行している場合は、同じ live_doc_id を再利用してください。

Step 3: 会話モードを判定する
条件モード渡すもの
このセッションに thread_short_id がない(本当に最初の呼び出し)新しい会話--live-doc-id + --skill-id twitter-writer + --ext(スタイルを選択した場合)
このセッションに thread_short_id がすでに存在する(Mode 1 の後も含む、以降のすべての入力)フォローアップ--thread-id + --live-doc-id(--ext なし)
ユーザーが「新しいトピック」/「最初からやり直す」と言った場合(thread_short_id をクリア)新しい会話--live-doc-id + --skill-id twitter-writer + --ext(ステップ 1.5 を繰り返す)
Step 4:SuperAgent を呼び出す

LANG をユーザーの言語に置き換えます:en、zh、ja、ko。制約 #6 を参照してください。

スタイルを指定しない新しい会話(thread_short_id がなく、ユーザーがスタイルを選ばなかった、またはリストが空だった場合):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer ENRICHED_QUERY" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --accept-language LANG \
  --json

ブランドスタイルを指定した新しい会話:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer ENRICHED_QUERY" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --ext '{"brand_style_requirement":"Style name: darioamodei\nStyle labels: Thoughtful long-form essays\nStyle DNA: # Dario Amodei (@DarioAmodei) Tweet Writing Style DNA\n\n## Style Overview\nDario writes like a serious intellectual...(full content, do NOT truncate)"}' \
  --accept-language LANG \
  --json

フォローアップ(セッションに thread_short_id がすでに存在する場合):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer USER_FOLLOW_UP" \
  --thread-id "THREAD_SHORT_ID" \
  --live-doc-id "LIVE_DOC_ID" \
  --accept-language LANG \
  --json

クエリの作成ガイドライン:

  • コンテンツの種類を指定します:単一のツイート/スレッド/X の長文投稿
  • トピックを明確に指定します
  • スタイルの DNA や参考アカウントがあれば含めます
  • ユーザーから別の指定がなければ、デフォルトで 3 つのバージョンを作成します
  • ユーザーの中心的な意図を維持し、背景情報と明確さのみを追加します

クエリの例:

@USERNAME のスタイル(上記のスタイル DNA)で、[TOPIC] についてのツイートを 3 つのバージョンで作成してください。それぞれのバージョンに違いを持たせ、トーン、構成、または切り口を変えてください。

上記で抽出したスタイル DNA に基づいて、[TOPIC] についての Twitter スレッド(5~7 件のツイート)を作成してください。最初のツイートは、強いフックになるものにしてください。

分析した文体に沿って、[TOPIC] についての X の長文投稿を作成してください。約 500 語を目安にしてください。

Step 5:状態を保存する

JSON レスポンスのフィールド data.thread_short_id と data.live_doc_short_id から、thread_short_id と live_doc_short_id を抽出します。


モード判定ロジック

User input
  │
  ├── Contains account name + "analyze / style / DNA / how does X write"
  │   OR: アカウント名 + "分析 / スタイル / DNA / どう書いている"
  │     → Mode 1 (Style DNA Extraction) — skip style library step
  │
  ├── Contains account name + "write / create / imitate / in the style of"
  │   OR: アカウント名 + "書いて / 作って / 風に / 真似て"
  │     → Mode 1 first → then Mode 2 (follow-up, skip style library step)
  │
  ├── Contains topic + "write / draft / tweet / thread / X post"
  │   OR: トピック + "書いて / ツイート / スレッド / Xの投稿"
  │     → Mode 2 directly
  │         └── New conversation?
  │               YES → Step 1.5: fetch TWITTER styles, present to user, wait for choice
  │               NO  → follow-up, skip style library step
  │
  └── Ambiguous (e.g., "help me with tweets" / "ツイートを手伝って")
        → Ask user: do they want to analyze an account's style, or create content?

ワークフローの完全な例

例 A:アカウントのスタイルを分析する
User: "Analyze @paulg's tweet style"

Step 1: ツイートを取得します:

node felo-x-search/scripts/run_x_search.mjs --id "paulg" --user --tweets --limit 30
node felo-x-search/scripts/run_x_search.mjs --id "paulg" --user

Step 2: live_doc_id を取得します(一覧から選択するか、新規作成します)

Step 3: SuperAgent を呼び出します(Mode 1 — スタイルライブラリのステップなし):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Please analyze the following tweets from @paulg and extract a writing style DNA document. Cover tone, sentence structure, opening hooks, closing CTAs, frequently used words, hashtag strategy, and emoji usage.\n\nAccount bio: [BIO]\n\nTweets:\n[TWEETS]" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --accept-language en \
  --json

Step 4: JSON レスポンスのフィールド data.thread_short_id と data.live_doc_short_id から、thread_short_id と live_doc_short_id を保存します。


例 B:参考スタイルでツイートを作成する(Mode 1 → Mode 2)
User: "Write 3 tweets about startups in @paulg's style"

Step 1: Mode 1 を実行してスタイル DNA を抽出します(例 A と同じ)。Mode 1 によってスレッド内でスタイルのコンテキストがすでに確立されているため、スタイルライブラリのステップは省略します。

Step 2: Mode 1 の live_doc_id を再利用します。

Step 3: フォローアップの呼び出しを行います(同じスレッドを続けます — Mode 1 の thread_short_id を使用し、--ext は指定しません):

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Based on the @paulg style DNA extracted above, write 3 tweet variations about startups. Each should have a distinct tone and angle, within 280 characters." \
  --thread-id "THREAD_SHORT_ID" \
  --live-doc-id "LIVE_DOC_ID" \
  --accept-language en \
  --json

例 C:スレッドを直接作成する(Mode 2、新しい会話、スタイルを選択)
User: "Write a Twitter thread about why most startups fail"

Step 1.5: 新しい会話で既存のスレッドがないため、TWITTER スタイルを取得します(名前のみ):

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const list=j.list||[];
const user=list.filter(s=>!s.recommended);
const rec=list.filter(s=>s.recommended);
if(user.length){console.log('[Your styles]');user.forEach((s,i)=>{const labels=(s.content?.labels?.en||[]).join(', ');console.log((i+1)+'. '+s.name+(labels?' — '+labels:''));});}
if(rec.length){console.log('[Recommended styles]');rec.forEach((s,i)=>{const labels=(s.content?.labels?.en||[]).join(', ');console.log((user.length+i+1)+'. '+s.name+(labels?' — '+labels:''));});}
if(!list.length)console.log('(No styles found)');
"

ユーザーに提示します:

Here are the available Twitter writing styles — choosing one will make the output more accurate:

[Your styles]
1. My Bold Voice

[Recommended styles]
2. darioamodei

0. No preference — use default style

ユーザーの返信:1

Step 2: live_doc_id を取得します。

Step 3: 選択したスタイルで新しい会話を開始します — --json で完全な Style DNA を抽出し、--ext として渡します:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Write a Twitter thread (6–8 tweets) about why most startups fail. Start with a strong hook tweet that grabs attention. Each tweet should stand alone but flow naturally into the next." \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --ext "$(node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const s=(j.list||[]).find(s=>s.name==='My Bold Voice');
const labels=(s.content?.labels?.en||[]).join(', ');
const block='Style name: '+s.name+'\nStyle labels: '+labels+'\nStyle DNA: '+s.content.styleDna;
console.log(JSON.stringify({brand_style_requirement:block}));
")" \
  --accept-language en \
  --json

Step 4: JSON レスポンスのフィールド data.thread_short_id と data.live_doc_short_id から、thread_short_id と live_doc_short_id を保存します。


例 D:生成したコンテンツを調整する(フォローアップ、スタイルのステップなし)
User: "Make the 2nd tweet more humorous and add some emojis"

前回の呼び出しで thread_short_id と live_doc_id を取得済みです。これはフォローアップです。スタイルを再取得せず、--ext も渡さないでください。

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Please revise the 2nd tweet generated above. Make the tone more humorous and lighthearted, and add appropriate emojis. Keep the original intent intact." \
  --thread-id "THREAD_SHORT_ID" \
  --live-doc-id "LIVE_DOC_ID" \
  --accept-language en \
  --json

保存: JSON レスポンスのフィールド data.thread_short_id と data.live_doc_short_id から、更新された thread_short_id と live_doc_short_id を保存します。


例 E:ユーザーが名前でスタイルを指定する
User: "Write a tweet about AI trends using my 'Bold Voice' style"

Step 1.5a: ユーザーがすでにスタイル名を指定しているため、--json で完全な Style DNA を抽出します。ユーザーに再度尋ねる必要はありません。

Step 3: そのスタイルを使って新しい会話を開始します:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Write a tweet about AI trends" \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --ext "$(node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
const s=(j.list||[]).find(s=>s.name==='My Bold Voice');
const labels=(s.content?.labels?.en||[]).join(', ');
const block='Style name: '+s.name+'\nStyle labels: '+labels+'\nStyle DNA: '+s.content.styleDna;
console.log(JSON.stringify({brand_style_requirement:block}));
")" \
  --accept-language en \
  --json

例 F:スタイルライブラリが空の場合
User: "Write a tweet about the new product launch"

Step 1.5b: スタイルを取得します(名前のみ):

node felo-superAgent/scripts/run_style_library.mjs --category TWITTER --accept-language en --json | node -e "
const d=require('fs').readFileSync('/dev/stdin','utf8');
const j=JSON.parse(d);
if(!(j.list||[]).length)console.log('(No styles found)');
else console.log((j.list||[]).map(s=>s.name).join('\n'));
"

出力:(スタイルが見つかりません)

何も表示せずにスキップします。 --ext を指定せず、そのまま続行します:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Write a tweet about the new product launch. Provide 3 versions with different tones." \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --accept-language en \
  --json

例 G:ユーザーがスタイルを指定しない場合
User: "Write a tweet about a new product launch"

Step 1.5: スタイルを取得し、リストを提示します。ユーザーの返信:0(スタイルの指定なし)。

--ext を指定せず続行します:

node felo-superAgent/scripts/run_superagent.mjs \
  --query "/twitter-writer Write 3 tweets about a new product launch, each with a slightly different tone." \
  --live-doc-id "LIVE_DOC_ID" \
  --skill-id twitter-writer \
  --accept-language en \
  --json

エラー処理

シナリオ対応
アカウントが見つからない、またはツイートが返されないユーザーに伝え、別のユーザー名を試すか、ツイートのサンプルを手動で提供するよう提案します
FELO_API_KEY が設定されていない停止し、セットアップ手順を表示します(felo-superAgent の SKILL.md と同じです)
SuperAgent の呼び出しに失敗するlive_doc_id の有効性を確認し、同じパラメーターで一度だけ再試行します
スタイルライブラリの取得に失敗する標準エラーに警告を記録し、通知せずにスキップして、--ext なしで続行します
スタイル DNA もアカウントも指定せずに、ユーザーがモード 2 を求めているステップ 1.5(スタイルライブラリの選択)に進みます
ユーザーが新しいキャンバスを明示的に求めている新しい LiveDoc を作成します:node felo-livedoc/scripts/run_livedoc.mjs create --name "Twitter Writer" --json
クエリに対してツイートの内容が長すぎる(>2000 文字)代表的なツイートを 10~15 件に絞り、エンゲージメントの高いものを優先します

参考資料

コメント