Install
openclaw skills install @durenzidu/powpow-simple-jaPowPow(global.powpow.online)への投稿・旅行記の公開、およびチャットできるデジタルヒューマンの作成と公開マップへのピン留めを行います。ユーザーが旅行コンテンツ(写真・旅行記・旅の思い出)をPowPowに公開したいときに起動します。例「PowPowに投稿して」「旅行写真をPowPowにアップして」「写真から旅行記を書いてPowPowに」「publish a PowPow post」「发一篇 PowPow 帖子」。また、デジタルヒューマンをマップ上に作成・公開したいときにも起動します。例「デジタルヒューマンを作って」「この人を地図上のデジタルヒューマンにして」「デジタルヒューマンを公開」。PowPowアカウントが必要です(未登録の場合は先に登録してください)。含まれる補助機能(いずれも公開・作成フローの構成要素)は、ログインとセッション管理、実行環境のセルフチェック、地名から座標への解決、デジタルヒューマンの検索とトピックマッチング、画像検索と画像アップロード、投稿の組み立てと公開、公開後の検証、自分の投稿の削除(テスト後片付け専用、JWTによりログインユーザー自身の投稿に限定)。他のSNSプラットフォームへの公開、サブスクリプションやマーケティング機能は含みません。
openclaw skills install @durenzidu/powpow-simple-jaあなたの写真や素材を旅行記にまとめて、あなた名義でPowPowに公開する。あるいは人物・キャラクターをチャットできるデジタルヒューマンにして、公開マップにピン留めする。
バージョン 1.0.0 ・ 2026-09-20(履歴は references/changelog.md、セキュリティ設計とAPI一覧は references/security.md、ファイル構成は references/file-structure.md、製品スクリーンショットは references/screenshots.md)
言語ルール(ハードルール): 会話は常にユーザーの言語で行う。本書は日本語で書かれているが、このスキルはあらゆる言語のユーザーを支援する — 質問、選択肢、説明、記事本文のすべてがユーザーの言語に従う。英語と中国語のトリガー表現も認識する。
これは命令型スキル: SKILL.md がフローを記述し、scripts/*.js は簡素な Node スクリプト(グローバル fetch/fs のみ、サードパーティ依存ゼロ)。
fetch を使用)。まず確認 node -vscripts/ にある。 実行前にスキルのルートへ移動、例:
cd <スキルのパス> && node scripts/doctor.jsPOWPOW_STATE_DIR に書き込まれる(デフォルト ~/.powpow/session.json)。スキルパッケージは読み取り専用の可能性がある — スキルディレクトリにファイルを書き込まない。ユーザーは環境変数で場所を変更できる。--image には常に絶対パスを渡す。相対パスは失敗する。多くのユーザーはPowPowを見たことがない。一枚の画像はどんな説明より効く — 必要に応じてスクリーンショットのリンクをユーザーに直接送る(Markdown画像でも素のリンクでも可)。完全なリスト、説明、使用場面は references/screenshots.md。クイックマッピング:
ルール:
durenzidu/durenzidu の screenshots/ にある(powpow-0N.jpg)。画像をスキルディレクトリにダウンロードしない。ローカルパスを画像として送らない。raw.githubusercontent.com が開けない場合は jsdelivr ミラーを使う(references/screenshots.md 参照)。references/screenshots.md の説明に従って選ぶ。このスキルは、ユーザーが旅行コンテンツ(旅行記/写真/旅)をPowPowに公開したい、またはデジタルヒューマンをマップ上に作成したいときに起動する。典型的な表現:
共起ルール(誤発動防止): 旅行・写真・旅行記という単語の言及だけでは発動しない — 公開の意図(投稿/アップロード/发/发布)か、プラットフォーム名(PowPow/泡泡/powpow)のどちらかが加わる必要がある。「この写真きれいだね」では発動しない。「この写真をPowPowに投稿して」なら発動する。
一般的なSNSや他のプラットフォームでは発動しない。
多くのユーザーはチャットアシスタント経由で何かを公開したことがない。スクリプトを正しく実行することは半分にすぎない — 各ラウンドで、何が起きたか、何が必要か、次に何が来るかをユーザーに伝え続けること。
これは一般ユーザー向けの製品である。あなたはユーザーをサポートするのであって、教えるのではない。終始、柔らかく、敬意を持って。
| 言い方NG(説教がましい・上から目線) | 言い方OK(寄り添う・対等・招く口調) |
|---|---|
| 一つはっきりさせておきますが… | 事前に少しだけご説明させてください |
| 注意ですが…/気をつけていただきたいのは… | 1点だけ確認させてください |
| 場所と時間は私には分かりません。この2つを教えてください | 写真の撮影場所や日時は読み取らない方針ですので、その2点だけ教えていただけますか |
| そこは私が決めることではありません | そこは私から決めさせていただくのは避けたいです。記事に入る内容ですので、選び間違えると違和感が出てしまいます |
| 座標の心配はいりません | 座標は私がすべて処理します。お選びいただくのは場所の名前だけです |
常に:
明確な禁止事項: 説教しない。「注意しなければなりません」と予告しない。ユーザーの決定を評価しない。「私は〜しなければなりません」を使わない。ユーザーが尋ねない限り、内部仕組み・制限・セキュリティ設計を説明しない。
プロバイダー中立の呼称(ハードルール): 地図プロバイダーの名前をユーザーに絶対に言わない。 代わりに行動で描写する — 「場所をお調べします」「地図で同名の場所が複数見つかりました。お選びください」。「地図データベース」などの専門用語も避ける。APIパスはプラットフォーム自身のエンドポイントであり、このルールの対象外。
初回トリガー時(doctor がセッションなしを報告、またはユーザーが何ができるか尋ねる): 短い導入(約200字、機能の羅列なし)を行い、ユーザーの意図で分岐してから最初の質問をする:
テンプレート(出発点として使い、ユーザーの言語に合わせて調整する — 暗唱しない):
ご利用いただけて嬉しいです — PowPowの世界へようこそ。 ここでは今日の写真を旅行記にすることができます。執筆も、地図へのピン留めも、PowPowへの公開も、すべて私が行います — 誰かが地図でタップすれば、その日にあなたが歩いた道が見えます。 [パート2 — 完成イメージ。カプセル、画像、地図バブルの仕組み(上記の定型文)] [パート3 — 必要なもの。ログイン。アカウントがないかもしれない場合は登録リンク + 紹介動画] [パート4 — 3拍の流れ。ログインが先] 始めましょうか?今日公開したいものを教えてください。最初のステップから始めます。
長いメッセージではユーザーは流れを失う — 内容が間違っているからではなく、アクションが埋もれるから。だからすべての返信の最後のブロックは固定の「次のステップ」ブロックにする: 区切り線で分け、矢印で示し、今何をすべきかが一目で分かるようにする。
固定形式:
────────────────────
👉 次はあなたです。1 / 2 / 3 で返信して、場所を選んでください
(選んでいただいたら下書きを作ります — 次のラウンドでカプセル付きのプレビューが見えます)
3つのハードルール:
公開の結果も同じルールに従う(ステップ8参照): リンクと場所はメッセージの最後、視線が最後に届く場所へ。
fetch を使用)。node scripts/doctor.js
printf '%s' '<password>' | node scripts/login.js <username>
printf のない PowerShell/cmd)では:
node scripts/login.js <username>
POWPOW_STATE_DIR、デフォルト ~/.powpow/session.json)。スキルディレクトリには入らない。pending_payment を返す場合 — アカウントは存在するが、プラットフォームの有効化が完了していない。停止し、再試行せず、伝える:「アカウントの有効化がまだ完了していないため、今は公開できません。PowPowを開いてログインし、画面の指示に従って有効化を完了してください。終わりましたらお知らせください。そこから続きを行います。」これは一時的なエラーでもログインの失敗でもない — 認証情報の再入力を求めず、素材の収集もしない。config.json(デフォルト値のみ。機密情報なし。読み取り専用):
{
"platformUrl": "https://global.powpow.online",
"unsplashAccessKey": "",
"sessionMaxAgeDays": 6
}
unsplashAccessKey は省略可で、ユーザーが指定する。キーがなければ画像検索をスキップする(画像なしの投稿も完全にサポートされる)か、ユーザーの直接リンクを使う。
OpenClaw での設定の上書き: 同梱の config.json を変更しない(読み取り専用の可能性がある)。同名の config.json をステートディレクトリに置く(POWPOW_STATE_DIR、デフォルト ~/.powpow/config.json)— その値が同梱のデフォルトを上書きする。または環境変数 UNSPLASH_ACCESS_KEY を設定する。
実行規約(OpenClaw): 以下のすべての
node scripts/...コマンドは、このスキルのルートディレクトリをカレントディレクトリとして実行することを前提とする。疑わしい場合は絶対パスで実行する —node <スキルのパス>/scripts/xxx.js。一時ファイル(下書き、プレビュー、マニフェスト)は作業ディレクトリに置く。スキルディレクトリには絶対に入れない。
典型フロー — ユーザーが写真を送り、その周りに一人称の旅行記を書く。
他の入力形式も歓迎: モードA ユーザーが完成済みテキストを提供 — 生成をスキップ。モードC 部分入力 — こちらで補完する。いずれの場合も、場所と時間はユーザーから。画像の読み取りからではない。
健全なデジタルヒューマンをリストアップ/提案する:
node scripts/match-digital-human.js "<トピック>" --limit 3 --json # ソート済みの提案
node scripts/list-digital-humans.js "<名前>" --json # 名前で検索
ヘルスフィルター内蔵 — 無効化されたもの、テスト名のもの、つぶれたアバター、プレースホルダーアバターは自動的に除外される。上位候補と説明を見せ、ユーザーに選んでもらう(「お任せ」なら自動で選ぶ)。 希望のデジタルヒューマンが存在しない場合は、作成ページを案内する: https://global.powpow.online 注: プラットフォームのデジタルヒューマンライブラリは現在中国語が中心。中国語のトピックで最も良く機能する。
場所は強く推奨されるが、省略可能。 投稿が公開マップに載るかどうかを決める(中核のゲームプレイ)。
node scripts/geocode.js "地坛公园" --limit 5 # --city 北京 で絞り込み可
--loc <名前> --lng <x> --lat <y>。--city <都市>(地区、ランドマーク、街路名)。--limit を上げる(例 10)。地区+住所付きで各候補を表示し、正しいものを認識してもらう。isLocationExposed: false)。テキスト、デジタルヒューマン、画像は保持される。失われるのは地図バブルだけ。エラーとしてではなく、結果として提示する。
一般ユーザーに緯度経度の入力を求めるのは、決して正当なフォールバックではない。ユーザーは入手できないし、仮に手に入れても大抵は GCJ-02 であり、数百メートルずれた場所にピン留めされる — 一人称記事の目立つ事実誤認になる。座標はエキスパート経路: ユーザーが自発的に提供する場合にのみ使う。isLocationExposed: false)。圧力も駆け引きもなし — 本人の決定である。locationName、lng、lat)。指定された場所は常に公開マップに載る(isLocationExposed: true)— 内部ルール。「地図から隠す」オプションをユーザーに提供しない。 投稿は地図上のバブルライフサイクルに参加する(時間とともに薄れていく)。
場所コンポーネントの形式:
<span data-type="location" data-lng="116.316" data-lat="39.979" name="中关村">
<span class="location-name">中关村</span>
</span>
画像を添付する3つの方法:
--image @<パス>。compose の段階ではサーバーに何も送らない — ファイルは <out>.manifest.json に記録され、file:// でローカルプレビューされる。アップロードが起きるのは publish.js の時(POST /api/upload/post-image、JPEG/PNG/WebP/GIF/BMP/HEIC、SVG不可、各10MB以下、サーバー側で圧縮)。下書きの修正はサーバーに一切触れず、孤児ファイルも生まない。unsplash.com/photos/...、ブラウザからコピーされがち)— images.unsplash.com の直接リンクへ自動解決される。ファイルID形式(unsplash.com/photos/1507513319174-...)はキーなしでローカル解決される。スラッグ/短縮ID形式は Unsplash API キーが必要(ページのボット防御がキーなしの取得をブロックする)。キーなしでスラッグ形式に当たったら — スキップして伝える。直接リンクをお願いする。ページリンクを画像として埋め込まない(壊れた表示になる)。--image search:<英語キーワード>(または node scripts/search-image.js "<キーワード>")画像枚数に固定の上限はない。 プラットフォームの上限は5万文字(各画像タグ ≈100文字)。200枚に近づいたらユーザーに通知する。表示面: フィードのグリッドは最初の9枚 +「+N」を表示。フルスクリーンビューアはすべて表示する。
対話型コンポーネント(デジタルヒューマン/場所)は、Webフロントエンドが content 中のリッチなHTMLから描画する。単なる <span data-type="digital-human">マリー・キュリー</span> はプレーンテキストとして表示される — tiptap エディタの正確な構造を持つ span(Tailwindクラス、内部のアバター <img>、ピンアイコン、.location-name)だけが、タップ可能なカプセルとして描画される。
必須: 投稿HTMLは必ず scripts/compose.js で組み立てる。コンポーネントの span を手書きしない。html-formatter.js を回避する貼り合わせコードを書かない。
# 1. 投稿本文をファイルに保存する。段落は空行で区切る。
# プレースホルダー(すべて省略可。誤用はすべてハードエラーになり、黙って修正されない):
# {{dh}} または {{数字人}} -> デジタルヒューマンカプセル(--dh が必要)
# {{loc}} または {{位置}} -> 場所カプセル(--loc が必要)
# {{img}} または {{图}} -> 画像段落。独立した段落であること。--image を順番に消費する
# (各1つに利用可能な --image が必要。なければ compose は失敗する)
# 注: 上の中国語エイリアスはスクリプトが認識するリテラルトークン —
# どちらの形式も使えるが、新しいトークンを発明しないこと。
# 未知/過剰/インラインのプレースホルダーは compose.js を exit 1 で中断させ、何も書かせない。
# テキストファイルを修正して再実行する — 通すためにテキストを削除しないこと。
# 2. 1コマンドで組み立てる(完全にローカル、ネットワーク不要):
node scripts/compose.js --text-file post.txt \
--dh name:岳飞 \ # または --dh <id>、--dh auto --topic "..."
--loc dh \ # または --loc <名前> --lng 116.3 --lat 39.9
--image @./photos/west-lake.jpg \ # ローカルファイル(公開時にアップロード)。<直接リンク>、search:<キーワード> も可
--out post-draft.html
compose.js の強制ルール:
--dh/--loc が指定されているのにテキストにプレースホルダーがない場合、カプセルは最初の段落の前/最後の段落の後に自動的に付けられる。powpow-local://N プレースホルダー + post-draft.html.manifest.json になる。publish.js が公開時にアップロードする。post-draft.html.preview.html を書き出す — 中国語のプレビューページで、ユーザーがブラウザで開ける。バナーは投稿が公開マップに載るか、載るならどこにピン留めされるかを表示する — ユーザーが実際に読むページで地図の帰結が見えるように(ローカルの地図は file:// で描画される)。バナーの内容はユーザーの言語で伝える。publish.js は validateEditorFormat() をもう一度実行し、それ以外を拒否する。contentItems を含めない — contentItems が存在するとフロントエンドは構造化描画を優先し、不完全なリストは本文を失わせる。publish.js が処理する。<img> を自動的に地図のサムネイルにする。まず4点のリストを提示し、それから「次のステップ」ブロックでラウンドを締める。ブロックの唯一のアクションは公開の決定である(公開 / さらに修正 / まだ):
<out>.preview.html)— 中国語のプレビュー。バナーも同じく、投稿が公開マップに載るかを表示する。近似であってピクセル完全なコピーではない旨を一行で。決定は最後のブロックでなければならない — リストの中に埋めない。(なぜここまで厳格か: テストでは、ユーザーはまさにこの内容を読んで「それで?」と返した — 情報はすべて揃っていたのに、アクションが視線の終わる場所になかった。)
修正ループ: ユーザーが変更を希望したら実行して compose.js を再実行する — 完全にローカル。サーバーへの接触も孤児アップロードもなく、ラウンド数に制限はない。ユーザーの明示的な 发布/publish/確認 だけがループを終わらせる。それまでは絶対に公開しない。
node scripts/publish.js <htmlファイルのパス>
下書きにローカル画像が含まれる場合、これがアップロードの瞬間である — 投稿の前に1枚ずつ。進捗は成功のたびに永続化される(HTML + マニフェストを実URLで書き直す)ため、失敗した再実行が成功済みの分を再アップロードすることはない。
投稿はログイン中のユーザーとして作成される — 身元は JWT から来る。他人として投稿する方法は存在しない。サーバーはコンテンツモデレーションとレート制限を強制する。429 の場合はスクリプトが Retry-After を自動遵守する。
node scripts/verify.js <post-id>
到達可能性、作者、デジタルヒューマン/場所コンポーネント、画像枚数、本文の文字数を確認する。この順序で報告する — リストが先、結果が最後:
────────────────────
✅ 投稿を公開しました
📍 ピン留め先: Yanjiao Xinggong Ruins (116.816667, 39.95)
👉 リンクを開いて確認してください — 2つのカプセルはタップできますか? 画像の順番は合っていますか?
(コマンドラインでは確認できません — あなたの目が最後の関門です)
🔗 https://global.powpow.online/posts/<post-id>
場所がない場合は同じブロックで伝える:「📍 場所なし — この投稿は公開マップには載りません」。
対話型の描画(カプセルのタップ、画像のライトボックス)は CLI では検証できない — ユーザーの目が最後の関門である。
テスト投稿の後片付け:
node scripts/delete-post.js <post-id>
人物(歴史上の人物、キャラクター、ユーザー自身のアバター…)をチャットできるデジタルヒューマンに変え、公開マップにピン留めする、公開とは独立したフロー。トリガー: 「デジタルヒューマンを作って」「あの人を地図上のデジタルヒューマンにして」「デジタルヒューマンを公開」。
コスト — 実行前に、公開の決定と同じ形式で確認する:
ユーザーから収集するもの:
--avatar-ref)。プラットフォームがペルソナ+参照から生成する(8〜30秒)。ローカルの参照写真も可 — まず /api/upload/post-image にアップロードし、その公開URLを --avatar-ref に渡す。--avatar @<パス>): ユーザー自身の画像をそのまま使う。--avatar <url>): 画像への直接URL。node scripts/create-digital-human.js \
--name 史铁生 \
--desc-file persona.txt \ # または --desc "..."
--avatar-ref https://...jpg \ # または --avatar @./photo.jpg、--avatar <url>
--lng 116.408195 --lat 39.952372 # ユーザーが選んだ解決結果から
作成後は、デジタルヒューマンID、場所、失効日(30日)、バッジ残高を報告し、地図へリンクする: https://global.powpow.online/map 。ユーザーはすぐに投稿で@言及できる(compose.js --dh <id>)し、match-digital-human.js の候補にもなる。
既存のものを探す: node scripts/list-digital-humans.js --search "<名前>"。
ハードルール: 生のスクリプト出力、nodeコマンド、エラーコード(DEVICE_MISMATCH など)をそのままユーザーに投げない。すべてのエラーを、人間の文 + 次のアクションに翻訳する。
printf '%s' '<password>' | node scripts/login.js <username>。位置引数形式(login.js <user> <password>)は絶対に使わない — シェル履歴とプロセス一覧に残る。エコーなし、ディスクへの書き込みなし、シェル変数なし。login.js は互換性のため位置引数形式を受け付けるが、使ってよいという意味ではない。認証情報は質素なメッセージ1通で依頼し、セキュリティ説教をしない(会話UX → 口調参照)。--text-file/--image に明示的に指定したパスか、カレント作業ディレクトリで自分が作成したファイルのみを使う。マシンをスキャンしない、パスを当て推量しない — 誤ったパスはプライベートなファイルを公開してしまう。