sync: update from private repo (edc775f2)
CI / build-and-test (push) Has been cancelled

This commit is contained in:
oss-sync
2026-07-06 01:04:12 +00:00
parent 747377bef9
commit b1292e34b2
322 changed files with 28001 additions and 4686 deletions
+15 -71
View File
@@ -5,7 +5,17 @@ This is the reference for the piece YAML format consumed by
`/api/pieces` HTTP layer (`src/bridge/pieces-api.ts` `validatePiece`).
Field names are snake_case in the YAML; the engine maps them to
camelCase internally (see `Movement` in `src/engine/agent-loop.ts`).
camelCase internally (see `Movement` in `src/engine/agent-loop/types.ts`).
> **Tool / edit / SSH availability is NOT declared in pieces.**
> A piece defines only the *movement flow* (persona, instruction, transition
> rules). Which tools an agent may call, whether `Write`/`Edit` are available,
> and which SSH connections it can reach are all decided by the **workspace tool
> policy** (Settings → Tools / SSH), resolved once per job by the worker
> (`resolveWorkspaceTools`) and applied uniformly to every movement. The legacy
> fields `allowed_tools`, `edit`, `shared_tools`, and `allowed_ssh_connections`
> were removed in the tool-consolidation work — if present on a submitted piece
> they are tolerated but ignored.
## Top-level
@@ -17,89 +27,24 @@ camelCase internally (see `Movement` in `src/engine/agent-loop.ts`).
| `initial_movement` | string | yes | must reference a `movements[].name` |
| `triggers.keywords` | string[] | no | classifier hint only |
| `required_mcp` | string[] | no | `[a-z0-9_-]{1,64}` server slugs |
| `shared_tools` | string[] | no | piece-level tools merged into **every** movement's effective `allowed_tools` (union). See below. |
| `model` | string | no | preferred LLM model |
| `movements` | Movement[] | yes | non-empty array |
### `shared_tools`
Tools listed here are added to every movement's allowed set, so they don't have
to be repeated in each `movements[].allowed_tools`. The effective set for a
movement is:
```
shared_tools movements[].allowed_tools META_TOOLS
```
`prepareMovementContext` (`src/engine/piece-runner.ts`) unions the first two
via `mergeToolNames` (de-duplicates, preserves order) into
`movement.allowedTools`; the always-on `META_TOOLS` are added later, when
`getToolDefs` (`src/engine/tools/index.ts`) builds the tool list.
The per-movement gates still apply on top of the union:
- A movement with `edit: false` never exposes `Write`/`Edit`, even if listed in
`shared_tools`.
- SSH tools (`SshExec` etc.) still require the movement's own
`allowed_ssh_connections` — a shared SSH tool is rejected at runtime in any
movement that has not declared connections (defense in depth).
- Unknown tool names are silently dropped by `getToolDefs` (`name in allDefs`).
Handled by two complementary layers (mirrors `required_mcp`): file-backed
pieces are cleaned leniently at load time by `normalizeSharedTools`
(`piece-runner.ts`, drops bad entries + warns), while API writes
(`POST`/`PUT /api/pieces`, `CreatePiece`/`UpdatePiece`) are validated strictly
by `validatePiece` (`pieces-api.ts`, rejects a non-array or non-string entry).
## Movement
| Field | Type | Required | Notes |
|-------|------|----------|-------|
| `name` | string | yes | unique within the piece |
| `edit` | boolean | yes | when true, Write/Edit are exposed |
| `persona` | string | yes | system-prompt persona |
| `instruction` | string | yes | the movement's task description |
| `allowed_tools` | string[] | yes | tool names; `'mcp__*'` wildcard allowed |
| `allowed_commands` | string[] | no | Bash command allowlist (overrides default) |
| `allowed_ssh_connections` | string[] | conditional | see below |
| `rules` | Rule[] | yes | transition rules; may be empty |
| `default_next` | string | no | engine-internal fallback (sentinel-friendly) |
| `max_consecutive_revisits` | number | no | loop-detection threshold override |
## `allowed_ssh_connections`
Per-movement SSH connection allowlist (Phase 4 of the SSH tool integration
| Value | Meaning |
|-------|---------|
| `undefined` (field omitted) | SSH tools reject with `no_allowed_connections_declared`. |
| `[]` (empty array) | SSH tools reject with `no_allowed_connections_declared`. The empty form is preferred over omission when the movement intentionally denies all connections (intent is explicit). |
| `['<connection-id>', ...]` | Only listed connection IDs may be passed to SSH tools. |
| `['*']` | Any registered connection may be passed. Still subject to ownership and grant checks (defense in depth). Use sparingly — typically only `ssh-ops`-style pieces. |
**Required**: If a movement's `allowed_tools` contains any of `SshExec`,
`SshUpload`, or `SshDownload`, then `allowed_ssh_connections` MUST be
present. `validatePieceDef` and `validatePiece` both reject pieces that
omit it for SSH-using movements.
**Format**: each entry must be `'*'` or a lowercase hex/hyphen id with
8+ characters (loose match against `randomUUID()` output).
Example:
```yaml
movements:
- name: ops
edit: false
persona: ops-operator
instruction: Run health checks on production hosts.
allowed_tools: [SshExec, Read]
allowed_ssh_connections:
- 6f9619ff-8b86-d011-b42d-00c04fc964ff
- 7a8b9cde-1234-4567-89ab-cdef12345678
rules:
- condition: all checks pass
next: COMPLETE
```
Tool availability, `Write`/`Edit` (edit) permission, and SSH connection scoping
are runtime values on the in-memory `Movement` (populated from the workspace
policy in `prepareMovementContext`), not YAML fields.
## Rule
@@ -112,8 +57,7 @@ movements:
`COMPLETE` / `ABORT` / `ASK` — those are reachable only through the
`complete` tool (status: `success` / `aborted` / `needs_user_input`).
`default_next` does accept the terminal sentinels because it is an
engine-internal fallback (context overflow, ASK limit, SpawnSubTask
unavailable).
engine-internal fallback (context overflow, ASK limit).
## Validation paths
-4
View File
@@ -16,7 +16,6 @@ triggers:
movements:
- name: delegate_research
edit: true
persona: facilitator
instruction: |
課題を複数の視点に分解し、各視点を delegate で1件ずつ直列に検討させ、
@@ -46,14 +45,12 @@ movements:
- リスクと緩和策
- 各視点の詳細へ相対リンク [perspective-{連番}](./research/perspective-{連番}.md) で繋ぐ
5. output/recommendation.md を書き終えたら verify へ遷移する
allowed_tools: [delegate, Read, Write, Edit, Glob, Grep, WebSearch, WebFetch, BrowseWeb, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, GetYouTubeTranscript, SearchYouTube, SearchAmazon, SearchPlaces, GetDirections, ReverseGeocode, XSearch, XUserPosts, XPostDetail, SearchMicrosoftLearn, FetchMicrosoftLearn, 'mcp__*']
default_next: verify
rules:
- condition: "output/recommendation.md に推奨方針をまとめた"
next: verify
- name: verify
edit: false
persona: reviewer
instruction: |
output/ の成果物を確認する。
@@ -90,7 +87,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "delegate_research", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep]
# default_next is the engine-internal fallback (context overflow / ASK
# limit / SpawnSubTask unavailable). Not exposed to the LLM.
default_next: COMPLETE
-2
View File
@@ -9,7 +9,6 @@ initial_movement: respond
movements:
- name: respond
edit: true
persona: assistant
instruction: |
ユーザーの依頼に対して必要な調査・作業を行い、最終回答を返す。
@@ -72,7 +71,6 @@ movements:
- `result` がそのままユーザーに表示される最終出力。途中のメモや作業ログは入れない
- **ユーザー確認が必要**: `complete({status: "needs_user_input", missing_info: "確認したい内容", why_no_default: "デフォルトで進められない理由"})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "失敗の理由"})`
allowed_tools: [Read, Write, Edit, Glob, Grep, WebSearch, WebFetch, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, ReadExcel, ReadDocx, ReadPPTX, ReadMsg, SQLite, Bash, XSearch, XUserPosts, XPostDetail, XTimeline, XFetchCardMedia, BrowseWeb, SearchPlaces, GetDirections, ReverseGeocode, GetYouTubeTranscript, SearchYouTube, SearchAmazon, TranscribeAudio, ListPieces, GetPiece, CreatePiece, UpdatePiece, SearchMicrosoftLearn, FetchMicrosoftLearn, SearchMicrosoftLearnCache, RefreshMicrosoftLearnCache, ReadToolDoc, AddCalendarEvent, ListCalendarEvents, 'mcp__*']
# default_next is the engine-internal fallback for context overflow / ASK
# limit reached / SpawnSubTask unavailable. It is NOT exposed to the LLM.
default_next: COMPLETE
+1 -7
View File
@@ -10,7 +10,6 @@ initial_movement: process
movements:
- name: process
edit: true
persona: data-engineer
instruction: |
## 最初のステップ: 入力データの把握
@@ -50,7 +49,7 @@ movements:
## スキャン PDF / 画像データの場合
レシートや帳票など画像由来のデータを扱う場合:
- テキスト PDF → ReadPdf で直接読む
- テキスト PDF → Read で直接読む
- スキャン PDF / 画像 → PdfToImages でページ画像化し、ReadImage で内容を読み取る
## 実行
@@ -62,28 +61,24 @@ movements:
- **次の report へ**: `transition({next_step: "report"})`
- **処理対象が特定できずユーザー確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **データが壊れている / 読み取れない / エラー発生で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Write, Bash, Glob, Grep, SQLite, WebSearch, WebFetch, DownloadFile, ReadExcel, ReadDocx, ReadPdf, ReadPPTX, ReadMsg, SplitExcelSheets, PdfToImages, ReadImage, AnnotateImage, TranscribeAudio, ReadToolDoc, 'mcp__*']
default_next: report
rules:
- condition: output/ に結果を書き出した
next: report
- name: report
edit: true
persona: reporter
instruction: |
処理結果を元にレポートを作成し output/ にファイルとして書き出す。
表を含め、分かりやすくまとめる。
必ず Write ツールで output/ にレポートファイルを作成すること。
allowed_tools: [Read, Write, Bash, Glob, Grep, ReadImage, AnnotateImage, ReadPdf, ReadExcel, 'mcp__*']
default_next: verify
rules:
- condition: output/ にレポートを書き出した
next: verify
- name: verify
edit: false
persona: reviewer
instruction: |
output/ の成果物を確認する。
@@ -121,7 +116,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "process", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep, ReadPdf, ReadImage, AnnotateImage, ReadExcel]
default_next: COMPLETE
rules:
- condition: output/ にファイルがない、または内容に不足・誤りがある
-6
View File
@@ -9,7 +9,6 @@ initial_movement: execute
movements:
- name: delegate_research
edit: true
persona: orchestrator
instruction: |
入力把握で立てた分割調査計画に従い、各テーマを delegate で1件ずつ直列に
@@ -37,14 +36,12 @@ movements:
- 全体のまとめと結論を付ける
- 各テーマの詳細へ相対リンク [theme-{連番}](./research/theme-{連番}.md) で繋ぐ
5. output/report.md を書き終えたら verify へ遷移する
allowed_tools: [delegate, Read, Write, Edit, Glob, Grep, WebSearch, WebFetch, BrowseWeb, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, GetYouTubeTranscript, SearchYouTube, SearchAmazon, SearchPlaces, GetDirections, ReverseGeocode, XSearch, XUserPosts, XPostDetail, SearchMicrosoftLearn, FetchMicrosoftLearn, 'mcp__*']
default_next: verify
rules:
- condition: output/report.md に統合レポートを作成した
next: verify
- name: execute
edit: true
persona: worker
instruction: |
## 最初のステップ: 入力把握
@@ -111,7 +108,6 @@ movements:
- **分割調査が効率的 → delegate_research へ**: `transition({next_step: "delegate_research"})`
- **必須情報が不足し確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Write, Bash, Glob, Grep, WebSearch, WebFetch, BrowseWeb, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, ReadMsg, BatchReviewTextWithLLM, MergeReviewedResults, SearchPlaces, GetDirections, ReverseGeocode, GetYouTubeTranscript, SearchYouTube, SearchAmazon, TranscribeAudio, SearchMicrosoftLearn, FetchMicrosoftLearn, SearchMicrosoftLearnCache, RefreshMicrosoftLearnCache, AddCalendarEvent, ListCalendarEvents, 'mcp__*']
default_next: verify
rules:
- condition: 2つ以上の独立したテーマがあり、分割して delegate に任せるのが効率的と判断した
@@ -120,7 +116,6 @@ movements:
next: verify
- name: verify
edit: false
persona: reviewer
instruction: |
成果物を確認する。
@@ -167,7 +162,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "execute", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep, WebSearch, WebFetch, ReadImage, AnnotateImage, ReadPdf, ReadExcel, ReadDocx, ReadPPTX, ReadMsg, SearchMicrosoftLearn, FetchMicrosoftLearn, SearchMicrosoftLearnCache, RefreshMicrosoftLearnCache]
default_next: COMPLETE
rules:
- condition: 成果物がない、または内容に不足・誤りがある(追加質問への回答に検索根拠が不足している場合も含む)
-9
View File
@@ -19,7 +19,6 @@ triggers:
movements:
- name: respond
edit: false
persona: MAESTRO のヘルプアシスタント
instruction: |
あなたは MAESTRO というエージェント実行プラットフォームの使い方や設計についてユーザーの質問に答えるアシスタントです。
@@ -83,14 +82,6 @@ movements:
`aborted` は「聞いても解消しない」ときだけ。
`complete({status: "aborted", abort_reason: "失敗の技術的理由"})`
allowed_tools:
- Read
- Grep
- Glob
- WebSearch
- WebFetch
- ListPieces
- GetPiece
# META_TOOLS が自動追加: ReadToolDoc, CreateChecklist, CheckItem, GetChecklist,
# MissionUpdate, ListUserAssets, RunUserScript, UpdateUserMemory, ReadUserMemory,
# ReadUserAgents, UpdateUserAgents, WriteUserScript,
+8 -12
View File
@@ -11,36 +11,35 @@ initial_movement: process
movements:
- name: process
edit: true
persona: document-specialist
instruction: |
## 最初のステップ: ファイルの把握と前処理
加工に着手する前に、まずファイルを確認し前処理を行う:
1. Glob でワークスペース全体のファイル一覧を確認する(`**/*.xlsx`, `**/*.docx`, `**/*.pptx`, `**/*.pdf`。input/ だけでなくルート直下も含む)
2. ファイル種別ごとの読み取り戦略は ReadToolDoc({ name: "ReadPdf" }) などで確認
2. 読み取りは種別を問わず Read(拡張子で Office/PDF/メールを自動判定)。詳細は ReadToolDoc({ name: "Read" }) で確認
## ファイルサイズに応じた前処理
**Excel (.xlsx)**:
- 小〜中規模 → ReadExcel で直接読む
- 小〜中規模 → Read で直接読むsheet / range も指定可)
- 巨大・複数シート → SplitExcelSheets でシート別ファイル + manifest を生成し、必要なシートだけ Read する
**Word (.docx)**:
- 短〜中規模 → ReadDocx で直接読む
- 短〜中規模 → Read で直接読む
- 長文・章構成あり → SplitDocxSections で見出し単位に分割し、関連セクションだけ Read する
**PowerPoint (.pptx)**:
- ReadPPTX で各スライドのテキスト・表・スピーカーノートを取得
- Read で各スライドのテキスト・表・スピーカーノートを取得
**PDF**:
- まず ReadPdf で読み取りを試みる
- まず Read で読み取りを試みる
- テキストが抽出できた場合 → そのまま加工に進む
- 全ページが空テキスト(スキャン PDF)の場合 → PdfToImages でページ画像化し、ReadImage で内容を確認する(ReadImage は VLM 対応 worker でのみ利用可能)
**Outlook メール (.msg)**:
- ReadMsg で件名・差出人・宛先・本文を取得。添付は input/ に保存される
- 保存された添付は ReadPdf / ReadExcel / ReadImage など種別ごとのツールで開く
- Read で件名・差出人・宛先・本文を取得。添付は input/ に保存される
- 保存された添付は ReadOffice/PDF/テキスト)や ReadImage(画像)で開く
## Office ファイルの加工方針
@@ -67,7 +66,6 @@ movements:
- **追加情報が必要で同じ process を続行**: `transition({next_step: "process", summary: "..."})`
- **対象が特定できずユーザー確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **読み取り不能・対応外フォーマット等の技術的失敗**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Write, Bash, Glob, Grep, ReadExcel, ReadDocx, ReadPdf, ReadPPTX, ReadMsg, SplitExcelSheets, SplitDocxSections, PdfToImages, ReadImage, WebSearch, WebFetch, DownloadFile, SQLite, TranscribeAudio, ReadToolDoc, 'mcp__*']
default_next: verify
rules:
- condition: output/ に成果物を書き出した(または既存ファイルを編集した)
@@ -76,7 +74,6 @@ movements:
next: process
- name: verify
edit: false
persona: reviewer
instruction: |
output/ の成果物を確認する。
@@ -84,7 +81,7 @@ movements:
確認手順:
1. まず Glob で output/ 内のファイル一覧を確認する(既存 Office ファイルの編集の場合はそのファイルも対象)
2. 成果物が1つもなければ「修正が必要」と判断し process に差し戻す
3. 成果物があれば適切なツール(ReadPdf / ReadExcel / ReadDocx / ReadPPTX / Read 等)で内容を確認し、指示通りか・品質は十分かをチェックする
3. 成果物があれば Read(テキスト / Office / PDF を拡張子で自動判定)や ReadImage で内容を確認し、指示通りか・品質は十分かをチェックする
4. 不足や誤りがあれば、`transition({next_step: "process", summary: ...})` で差し戻す。summary は次の形式で書く:
[判定] needs_fix
## 問題点
@@ -116,7 +113,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "process", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep, ReadPdf, ReadImage, ReadExcel, ReadDocx, ReadPPTX, ReadMsg, ReadToolDoc]
default_next: COMPLETE
rules:
- condition: 成果物がない、または内容に不足・誤りがある
+9 -16
View File
@@ -13,7 +13,6 @@ triggers:
movements:
- name: design
edit: false
persona: architect
instruction: |
## Piece 設計フェーズ
@@ -27,9 +26,11 @@ movements:
4. 新規作成が正当化される場合にのみ、以下を整理する:
- 目的(何を自動化するか)
- movement の構成とステップ間の遷移条件
- 各ステップで使うツール(`allowed_tools`
- 入力と出力の形式
ツールの利用可否は Piece では宣言しない。各ワークスペースの「設定 → ツール」
workspace tool policy)で決まり、実行時に全 movement へ一律に適用される。
Piece は movement のフロー(persona / instruction / rules)だけを定義する。
ツールの詳細仕様は ReadToolDoc で確認できる(例: `ReadToolDoc({ name: "delegate" })`)。
### YAML 構造の制約
@@ -45,42 +46,39 @@ movements:
movements:
- name: ステップ名
edit: true/false # Write/Edit を許可するか
persona: 役割名
instruction: |
このステップで行うこと(WHAT を書く。HOW はツールドキュメントに委ねる)
allowed_tools: [使用するツール]
default_next: 次のステップ名 or COMPLETE
rules:
- condition: 遷移条件の説明
next: 遷移先
```
Piece にツール・編集可否(旧 `allowed_tools` / `edit`)や SSH 接続
(旧 `allowed_ssh_connections`)を書く必要はない。これらは「設定 → ツール / SSH」
で決まる。書いても無視される。
### Movement・Rules の設計指針
- `edit: true` にしないと Write/Edit が LLM に提示されない
- `allowed_tools` に載っていないツールは LLM に提示されない — 必要最小限に絞る
- `rules` に明示した遷移先のみ LLM が選択できる
- `default_next` はコンテキスト上限到達・ASK 上限フォールバックなど機械的用途のみ(LLM の選択肢にならない)
- verify movement を設けると品質チェックが可能
- ループ検出: 同じ movement への連続訪問が閾値超過で ABORT されるため、A→B→A の無限循環を避ける
### Persona / Instruction / Allowed_tools の使い分け
### Persona / Instruction の使い分け
- `persona`: そのステップの役割(architect / builder / reviewer など)。LLM の振る舞いのトーンに影響
- `instruction`: WHAT を行うかの指示。具体的・明確に書く。ツールの使い方(HOW)は書かない
- `allowed_tools`: そのステップで実際に必要なツールのみを列挙
## 終了 / 遷移方法
- **設計完了 → build へ**: `transition({next_step: "build", summary: "設計内容のサマリ"})`
- **ユーザーに確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [ListPieces, GetPiece, ReadToolDoc, Read, Glob, Grep, WebSearch, WebFetch]
default_next: build
rules:
- condition: 設計が完了した
next: build
- name: build
edit: false
persona: builder
instruction: |
## Piece 構築フェーズ
@@ -96,7 +94,7 @@ movements:
### 注意事項
- name は英小文字・数字・ハイフンのみ
- instruction は WHAT を具体的に書く(曖昧な指示は避ける)
- allowed_tools には必要なツールを過不足なく列挙する
- ツールの可否は Piece に書かない(設定 → ツールで決まる)
- rules の condition は日本語で明確に書く
- `general`、`chat` は削除不可だが更新は可能
@@ -105,7 +103,6 @@ movements:
- **設計レベルの見直しが必要 → design に戻る**: `transition({next_step: "design", summary: "..."})`
- **ユーザーに確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [ListPieces, GetPiece, CreatePiece, UpdatePiece, ReadToolDoc, Read, Glob, Grep]
default_next: verify
rules:
- condition: Piece の作成・更新が完了した
@@ -114,7 +111,6 @@ movements:
next: design
- name: verify
edit: false
persona: reviewer
instruction: |
## Piece 検証フェーズ
@@ -127,9 +123,7 @@ movements:
- name が英小文字・数字・ハイフンのみか
- description が具体的で、LLM が分類に使えるレベルか
- 各 movement の instruction が具体的で曖昧でないか
- allowed_tools に必要なツールが過不足なく含まれているか
- rules に全ての遷移先が明示されているか(default_next だけに頼っていないか)
- edit: true/false が各 movement の用途に合っているか
- ループの可能性がないか(A→B→A が無限に繰り返される構造でないか)
3. 類似の既存 Piece があれば ListPieces + GetPiece で比較し、一貫性を確認する
@@ -148,7 +142,6 @@ movements:
- build に差し戻し: `transition({next_step: "build", summary: "指摘"})`
- design に戻す: `transition({next_step: "design", summary: "..."})`
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep, ListPieces, GetPiece, ReadToolDoc]
default_next: COMPLETE
rules:
- condition: 修正が必要
-8
View File
@@ -11,7 +11,6 @@ initial_movement: dig
movements:
- name: delegate_research
edit: true
persona: orchestrator
instruction: |
dig で立てた並列調査計画に従い、各テーマを delegate で1件ずつ直列に深掘りさせ、
@@ -38,14 +37,12 @@ movements:
- 全体のまとめと考察を付ける
- 各テーマの詳細へ相対リンク [theme-{連番}](./research/theme-{連番}.md) で繋ぐ
5. output/report.md を書き終えたら verify へ遷移する
allowed_tools: [delegate, Read, Write, Edit, Glob, Grep, WebSearch, WebFetch, BrowseWeb, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, GetYouTubeTranscript, SearchYouTube, SearchAmazon, SearchPlaces, GetDirections, ReverseGeocode, XSearch, XUserPosts, XPostDetail, SearchMicrosoftLearn, FetchMicrosoftLearn, 'mcp__*']
default_next: verify
rules:
- condition: output/report.md に統合レポートを作成した
next: verify
- name: dig
edit: true
persona: researcher
instruction: |
## 最初のステップ: 入力把握と調査計画
@@ -108,7 +105,6 @@ movements:
- **追加調査のため同じ dig を続行**: `transition({next_step: "dig"})`
- **対象が曖昧で確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Write, Bash, Glob, Grep, WebSearch, WebFetch, BrowseWeb, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, BatchReviewTextWithLLM, MergeReviewedResults, SearchPlaces, GetDirections, ReverseGeocode, GetYouTubeTranscript, SearchYouTube, SearchAmazon, TranscribeAudio, XSearch, XUserPosts, XPostDetail, XTimeline, XFetchCardMedia, SearchMicrosoftLearn, FetchMicrosoftLearn, SearchMicrosoftLearnCache, RefreshMicrosoftLearnCache, 'mcp__*']
default_next: analyze
rules:
- condition: 2つ以上の独立した調査テーマがあり、分割して delegate に任せるのが効率的と判断した
@@ -119,7 +115,6 @@ movements:
next: dig
- name: analyze
edit: true
persona: analyst
instruction: |
収集した情報を分析し、調査レポートを output/ に作成する。
@@ -141,7 +136,6 @@ movements:
画像があるのにテキストだけのレポートにしないこと。
レポート作成中に追加で必要な図・グラフを見つけた場合も DownloadFile で収集して埋め込む。
allowed_tools: [Read, Write, Bash, Glob, Grep, WebSearch, WebFetch, BrowseWeb, DownloadFile, ReadImage, AnnotateImage, ReadPdf, PdfToImages, BatchReviewTextWithLLM, MergeReviewedResults, SearchPlaces, GetDirections, ReverseGeocode, GetYouTubeTranscript, SearchYouTube, SearchAmazon, TranscribeAudio, XSearch, XUserPosts, XPostDetail, XTimeline, XFetchCardMedia, SearchMicrosoftLearn, FetchMicrosoftLearn, SearchMicrosoftLearnCache, RefreshMicrosoftLearnCache, 'mcp__*']
default_next: verify
rules:
- condition: output/ にレポートを書き出した
@@ -150,7 +144,6 @@ movements:
next: dig
- name: verify
edit: false
persona: reviewer
instruction: |
output/ のレポートを確認する。
@@ -194,7 +187,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "analyze", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep, WebSearch, WebFetch, ReadImage, AnnotateImage, ReadPdf, ReadExcel, ReadDocx, ReadPPTX, SearchMicrosoftLearn, FetchMicrosoftLearn, SearchMicrosoftLearnCache, RefreshMicrosoftLearnCache]
default_next: COMPLETE
rules:
- condition: output/ にファイルがない、または内容に不足がある(追加質問への回答に検索根拠が不足している場合も含む)
-27
View File
@@ -24,7 +24,6 @@ initial_movement: process
movements:
- name: process
edit: true
persona: slide-designer
instruction: |
## 最初のステップ: 入力把握と構成立案
@@ -100,26 +99,6 @@ movements:
- **追加情報が必要で同じ process を続行**: `transition({next_step: "process"})`
- **題材・構成が曖昧で確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗 (pptxgenjs エラー等)**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools:
- Read
- Write
- Edit
- Glob
- Grep
- SetTheme
- AddSlide
- BuildPptx
- ResetSlides
- WebSearch
- WebFetch
- DownloadFile
- ReadImage
- ReadPdf
- ReadDocx
- ReadExcel
- ReadPPTX
- ReadToolDoc
- 'mcp__*'
default_next: verify
rules:
- condition: SetTheme + AddSlide × N + BuildPptx を実行し output/slides.pptx を生成済み
@@ -128,7 +107,6 @@ movements:
next: process
- name: verify
edit: false
persona: reviewer
instruction: |
output/ の成果物を確認する。
@@ -178,11 +156,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "process", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools:
- Read
- Glob
- Grep
- ReadToolDoc
default_next: COMPLETE
rules:
- condition: 成果物が不足または内容に誤りがある
-2
View File
@@ -13,7 +13,6 @@ initial_movement: orchestrate
movements:
- name: orchestrate
edit: true
persona: researcher
instruction: |
## このタスクの進め方(オーケストレーター)
@@ -61,6 +60,5 @@ movements:
### 原則
- 1投稿につき delegate は1回。深掘りの実作業はサブに任せ、あなたは取得・選別・統合に徹する。
- 取得できなかった事実は正直に書く。データを捏造しない。
allowed_tools: [XSearch, XUserPosts, XPostDetail, XTimeline, XFetchCardMedia, BrowseWeb, WebFetch, WebSearch, Read, Write, Edit, Glob, Grep, DownloadFile, delegate, 'mcp__*']
default_next: COMPLETE
rules: []
-6
View File
@@ -10,7 +10,6 @@ initial_movement: gather
movements:
- name: gather
edit: true
persona: researcher
instruction: |
## 調査計画
@@ -57,7 +56,6 @@ movements:
- **追加収集のため同じ gather を続行**: `transition({next_step: "gather"})`
- **対象が曖昧で確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [XSearch, XUserPosts, XPostDetail, XTimeline, XFetchCardMedia, BrowseWeb, WebFetch, WebSearch, Read, Write, Edit, Glob, Grep, DownloadFile, 'mcp__*']
default_next: analyze
rules:
- condition: 追加収集が必要(別のSNS、追加クエリ等)
@@ -66,7 +64,6 @@ movements:
next: analyze
- name: analyze
edit: true
persona: analyst
instruction: |
output/raw/ の収集データを読み込み、分析してレポートを作成する。
@@ -91,7 +88,6 @@ movements:
情報が不足している場合は gather に戻る(追加の検索クエリを明示すること)。
verify からの差し戻しがある場合は、指摘された不足点・期待する修正を優先的に解消すること。
allowed_tools: [Read, Write, Edit, Glob, Grep, WebSearch, WebFetch, DownloadFile, BatchReviewTextWithLLM, MergeReviewedResults, 'mcp__*']
default_next: verify
rules:
- condition: output/report.md にレポートを書き出した
@@ -100,7 +96,6 @@ movements:
next: gather
- name: verify
edit: false
persona: supervisor
instruction: |
output/ のレポートを確認する。
@@ -141,7 +136,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "analyze", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep]
default_next: COMPLETE
rules:
- condition: output/ にファイルがない、または内容に不足がある
+1 -4
View File
@@ -19,7 +19,6 @@ initial_movement: interact
movements:
- name: interact
edit: true
persona: ops-operator
instruction: |
## 詳細ドキュメント (必ず最初に読む)
@@ -80,8 +79,6 @@ movements:
## 終了
- 完了: complete({status: "success", result: "..."})
- 中断: complete({status: "aborted", abort_reason: "..."})
- 確認待ち: complete({status: "needs_user_input", missing_info: "..."})
allowed_tools: [SshConsoleEnsure, SshConsoleSend, SshConsoleRun, SshConsoleSnapshot, SshUpload, SshDownload, SshListConnections, WebSearch, WebFetch, DownloadFile, BrowseWeb, Read, Write, Bash, Glob, Grep]
allowed_ssh_connections: ['*']
- 確認待ち: complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})
default_next: COMPLETE
rules: []
+3 -8
View File
@@ -21,7 +21,6 @@ initial_movement: execute
movements:
- name: execute
edit: true
persona: ops-operator
instruction: |
## 最初のステップ: タスク把握と接続の選定
@@ -32,7 +31,7 @@ movements:
- Config push: ローカルで作成・編集した設定を SshUpload で配信 → SshExec でリロード
- Log fetch: SshDownload でリモートのログを取得 → ローカルで grep / 集計 / 分析
3. タスクで指定された SSH 接続 ID を確認する。指定が無く接続候補が複数ある場合は
`complete({status: "needs_user_input", missing_info: "どの SSH 接続を使うか"})` で確認する
`complete({status: "needs_user_input", missing_info: "どの SSH 接続を使うか", why_no_default: "接続候補が複数あり、推測で選ぶと誤った host を操作する恐れがあるため"})` で確認する
## SshExec の使い方
@@ -54,11 +53,11 @@ movements:
## エラーハンドリング (詳細は docs/tools/ssh-tools.md の error code 表)
- `host_key_not_verified`: TOFU 未完了。
`complete({status: "needs_user_input", missing_info: "SSH 接続 <id> の host key を UI で検証してください (Settings → User Folder → SSH Connections → Test)"})` で停止する
`complete({status: "needs_user_input", missing_info: "SSH 接続 <id> の host key を UI で検証してください (Settings → User Folder → SSH Connections → Test)", why_no_default: "host key 未検証のまま接続すると MITM のリスクがあり、エージェント側では信頼判断できないため"})` で停止する
- `host_key_mismatch`: MITM 疑い。**自動でリトライしない**。
`complete({status: "aborted", abort_reason: "host_key_mismatch: <details>"})` で停止する
- `abuse_locked`: 連続失敗で接続がロック。
`complete({status: "needs_user_input", missing_info: "接続が <until> までロックされています。admin に force-unlock を依頼してください"})` で停止する
`complete({status: "needs_user_input", missing_info: "接続が <until> までロックされています。admin に force-unlock を依頼してください", why_no_default: "ロック解除には admin 権限が必要で、エージェントでは解除も迂回もできないため"})` で停止する
- `no_grant` / `access_denied`: 権限不足。admin に grant 追加を依頼するよう user に報告して停止する
- `connect_timeout` / `auth_failed` 等の一時失敗: 同じ command を最大 2 回まで再試行。
それ以上は `complete({status: "aborted", abort_reason: "..."})`
@@ -85,15 +84,12 @@ movements:
- **次の verify へ**: `transition({next_step: "verify"})`
- **必要情報不足で停止**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **致命的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [SshExec, SshUpload, SshDownload, SshListConnections, WebSearch, WebFetch, DownloadFile, BrowseWeb, Read, Write, Bash, Glob, Grep]
allowed_ssh_connections: ['*']
default_next: verify
rules:
- condition: output/report.md に ops 結果をまとめた
next: verify
- name: verify
edit: false
persona: reviewer
instruction: |
ops 結果を確認する。
@@ -132,7 +128,6 @@ movements:
- 修正必要: `transition({next_step: "execute", summary: "差し戻し指摘"})`
- 機密漏れ: `complete({status: "aborted", abort_reason: "secret_leak: ..."})`
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Glob, Grep]
default_next: COMPLETE
rules:
- condition: ops 報告が不足している
-4
View File
@@ -14,7 +14,6 @@ triggers:
movements:
- name: build
edit: true
persona: builder
instruction: |
## ワークスペース・アプリ作成フェーズ
@@ -42,14 +41,12 @@ movements:
- **作成・更新できた → verify へ**: `transition({next_step: "verify", summary: "アプリ名と概要"})`
- **依頼が曖昧で作れない**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Write, Edit, Glob, Grep, Bash, ReadToolDoc, ReadImage, TestWorkspaceApp]
default_next: verify
rules:
- condition: アプリの作成・更新が完了した
next: verify
- name: verify
edit: true
persona: reviewer
instruction: |
## 検証フェーズ(E2E ゲート必須)
@@ -97,7 +94,6 @@ movements:
(「作成しました」等のメタ説明ではなく、アプリの内容そのものを書く)。
- **E2E 不合格・設計上の問題 → build へ**: `transition({next_step: "build", summary: "具体的な失敗内容"})`
- **技術的失敗で続行不能**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools: [Read, Write, Edit, Glob, Grep, Bash, ReadToolDoc, TestWorkspaceApp]
default_next: COMPLETE
rules:
- condition: 作り直しが必要(E2E 不合格または設計上の問題)
-32
View File
@@ -14,7 +14,6 @@ max_movements: 999
initial_movement: collect
movements:
- name: collect
edit: true
persona: researcher
instruction: |
X (Twitter) から AI 技術関連のツイートを収集し、深掘り調査を行う。
@@ -57,29 +56,11 @@ movements:
- **次の compose へ**: `transition({next_step: "compose"})`
- **対象が曖昧で確認が必要**: `complete({status: "needs_user_input", missing_info: "...", why_no_default: "..."})`
- **技術的失敗で打ち切り**: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools:
- XSearch
- XUserPosts
- XPostDetail
- XTimeline
- XFetchCardMedia
- BrowseWeb
- WebFetch
- WebSearch
- Read
- Write
- Edit
- Glob
- Grep
- Bash
- DownloadFile
- 'mcp__*'
default_next: compose
rules:
- condition: 十分な情報を収集し output/raw/ に書き出した
next: compose
- name: compose
edit: true
persona: writer
instruction: |
output/raw/ の収集データから、articles JSON とヘッドライン記事 Markdown を生成する。
@@ -117,14 +98,6 @@ movements:
## verify 由来の指摘がある場合
「これまでのレビュー指摘」がある場合は、指摘事項を漏れなく解消すること。
allowed_tools:
- Read
- Write
- Edit
- Glob
- Grep
- Bash
- 'mcp__*'
default_next: verify
rules:
- condition: 2ファイル(articles JSON + headline MD)を書き出した
@@ -132,7 +105,6 @@ movements:
- condition: 情報が不十分で追加収集が必要(output/raw/ が空を含む)
next: collect
- name: verify
edit: false
persona: supervisor
instruction: |
出力ファイルの存在とフォーマットを確認する。
@@ -183,10 +155,6 @@ movements:
- 合格: `complete({status: "success", result: "ユーザー向け最終回答"})`
- 修正必要: `transition({next_step: "compose", summary: "差し戻し指摘"})` (上記形式で)
- 技術的失敗: `complete({status: "aborted", abort_reason: "..."})`
allowed_tools:
- Read
- Glob
- Grep
default_next: COMPLETE
rules:
- condition: ファイルがない、またはフォーマットに不足がある