ppw:team について
ppw:team は、translation、polish、de-ai Skills を使う論文のセクション処理を調整します。現在は論文を分割し、選択した1セクションをサブエージェントで処理して品質を確認する段階で、全セクションの並列処理は未実装です。
主な機能
- 01LaTeXまたはMarkdown論文の分割
- 02guidedモードとdirectモード
- 03対象Skillとファイル形式の検証
- 04単一セクションでの概念実証
- 05マニフェスト、バックアップ、状態の記録
活用シーン
- 01論文セクションの翻訳
- 02セクションの推敲やAI風文体の低減
- 03続行前のサブエージェント出力の品質確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lylll9436/ paper-polish-workflow-skill --skill ppw:teamインストール後、Claude Code で/ppw:teamを入力して読み込まれたか確認します。
詳細
目的
このスキルは、論文を H1 セクションに分割し、対象となるスキルをサブエージェントに割り当てることで、論文処理を並列で調整します。フェーズ 19(現在)では、1 つのセクションで単一のサブエージェントを実行し、概念実証のゲートを検証します。すべてのセクションへの完全な並列割り当てはフェーズ 20 で行います。
トリガー
次の場合に起動します: ppw:team [skill] [file] の呼び出し。
例:
- "ppw:team polish paper.tex" / "团队模式润色论文"
- "ppw:team translation draft.md" / "并行翻译论文各章节"
- "ppw:team de-ai paper.tex"
モード
| モード | デフォルト | 動作 |
|---|---|---|
guided | はい | 分割 -> ユーザーがセクションを確認 -> ユーザーが PoC セクションを選択 -> PoC を実行 -> ユーザーが品質を確認 |
direct | 確認を省略し、本文の全セクションを自動選択して、PoC 用に最初のセクションを選択 |
モードの推定: トリガーに「直接」または「direct」が含まれる場合、direct モードに切り替わります。
参照資料
required: [] -- このスキル自体は学術テキストを作成しません。他のスキルを調整し、それらのスキルが実行時に独自の参照資料を読み込みます。調整役が必要とする参照ファイルはありません。
質問の方法
Guided モード -- AskUserQuestion を介した 3 つの対話ポイント:
- 分割後のセクション選択(複数選択)
- 選択されたセクションからの PoC セクション選択(単一選択)
- PoC の品質確認(承認/再試行/終了)
Direct モード -- 3 つすべてを省略:本文の全セクション(前文と参考文献を除く)を自動選択し、PoC 用に最初の本文セクションを自動選択して、PoC の出力を自動承認します。
ワークフロー
ステップ 0:ワークフローの記録(記録のみ)
- パターン検出は省略します。調整役は自動 direct モードの推奨には適していません。
- 記録はステップ 1 の検証後に行います(ステップ 1 を参照)。
ステップ 1:引数の解析と検証
$ARGUMENTSを解析して、スキル名(最初の語)とファイルパス(残りの語)を抽出します。- スキル名を許可リスト
["translation", "polish", "de-ai"]と照合して検証します。 - スキルが許可リストにない場合は、次の正確なメッセージを表示して拒否します:「[Skill] requires full-paper context and cannot run in parallel. Please run /ppw:[skill] directly.」
- ファイルが存在し、形式が
.texまたは.mdであることを検証します。ファイルが見つからない場合、または形式が異なる場合は、エラーを報告して停止します。 - 論文ファイルの内容を読み込みます。
- ワークフローを記録します:
{"skill": "ppw:team", "ts": "<ISO timestamp>"}を.planning/workflow-memory.jsonに追記します。ファイルが存在しない場合は[]として作成します。ログの長さが 50 以上の場合、最も古いエントリを削除します。
ステップ 2:作業ディレクトリの作成
.paper-team/ディレクトリ構造として、sections/とoutput/を作成します。.paper-team/がすでに存在する場合:guided モードでは上書きするかキャンセルするかを尋ね、direct モードでは確認なしで上書きします。- 元の論文のバックアップを作成します:
.paper-team/{filename}-backup-{YYYYMMDD-HHmm}.{ext}(再実行時の上書きを防ぐため、タイムスタンプを付けます)。 .paper-team/manifest.jsonを初期化します:
{
"version": "1.0",
"created": "<ISO timestamp>",
"source_file": "<original file path>",
"source_format": "tex|md",
"target_skill": "<skill name>",
"sections": [],
"poc": { "section_id": null, "status": "pending", "timestamp": null },
"backup": "<backup filename>"
}
ステップ 3:論文をセクションに分割する
.tex ファイルの場合:
- プリアンブル:先頭から
\begin{document}まで(これを含む)。「00 - プリアンブル」というラベルを付けます。 - 参考文献:
\bibliography{}または\printbibliographyから\end{document}まで。「99 - 参考文献」というラベルを付けます。 - セクション境界:各
\sectionコマンドです。\sectionの後に任意の*、任意の[...]、続いて{...}があるパターンに一致させます。%で始まる行(LaTeX のコメント)は無視します。 \begin{document}から最初の\section{}までの内容は「00 - セクション前の内容」とします(トリミング後に空でない場合)。- 各セクション:その
\section{Title}の行から、次の\section{または参考文献の境界の直前の行までの内容です。
.md ファイルの場合:
- フロントマター:最初の
#見出しより前の内容です。「00 - フロントマター」というラベルを付けます(空でない場合)。 #で始まる行(H1 見出し)で分割します。- 各 H1 見出しと、次の
#までの内容を 1 つのセクションとします。
セクションのファイル名: {NN}-{sanitized-title}.{ext}。NN はゼロ埋めの連番、sanitized-title はタイトルを小文字にし、スペースをハイフンに置き換え、特殊文字を削除したもの(最大 50 文字)です。プリアンブル:00-preamble.{ext}。セクション前:00-presection.{ext}。参考文献:99-bibliography.{ext}。フロントマター:00-frontmatter.md。
エッジケース:
\section{}コマンドがない場合:本文全体を「01 - 全文」として扱います。- セクションが 1 つだけの場合:並列処理の利点がないことを警告し、それでも PoC を続行します。
- 空のセクション(境界間に内容がない場合):スキップし、ファイルを作成しません。
各セクションを .paper-team/sections/{filename} に書き込みます。manifest.json の sections 配列を、各セクションについて { "id": "NN", "title": "...", "file": "sections/filename", "selected": false, "status": "pending" } で更新します。
ステップ 4:セクションの選択
ガイドモード: 検出されたすべてのセクションを AskUserQuestion の複数選択で提示します。
AskUserQuestion({
question: "Select sections to process with ppw:{skill}:\n选择要用 ppw:{skill} 处理的章节:",
multiSelect: true,
options: [
{ label: "NN - Title", description: "brief description or first line" }
]
})
選択したセクションの selected: true を設定して manifest.json を更新します。
ダイレクトモード: id が "00"(プリアンブル/セクション前/フロントマター)および "99"(参考文献)のセクションを除き、すべてのセクションを自動選択します。それに応じてマニフェストを更新します。選択したセクションをユーザーに表示します。
ステップ 5:PoC セクションの選択
ガイドモード: 選択したセクションを AskUserQuestion(単一選択)で提示します。
AskUserQuestion({
question: "Select one section for proof-of-concept test:\n选择一个章节进行概念验证测试:",
options: [
{ label: "NN - Title", description: "will be processed by a subagent" }
]
})
ダイレクトモード: 選択したセクションのうち、番号 NN が最も小さいセクションを自動選択します。
ステップ 6:PoC ゲートの実行
- 対象の Skill の SKILL.md を
.claude/skills/ppw-{skill}/SKILL.mdから読み込みます。見つからない場合は、エラー「.claude/skills/ppw-{skill}/SKILL.md に Skill ppw:{skill} が見つかりません」と報告して停止します。 - 選択したセクションファイルを
.paper-team/sections/{file}から読み込みます。 - サブエージェントのプロンプトを作成します(このテンプレートをそのまま使用し、プレースホルダーを埋めます)。
You are executing a paper section processing task in direct mode.
## Skill Instructions
{FULL CONTENT OF TARGET SKILL.MD INSERTED HERE}
## Task
Process the following paper section file using the Skill instructions above.
- Input file: .paper-team/sections/{section-filename}
- Mode: direct (skip all AskUserQuestion calls, skip Workflow Memory Step 0)
- Write output to: .paper-team/output/{section-filename}
- Do NOT ask the user any questions. Proceed with defaults.
- Load all required references as specified in the Skill instructions.
- Produce output as if you were running the Skill directly on this section.
- If the Skill normally edits in-place, instead write the processed output to the output path above.
- このプロンプトを使用して、Agent ツール経由で単一のサブエージェントを起動します。
- サブエージェントの完了を待ちます。
manifest.jsonを更新します。poc.section_idを設定し、poc.statusを "completed" に、poc.timestampを現在の ISO タイムスタンプに設定します。該当セクションのstatusを "completed" に設定します。
ステップ 7:PoC の品質確認
ガイドモード: .paper-team/output/{file} からサブエージェントの出力を読み込みます。冒頭の短い抜粋(最初の 20~30 行)をユーザーに表示します。その後、次のように質問します。
AskUserQuestion({
question: "PoC gate: Is the subagent output quality acceptable?\n概念验证:子代理输出质量是否可接受?",
options: [
{ label: "Approved - PoC gate passed", description: "Quality is comparable to main-session execution" },
{ label: "Retry", description: "Re-run PoC on the same section" },
{ label: "Exit", description: "Stop orchestration, quality is not acceptable" }
]
})
- 承認:
manifest.jsonの poc.status を "passed" に更新します。次のメッセージを表示します:「PoC ゲートに合格しました。ppw:team オーケストレーターの検証が完了しました。すべてのセクションを並列処理するには、Phase 20 の並列ディスパッチを使用してください(近日公開)。」 - 再試行: ステップ 6 に戻ります。最大 3 回までループし、その後 Exit を提案します。
- 終了:
manifest.jsonの poc.status を "failed" に更新します。メッセージを表示し、Skill を直接実行するよう提案します:「/ppw:{skill} {file}」
ダイレクトモード: 自動承認し(poc.status を "passed" に設定)、出力の最初の 10 行と成功メッセージを表示します。
出力契約
| 出力 | 形式 | 条件 |
|---|---|---|
section_files | .paper-team/sections/ 内の個別ファイル | Step 3 の後に必ず生成 |
manifest | .paper-team/manifest.json | 必ず生成され、ワークフロー全体を通して更新 |
poc_output | .paper-team/output/ 内の単一ファイル | Step 6 の後に生成 |
エッジケース
| 状況 | 対応 |
|---|---|
論文に \section{} コマンドがない | 本文全体を「01 - Full Body」という1つのセクションとして扱います |
| 論文のセクションが1つだけ | 並列処理にメリットがないことを警告し、PoC に進みます |
| ファイルパスにスペースが含まれる | すべての Read/Write 操作でファイルパスを引用符で囲みます |
.paper-team/ がすでに存在する | 上書きするかキャンセルするかを確認します(ガイド付き)/黙って上書きします(直接実行) |
| サブエージェントが失敗またはタイムアウトする | エラーを報告し、再試行または終了を提案します |
\section*{}(番号なし) | セクション境界として認識します(パターンには省略可能な * が含まれます) |
\section[short]{long}(省略可能な引数) | セクション境界として認識します(パターンには省略可能な [...] が含まれます) |
| 空のセクション(境界間に内容がない) | 空のセクションをスキップし、ファイルを作成しません |
フォールバック
| シナリオ | フォールバック |
|---|---|
| Structured Interaction を利用できない | セクション選択についてプレーンテキストで質問します |
| Agent ツールが失敗する | エラーを報告し、セクションに対して Skill を直接実行するよう提案します |
| 対象の Skill SKILL.md が見つからない | 次のように報告します:「.claude/skills/ppw-{skill}/SKILL.md に Skill ppw:{skill} が見つかりません」 |
.planning/workflow-memory.json が見つからない | 追記する前に [] として作成します |
Skill: ppw-team 規約: references/skill-conventions.md