diff --git a/mcp/src/mcp-handler.ts b/mcp/src/mcp-handler.ts index 9492bd2..02abf1d 100644 --- a/mcp/src/mcp-handler.ts +++ b/mcp/src/mcp-handler.ts @@ -22,13 +22,20 @@ export async function handleMcpRequest( // instructions 是唯一「AI 一連上就必看」的欄位 ⇒ 開場就指路,不依賴任何查詢成功。 // ⚠️ 這段是靜態常數:即使 KBDB 掛了、藏書地圖抓不到,它也必須出現(鐵律:不擋連線)。 const startHere = [ + "# Arcrun — 你已經配備了這套工具,別上網找", + "", + "**Arcrun 是什麼**:跑在 Cloudflare 上的工作流引擎(類 n8n)。你用 `>>` 寫「意圖」,", + "系統告訴你有哪些現成零件/recipe 可用,你只要填 payload——**不必自己寫程式**。", + "**你現在就有完整能力**:查零件、查 recipe、看實跑過的 workflow、部署、觸發、看執行紀錄。", + "⚠️ **不要上網搜 Arcrun 文件**(網路上沒有/會過時)。答案都在下面的工具裡。", + "", "【先讀這裡】要在 Arcrun 上做任何事(用戶說「幫我用 Arcrun 做 X」),**照這個順序**:", "", "1. `arcrun_get_skill('write_intent_workflow')` — **必讀第一支**。", " 教你用 `>>` 寫「意圖工作流」。你**不需要先知道有哪些零件**,先寫意圖。", "2. `arcrun_whoami()` — 確認連到哪個帳號(勿自行 curl 猜帳號 URL)。", "3. 把意圖丟 `POST /cypher/search` 或 `arcrun_validate_yaml` — 系統告訴你哪些零件存在。", - "4. `arcrun_list_skills()` — 看有沒有更貼近你這件事的 skill(watcher/RAG/debug…)。", + "4. 卡住/不知道該查什麼 → `arcrun_get_skill('INDEX')`(全館導航:什麼問題查哪裡+已知的坑)。", "5. 缺零件時:缺 API → 寫 recipe(`arcrun_recipe_push`);缺能力 → 投稿零件 PR。", " 🔴 **不要因為查不到零件就改寫成 `code` 節點**——那叫「腹語術」(表面用 Arcrun、", " 實際全寫 JS)。`code` 只用於局部整形(例:剝掉 LLM 回應的雜訊)。", diff --git a/registry/skills/INDEX.md b/registry/skills/INDEX.md new file mode 100644 index 0000000..cbaab03 --- /dev/null +++ b/registry/skills/INDEX.md @@ -0,0 +1,63 @@ +# Skill: INDEX(Arcrun 導航:什麼問題查哪裡) + +> **這支的定位=LLM wiki 的 `INDEX.md`**(leo 2026-07-30 點破: +> 「整個 arcrun instruction 很像 LLM wiki…它會拿到一個 index 把所有文件說明都塞給它, +> 它不會就可以查,範本全部寫在裡面」)。 +> +> **push vs pull**(照 wiki 的分法): +> - **push**=MCP 連線時的 `instructions`(AI 一定看到,不看就出事的三句) +> - **pull**=本檔。AI 卡住時 `arcrun_get_skill('INDEX')` 拿到全館導航 + +--- + +## 一、我現在該查哪個?(照症狀找) + +| 你的處境 | 用這個 | 工具 | +|---|---|---| +| **要開始寫 workflow,但不知道有什麼零件** | `write_intent_workflow` | `arcrun_get_skill('write_intent_workflow')` | +| 想「每 X 分鐘掃 Y,找到就處理」 | `build_watcher_workflow` | `arcrun_get_skill('build_watcher_workflow')` | +| 要做檢索問答(RAG) | `rag_with_arcrun` | `arcrun_get_skill('rag_with_arcrun')` | +| workflow 卡住不動/paused | `debug_paused_workflow` | `arcrun_get_skill('debug_paused_workflow')` | +| 想把 http 呼叫改成觸發別的 workflow | `migrate_http_to_trigger_workflow` | 同上 | +| **真的需要新零件**(罕見)| `add_new_wasm_component` | 同上 ⚠️ 先確認工作流做不到 | + +## 二、我要查「有沒有現成的東西」 + +| 找什麼 | 工具 | 注意 | +|---|---|---| +| 有哪些**零件** | `arcrun_list_components()` / `arcrun_search_components('自然語言')` | 零件=能力(`http_request`/`code`/`if_control`…)| +| 有哪些 **recipe** | `arcrun_recipe_list()` / `arcrun_recipe_search('...')` | recipe=打某個 API 的配方(`telegram_send`/`kbdb_get`…)| +| 有哪些**跑過的 workflow** | `arcrun_list_workflows()` / `arcrun_search_workflows('...')` | **這些是最可靠的範本**(實跑過)| +| 某個 workflow 的完整定義 | `arcrun_get_workflow(name)` | 拿來照抄結構 | +| 執行紀錄/為什麼失敗 | `arcrun_list_recent_executions()` / `arcrun_get_execution_trace(id)` | | + +⚠️ **零件 vs recipe 分不清會寫錯**: +`telegram_send`/`gmail`/`kbdb_get` 是 **recipe 不是零件**。 +它們要寫成 `http_request` + 該 recipe。 + +## 三、已知的坑(不看會踩) + +| 坑 | 現況 | 怎麼避 | +|---|---|---| +| **`/cypher/search` 回假 `found`** | 對**任何**節點名都回 found(不查 registry)| status 目前不可信,改用 `list_components` 自己確認。修復中(CP `arcrun-usable` 步驟 3)| +| **引擎沒有條件分支** | `grep ON_TRUE\|ON_FALSE` = 0;`if_control` 只回 boolean | 判斷寫成獨立節點接 `ON_SUCCESS`。見 Gitea Arcrun#5 | +| **`registry/examples/` 8/13 是壞的** | 引用不存在的零件(把 recipe 當零件寫)| **別照抄 examples**,改用 `arcrun_get_workflow` 拿實跑過的 | +| **registry 可能是空的** | 安裝器無註冊步驟 ⇒ 新實例查不到零件 | 查不到 ≠ 不存在,別據此改寫成 code | + +## 四、最重要的一條紅線 + +🔴 **查不到零件就改寫成 `code` 節點=「腹語術」**(表面用 Arcrun、實際全寫 JS)。 + +- 缺 API → **寫 recipe**(`arcrun_recipe_push`) +- 缺能力 → **投稿零件 PR**(要人類確認,見 `add_new_wasm_component`) +- `code` 只用於**局部整形**(例:剝掉 LLM 回應的雜訊、切段落) + +> 實錄:2026-07-30 盤點發現正式 workflow 只用 2 個零件,8 個 code 節點含 if×61 for×23, +> 最大一個 5509 字元——**每一個 if 都是沒被測過的新 bug**。 +> 零件的價值是「被測過 1000 次」,寫進 code 就歸零。 + +## 五、還是不會? + +- `arcrun_list_skills()` — 看全部 skill +- `arcrun_get_gui_context()` — 看目前實例的狀態 +- `arcrun_report_feedback()` — **回報這裡沒寫清楚的地方**(這份 INDEX 該被你的問題改進)