feat(#11): CLI/MCP 薄殼對齊 — P0 run 死端點修 + P1 list 同源 + R4 防複發機制
P0 CLI run 改打 /webhooks/named/:name/trigger 真端點(原打 /webhooks/<name> 死端點 404)。
P1 CLI/MCP list 收斂到 GET /webhooks/named(KV 同源):
- CLI list 停 CfKvClient 直連 KV,順手修 key 前綴 bug(原讀 workflow: 對不上部署的 {apiKey}:wf:)
+ self-hosted 不再需 CF API token。
- MCP u6u_list_workflows 從讀 KBDB record 改讀 GET /webhooks/named(registry 簽名加 partnerToken)。
R4 防複發機制:
- cli-mcp-capability-matrix.md(13 能力對照,docs/ gitignored 不進此 commit,僅本機)
- thin-shell-smoke.sh(對真端點斷言非 404,本機手動跑非 CI/cron)
- 機制自驗:注入故意死端點當場攔下、exit 1。
依賴關係:本批依賴 #8(webhooks-named GET 補 description/created_at 欄位、search/backfill 端點),
故疊在 feat/issue-8 branch 上、作獨立 commit。
⚠️ tsc 綠 = code done 非完成。端到端待 leo21c(CLI/MCP 真打通 200 非 404、smoke 對已部署 prod
全綠——目前 smoke 揭 #8 search/backfill 在 prod 仍 404=未部署)。P2 validate 收斂待 #10、
tag resource_id 語意債待方向①。#11 留 open。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Executable
+97
@@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
# thin-shell-smoke.sh — 薄殼防複發機制層 2(thin-shell-alignment SDD / issue #11 R4)
|
||||
#
|
||||
# 目的:讓「薄殼打了不存在的 server 端點」(死端點假綠)當場現形。
|
||||
# 對 CLI/MCP 各能力對應的 cypher-executor 端點打一次,斷言 **非 404**。
|
||||
# 404 = route 不存在 = 死端點 → 紅燈。其他狀態(401/400/200…)= 端點存在 → 綠。
|
||||
#
|
||||
# ⚠️ flag 紅線(SDD C2/R4.2):本機/手動跑,**非 CI、非 cron、非輪詢**。
|
||||
# 宣稱「CLI/MCP 對齊/完成」前手動跑一次即可。對齊「執行鏈路不依賴 CI」鐵律。
|
||||
#
|
||||
# 用法:
|
||||
# CYPHER_URL=https://cypher.arcrun.dev ./scripts/thin-shell-smoke.sh
|
||||
# (self-hosted:CYPHER_URL=https://<你的 cypher>.workers.dev ...)
|
||||
# 不帶 API key 也能驗端點存在性(401 仍算「端點活著」)。帶 key 可更深驗:
|
||||
# ARCRUN_API_KEY=xxx CYPHER_URL=... ./scripts/thin-shell-smoke.sh
|
||||
|
||||
set -o pipefail
|
||||
|
||||
CYPHER_URL="${CYPHER_URL:-https://cypher.arcrun.dev}"
|
||||
CYPHER_URL="${CYPHER_URL%/}"
|
||||
API_KEY="${ARCRUN_API_KEY:-}"
|
||||
|
||||
PASS=0
|
||||
FAIL=0
|
||||
declare -a DEAD=()
|
||||
|
||||
# probe METHOD PATH LABEL
|
||||
# 斷言端點非 404。404 → 死端點(紅)。連線失敗 → 紅(但標明是網路非死端點)。
|
||||
probe() {
|
||||
method="$1"; path="$2"; label="$3"
|
||||
url="${CYPHER_URL}${path}"
|
||||
|
||||
if [ "$method" = "POST" ]; then
|
||||
if [ -n "$API_KEY" ]; then
|
||||
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -X POST -H "X-Arcrun-API-Key: ${API_KEY}" -H 'Content-Type: application/json' -d '{}' "$url" 2>/dev/null)
|
||||
else
|
||||
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -X POST -H 'Content-Type: application/json' -d '{}' "$url" 2>/dev/null)
|
||||
fi
|
||||
else
|
||||
if [ -n "$API_KEY" ]; then
|
||||
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -H "X-Arcrun-API-Key: ${API_KEY}" "$url" 2>/dev/null)
|
||||
else
|
||||
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "$url" 2>/dev/null)
|
||||
fi
|
||||
fi
|
||||
code="${code:-000}"
|
||||
|
||||
if [ "$code" = "000" ]; then
|
||||
echo " ⚠️ $label — 連線失敗(網路/DNS,非死端點判定):$method $path"
|
||||
FAIL=$((FAIL+1))
|
||||
elif [ "$code" = "404" ]; then
|
||||
echo " ❌ $label — 死端點 404:$method $path"
|
||||
DEAD+=("$label: $method $path")
|
||||
FAIL=$((FAIL+1))
|
||||
else
|
||||
echo " ✅ $label — 端點存在(HTTP ${code}):$method $path"
|
||||
PASS=$((PASS+1))
|
||||
fi
|
||||
}
|
||||
|
||||
echo "=== thin-shell smoke:對 ${CYPHER_URL} 驗端點存在性(斷言非 404)==="
|
||||
echo ""
|
||||
echo "── 薄殼核心能力(CLI/MCP 共用端點)──"
|
||||
# 部署:CLI acr push / MCP u6u_deploy_workflow(方向①收斂後同此)
|
||||
probe POST /webhooks/named "deploy(push)"
|
||||
# 執行已部署:CLI acr run <name> / MCP u6u_execute_workflow(#11 P0 修的)
|
||||
probe POST /webhooks/named/__smoke__/trigger "run(trigger)"
|
||||
# 執行本機 YAML:/cypher/execute
|
||||
probe POST /cypher/execute "execute"
|
||||
# list:CLI acr list / MCP u6u_list_workflows(#11 P1 收斂的)
|
||||
probe GET /webhooks/named "list"
|
||||
# search workflow:MCP u6u_search_workflows(#8 新增)
|
||||
probe GET "/workflows/search?q=smoke" "search_workflow"
|
||||
# 驗證:MCP arcrun_validate_yaml
|
||||
probe POST /validate "validate"
|
||||
# backfill search entries(#8)
|
||||
probe POST /workflows/backfill-search-entries "backfill"
|
||||
|
||||
echo ""
|
||||
echo "── 其他薄殼端點 ──"
|
||||
probe GET /me "whoami"
|
||||
probe POST /credentials "creds_push"
|
||||
probe POST /recipes "recipe"
|
||||
probe GET /kbdb/templates "kbdb_templates"
|
||||
probe POST /cypher/search "validate_local_graph(cypher/search)"
|
||||
|
||||
echo ""
|
||||
echo "=== 結果:${PASS} 端點存在 / ${FAIL} 異常 ==="
|
||||
if [ ${#DEAD[@]} -gt 0 ]; then
|
||||
echo ""
|
||||
echo "🔴 死端點(route 不存在,薄殼打了會 404):"
|
||||
for d in "${DEAD[@]}"; do echo " - $d"; done
|
||||
echo ""
|
||||
echo "→ 修法:對照 cli-mcp-capability-matrix.md,把薄殼改打存在的 route,或補 server route。"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ 無死端點。"
|
||||
Reference in New Issue
Block a user