1仕組みと動作原理
コアは Node スクリプトです。Codex の生成画像ディレクトリをスキャンし、画像を選択して item_add ペイロードを組み立て、画像パスとプロンプトを Eagle ライブラリに書き込みます。
Archive images generated by Codex into Eagle and preserve the prompt as searchable metadata.
Eagle への接続経路は 2 つあります。デフォルトではローカル HTTP ループバックエンドポイントを使用し、ローカルの Codex 設定に Eagle stdio MCP エントリがある場合は自動的に stdio(子プロセスの spawn)に切り替わります。
Stdio mode: the script reads the current user's `~/.codex/config.toml`, prefers `[mcp_servers.eagle]`, and can auto-detect other Eagle-like stdio MCP entries. Use `--transport http` to force the legacy HTTP path.
HTTP 経路は、ローカルループバックアドレスに対して POST /api/tools/call を行い、リクエストボディは {tool, params} の JSON です。
path: '/api/tools/call',
stdio 経路は child_process.spawn を使用して設定内のコマンドを起動し、ホストの process.env 全体を子プロセスに透過させます(設定内の env をさらに重畳)。
this.child = spawn(this.config.command, this.config.args || [], {
フォルダーの解決は名前ではなく「正確な親子パス」に基づいて行われます。まずルートディレクトリを上方向へ解決し、次にルートの直下でのみ name+parentId で日付ディレクトリを検索することで、同名フォルダー間の混同を防ぎます。
- Folder safety: resolve folders by exact parent-child path, not by name alone.
並行処理の安全性にはローカルファイルロック(os.tmpdir 配下のパラメータハッシュ名を持つ lock ディレクトリ)を使用し、「ディレクトリ確認 → ディレクトリ作成」のクリティカルセクションを直列化します。
const lockDir = path.join(os.tmpdir(), `codex-image-to-eagle-${hashKey(key)}.lock`);
プロンプトと来歴情報は固定テキストテンプレートとして Eagle の annotation フィールドに書き込まれ、検索可能な振り返り用メタデータを構成します。
'- source: Codex',
冪等性と重複防止:同一ルートディレクトリ下に同名の日付ディレクトリが既に複数存在する場合、新しく作成するのではなく最も古いものを再利用し、重複を報告します。
If more than one matching date folder already exists under the same root, reuse the oldest existing folder ID and report the duplicate instead of creating another one.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | Node.js(无 npm 依赖,仅内置 fs/path/http/os/child_process) |
| network | Eagle MCP Server(本地回环 HTTP) |
| network | Eagle MCP Server(本地回环,README 侧写为 localhost 同端口) |
| cli | Eagle 桌面应用 + Eagle MCP 插件(第三方,必须运行才能写入) |
| cli | stdio MCP 代理子进程(从 ~/.codex/config.toml 解析出的 command/args,如 mcp-proxy.js) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: node scripts/archive-codex-image-to-eagle.js(パッケージ同梱スクリプト、エージェントが Bash(node *) 経由で実行)
- 网络端点: 宣言された外部ネットワークアクセス: ローカルループバックのみ: HTTP POST http://127.0.0.1:41596/api/tools/call(EAGLE_SERVER_URL で変更可能)
- 本地工作目录: ファイルの読み書きと成果物の出力: ローカルのみ: ディレクトリ作成を直列化するために os.tmpdir() 配下に <hash>.lock ディレクトリを作成/削除するのみ。画像書き込みや元ファイルの変更は行わない
5二重目の独立検証
- [ok] 每条外部依赖的反查 — Node 依赖:脚本 require 仅 fs/path/http/os/child_process,无 node_modules、无 package.json;Eagle 回环端点:DEFAULT_SERVER 常量 + callTool() 的 http.request 两处互证;stdio 子进程:spawn 调用点 + README 的 mcp-proxy.js 示例互证。
- [ok] 是否有被遗漏的网络调用 — 全文件仅 import http 一处,唯一 http.request 出现在 httpRequest(),被 callTool() 以 DEFAULT_SERVER 构造的 hostname/port 使用;无 fetch/https/axios/WebSocket。
- [ok] 凭证读取结论的反例搜索 — process.env 命中集中在配置项(图片目录/服务地址/文件夹 ID/MCP 参数/锁超时),未见读取密钥文件、keychain、.env 或打印敏感值;但 spawn 透传全量 env 确认成立,故归入橙档依据之一。
- [ok] 文件夹安全规则 vs 代码实现 — SKILL 第 1–5 条规则均可在代码定位:fixedFolderId 短路、folder_get(getAllHierarchy/fullDetails)、findFolderByNameAndParent(name+parentId)、folder_create(parentId)、复用最旧(按 createdAt 升序取 matches[0])。
- [ok] 默认服务地址描述一致性 — SKILL.md/脚本为 127.0.0.1:41596 并说明优先 IPv4 回环的原因;README 写 localhost:41596。二者同端口不同写法,已分别作为独立条目取证,不视为出入。
- [ok] 功能声明与实现相符度 — description 承诺的 save/archive/import/sync + prompt/tags/folders 全部有对应实现(item_add 载荷含 tags/items、annotation、folders);『不泛化为任意素材库迁移』与代码仅面向 Eagle 相符。
- [ok] dry-run 是否真的不写库 — resolveFolderPath() 在 dryRun 时直接返回伪造的 folder-path 字符串,main() 在 dryRun 分支提前 return,未调用 item_add —— 预览路径无写入,结论成立。
6結論
5914cacc5fbf46dc…