🚀 flyto-core
デバッグ可能な自動化エンジンです。すべてのステップをトレースし、任意のポイントから再実行できます。
🚀 クイックスタート
30秒で試す
pip install flyto-core[browser] && playwright install chromium
flyto recipe competitor-intel --url https://github.com/pricing
Step 1/12 browser.launch ✓ 420ms
Step 2/12 browser.goto ✓ 1,203ms
Step 3/12 browser.evaluate ✓ 89ms
Step 4/12 browser.screenshot ✓ 1,847ms → saved intel-desktop.png
Step 5/12 browser.viewport ✓ 12ms → 390×844
Step 6/12 browser.screenshot ✓ 1,621ms → saved intel-mobile.png
Step 7/12 browser.viewport ✓ 8ms → 1280×720
Step 8/12 browser.performance ✓ 5,012ms → Web Vitals captured
Step 9/12 browser.evaluate ✓ 45ms
Step 10/12 browser.evaluate ✓ 11ms
Step 11/12 file.write ✓ 3ms → saved intel-report.json
Step 12/12 browser.close ✓ 67ms
✓ Done in 10.3s — 12/12 steps passed
スクリーンショットが取得され、パフォーマンスメトリクスが抽出され、JSONレポートが保存されます。すべてのステップがトレースされます。
ステップ8が失敗した場合、どうなりますか?
シェルスクリプトでは全体を再実行しますが、flyto-coreでは以下のコマンドを使用します。
flyto replay --from-step 8
ステップ1から7は瞬時に完了し、ステップ8のみが再実行されます。完全なコンテキストが保持されます。
✨ 主な機能
- 実行トレース — すべてのステップの構造化された記録:入力、出力、タイミング、ステータス
- 再実行 — 元の(または変更された)コンテキストで任意のステップから再実行
- ブレークポイント — 任意のステップで実行を一時停止し、状態を検査し、再開
- 証拠スナップショット — 各ステップの境界前後の完全な状態
- データの流れ追跡 — ステップ間のデータフローを追跡し、依存関係グラフを構築
- タイムアウト保護 — ワークフローレベルと各ステップのタイムアウト保護を設定可能
📦 インストール
pip install flyto-core
pip install flyto-core[browser]
playwright install chromium
💻 使用例
基本的な使用法
これはPythonでの競合他社の価格分析の例です。
Python — 85行
import asyncio, json, time
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("https://competitor.com/pricing")
prices = await page.evaluate("""() => {
const cards = document.querySelectorAll(
'[class*="price"]'
);
return Array.from(cards).map(
c => c.textContent.trim()
);
}""")
await page.screenshot(
path="desktop.png", full_page=True
)
await page.set_viewport_size(
{"width": 390, "height": 844}
)
await page.screenshot(
path="mobile.png", full_page=True
)
perf = await page.evaluate("""() => {
const nav = performance
.getEntriesByType('navigation')[0];
return {
ttfb: nav.responseStart,
loaded: nav.loadEventEnd
};
}""")
report = {
"prices": prices,
"performance": perf,
}
with open("report.json", "w") as f:
json.dump(report, f, indent=2)
await browser.close()
asyncio.run(main())
flyto-core — 12ステップ
name: Competitor Intel
steps:
- id: launch
module: browser.launch
- id: navigate
module: browser.goto
params: { url: "{{url}}" }
- id: prices
module: browser.evaluate
params:
script: |
JSON.stringify([
...document.querySelectorAll(
'[class*="price"]'
)
].map(e => e.textContent.trim()))
- id: desktop_shot
module: browser.screenshot
params: { path: desktop.png, full_page: true }
- id: mobile
module: browser.viewport
params: { width: 390, height: 844 }
- id: mobile_shot
module: browser.screenshot
params: { path: mobile.png, full_page: true }
- id: perf
module: browser.performance
- id: save
module: file.write
params:
path: report.json
content: "${prices.result}"
- id: close
module: browser.close
高度な使用法
3つのレシピを今すぐ試す
flyto recipe competitor-intel --url https://competitor.com/pricing
flyto recipe full-audit --url https://your-site.com
flyto recipe scrape-to-csv --url https://news.ycombinator.com --selector ".titleline a"
すべてのレシピはトレースされ、すべての実行は再実行可能です。すべての32のレシピを表示 →
📚 ドキュメント
412のモジュール、78のカテゴリ
| カテゴリ |
数 |
例 |
browser.* |
38 |
launch, goto, click, extract, screenshot, fill forms, wait |
flow.* |
24 |
switch, loop, branch, parallel, retry, circuit breaker, rate limit |
array.* |
15 |
filter, sort, map, reduce, unique, chunk, flatten |
string.* |
11 |
reverse, uppercase, split, replace, trim, slugify, template |
api.* |
11 |
OpenAI, Anthropic, Gemini, Notion, Slack, Telegram |
object.* |
10 |
keys, values, merge, pick, omit, get, set, flatten |
image.* |
9 |
resize, convert, crop, rotate, watermark, OCR, compress |
data.* |
8 |
json/xml/yaml/csv parse and generate |
file.* |
8 |
read, write, copy, move, delete, exists, edit, diff |
stats.* |
8 |
mean, median, percentile, correlation, standard deviation |
validate.* |
7 |
email, url, json, phone, credit card |
docker.* |
6 |
run, ps, logs, stop, build, inspect |
archive.* |
6 |
zip create/extract, tar create/extract, gzip, gunzip |
math.* |
6 |
calculate, round, ceil, floor, power, abs |
k8s.* |
5 |
get_pods, apply, logs, scale, describe |
crypto.* |
4 |
AES encrypt/decrypt, JWT create/verify |
network.* |
4 |
ping, traceroute, whois, port scan |
pdf.* |
4 |
parse, extract text, merge, compress |
aws.s3.* |
4 |
upload, download, list, delete |
google.* |
4 |
Gmail send/search, Calendar create/list events |
cache.* |
4 |
get, set, delete, clear (memory + Redis) |
ssh.* |
3 |
remote exec, SFTP upload, SFTP download |
git.* |
3 |
clone, commit, diff |
sandbox.* |
3 |
execute Python, Shell, JavaScript |
dns.* |
1 |
DNS lookup (A, AAAA, MX, CNAME, TXT, NS) |
monitor.* |
1 |
HTTP health check with SSL cert verification |
すべてのモジュール、パラメータ、および説明については、Full Module Catalog を参照してください。
これは他とどう違うのですか?
|
Playwright / Selenium |
シェルスクリプト |
flyto-core |
| ステップ8が失敗した場合 |
全体を再実行 |
全体を再実行 |
flyto replay --from-step 8 |
| ステップ3で何が起こったか? |
print()を追加して再実行 |
echoを追加して再実行 |
完全なトレース:入力、出力、タイミング |
| ブラウザ + API + ファイル入出力 |
グルーコードを記述 |
3つの言語 |
すべて組み込まれています |
| チームと共有する場合 |
"私のリポジトリをクローンしてください" |
"私のリポジトリをクローンしてください" |
pip install flyto-core |
| CIで実行する場合 |
pytest/bashでラップ |
脆弱 |
flyto run workflow.yaml |
使い方
CLI — ターミナルからワークフローを実行
flyto recipe site-audit --url https://example.com
flyto run my-workflow.yaml
flyto recipes
MCP Server — Claude Code、Cursor、Windsurf用
pip install flyto-core
claude mcp add flyto-core -- python -m core.mcp_server
または、MCP設定に追加します。
{
"mcpServers": {
"flyto-core": {
"command": "python",
"args": ["-m", "core.mcp_server"]
}
}
}
AIがすべてのモジュールをツールとして使用できるようになります。
HTTP API — 統合とリモート実行用
pip install flyto-core[api]
flyto serve
| エンドポイント |
目的 |
POST /v1/workflow/run |
証拠とトレース付きでワークフローを実行 |
POST /v1/workflow/{id}/replay/{step} |
任意のステップから再実行 |
POST /v1/execute |
単一のモジュールを実行 |
GET /v1/modules |
すべてのモジュールを検索 |
POST /mcp |
MCP Streamable HTTP transport |
Python API — プログラムからの使用
import asyncio
from core.modules.registry import ModuleRegistry
async def main():
result = await ModuleRegistry.execute(
"string.reverse",
params={"text": "Hello"},
context={}
)
print(result)
asyncio.run(main())
30以上の組み込みレシピ
コードを書く必要はありません。すべてのレシピはYAMLワークフローテンプレートです。
flyto recipes
flyto recipe full-audit --url https://example.com
flyto recipe competitor-intel --url https://github.com/pricing
flyto recipe site-audit --url https://example.com
flyto recipe web-perf --url https://example.com
flyto recipe login-test --url https://myapp.com/login --username user --password pass --success_selector .dashboard
flyto recipe form-fill --url https://myapp.com/form --data '{"email":"test@example.com"}'
flyto recipe screenshot --url https://example.com
flyto recipe responsive-report --url https://example.com
flyto recipe page-to-pdf --url https://example.com
flyto recipe visual-snapshot --url https://example.com
flyto recipe webpage-archive --url https://example.com
flyto recipe scrape-page --url https://example.com --selector h1
flyto recipe scrape-links --url https://example.com
flyto recipe scrape-table --url https://en.wikipedia.org/wiki/YAML --selector .wikitable
flyto recipe stock-price --symbol AAPL
flyto recipe ocr --input scan.png
flyto recipe csv-to-json --input data.csv
flyto recipe image-resize --input photo.jpg --width 800
flyto recipe image-convert --input photo.png --format webp
flyto recipe port-scan --host example.com
flyto recipe whois --domain example.com
flyto recipe monitor-site --url https://myapp.com
flyto recipe docker-ps
flyto recipe git-changelog
flyto recipe scrape-to-slack --url https://example.com --selector h1 --webhook $SLACK_URL
flyto recipe github-issue --url https://example.com --owner me --repo my-app --title "Bug" --token $GITHUB_TOKEN
各レシピはYAMLワークフローテンプレートです。flyto recipe <name> --help を実行して、すべてのオプションを表示します。
完全なドキュメントについては、docs/RECIPES.md を参照してください。
独自のワークフローを作成する
レシピは単なるYAMLファイルです。独自のレシピを作成しましょう。
name: price-monitor
steps:
- id: open
module: browser.launch
params: { headless: true }
- id: page
module: browser.goto
params: { url: "https://competitor.com/pricing" }
- id: prices
module: browser.evaluate
params:
script: |
JSON.stringify([...document.querySelectorAll('.price')].map(e => e.textContent))
- id: save
module: file.write
params: { path: "prices.json", content: "${prices.result}" }
- id: close
module: browser.close
flyto run price-monitor.yaml
すべての実行は実行トレースと状態スナップショットを生成します。ステップ3が失敗した場合、ステップ3から再実行できます — 全体を再実行する必要はありません。
モジュール作成者向け
from core.modules.registry import register_module
from core.modules.schema import compose, presets
@register_module(
module_id='string.reverse',
version='1.0.0',
category='string',
label='Reverse String',
description='Reverse the characters in a string',
params_schema=compose(presets.INPUT_TEXT(required=True)),
output_schema={'result': {'type': 'string', 'description': 'Reversed string'}},
)
async def string_reverse(context):
text = str(context['params']['text'])
return {'ok': True, 'data': {'result': text[::-1]}}
完全なガイドについては、Module Specification を参照してください。
コントリビュートについて
コントリビューションを歓迎します!ガイドラインについては、CONTRIBUTING.md を参照してください。
セキュリティ
セキュリティの脆弱性を見つけた場合は、security@flyto.dev まで報告してください。
セキュリティポリシーについては、SECURITY.md を参照してください。
📄 ライセンス
Apache License 2.0 — 個人および商用利用に無料です。
デスクトップGUIは flyto2.com で利用できます。