命名结构(品牌=市场,产品=插件):市场名保持 deta;插件 deta → studio(displayName DETA Studio),新增 writer(DETA Writer)。安装标识 studio@deta / writer@deta;MCP 服务名 studio_mcp / writer_mcp,可同时安装。plugins/deta → plugins/studio(git mv 保留历史),新增 plugins/writer。 连接形态统一为单一本机 stdio 管道:.mcp.json 与 cordis.patch.yml 均声明 stdio → bin/deta-mcp.sh --profile <产品>,并按官方插件写法补 cwd: "."(缺它时 Cwd=- ,相对命令按宿主进程 cwd 解析会静默起不来);启动器新增 --profile 档位(工作区 ~/.deta/<产品>/workspace、工具面缺省 full),运行时按 DETA_SERVER_ROOT → ~/.deta/runtime → 开发检出解析,入口优先打包产物;DETA_TOKEN 可选注入(缺省时云类工具返回 auth_required)。原远程端点声明(含 OAuth/401 段落)从插件移除。 文档与治理:根 README 与两个插件 README 改为单一管道口径;技能 aml-design 对齐本机全量面;新增 scripts/check-plugin-contract.mjs(E1 禁工具清单 / E2 必须给出 list_capabilities / E3 禁解释内部实现 / E4 市场条目一致性 / W1 开发检出依赖)与 .gitea/workflows/ci.yml。版本:studio 0.3.1、writer 0.1.0。
This commit is contained in:
Executable
+73
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env bash
|
||||
# DETA 产品插件的本机 MCP stdio 启动器(唯一入口,多产品共用)
|
||||
#
|
||||
# 两个宿主(Codex 插件 / dsh 组合包)都通过本脚本拉起同一个领域服务;
|
||||
# 产品差异只由 --profile 决定(工作区默认位置、工具面),宿主侧只声明"调哪个脚本、带哪个档位"。
|
||||
#
|
||||
# 用法:deta-mcp.sh [--profile <studio|writer>]
|
||||
#
|
||||
# 依赖:node + 已构建的领域服务运行时
|
||||
#
|
||||
# 环境变量:
|
||||
# DETA_SERVER_ROOT 领域服务运行时根目录(未设时自动查找,见下)
|
||||
# DETA_WORKSPACE AML 工作目录(引擎侧工作区真值;缺省 ~/.deta/<profile>/workspace)
|
||||
# ANT_HEADLESS_WORKSPACE 同上(兼容旧名,DETA_WORKSPACE 优先)
|
||||
# DETA_TOKEN deta.city 门户令牌(可选;不注入则云类工具返回 auth_required)
|
||||
# ANT_WORKSPACE_BRIDGE_URL 网关基址(可选;与项目 ID 一起启用 Studio 执行器中继)
|
||||
# DETA_SURFACE 工具面覆盖(缺省 full)
|
||||
set -euo pipefail
|
||||
|
||||
# ── 产品档位:宿主在声明里传 --profile;缺省 studio ──
|
||||
PROFILE="${DETA_PROFILE:-writer}"
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--profile) PROFILE="${2:?--profile 需要一个值}"; shift 2 ;;
|
||||
*) break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ── 运行时解析:显式 DETA_SERVER_ROOT → 本机引擎包安装位置 → 本机开发检出(打印提示)──
|
||||
ROOT="${DETA_SERVER_ROOT:-}"
|
||||
if [ -z "$ROOT" ]; then
|
||||
for cand in "$HOME/.deta/runtime" "$HOME/Dev/ant/ant-copilot"; do
|
||||
if [ -f "$cand/dist/deta-mcp.mjs" ] || [ -f "$cand/dist/src/headless/mcp-server.js" ]; then ROOT="$cand"; break; fi
|
||||
done
|
||||
fi
|
||||
|
||||
if ! command -v node >/dev/null 2>&1; then
|
||||
echo "[deta] 未找到 node,请先安装 Node.js" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 入口优先取 esbuild 打包形态:tsc 产物在 Node ESM 下会因依赖包的目录 import 直接失败
|
||||
ENTRY=""
|
||||
if [ -n "$ROOT" ]; then
|
||||
if [ -f "$ROOT/dist/deta-mcp.mjs" ]; then
|
||||
ENTRY="$ROOT/dist/deta-mcp.mjs"
|
||||
elif [ -f "$ROOT/dist/src/headless/mcp-server.js" ]; then
|
||||
ENTRY="$ROOT/dist/src/headless/mcp-server.js"
|
||||
echo "[deta] 警告:回落到未打包产物,请先在该运行时目录执行 npm run build:mcp" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$ENTRY" ]; then
|
||||
echo "[deta] 未找到领域服务运行时(已尝试:DETA_SERVER_ROOT、\$HOME/.deta/runtime、\$HOME/Dev/ant/ant-copilot)" >&2
|
||||
echo "[deta] 请安装本机引擎包,或设置 DETA_SERVER_ROOT 指向已构建的领域服务仓库" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$ROOT" = "$HOME/Dev/ant/ant-copilot" ]; then
|
||||
echo "[deta] 提示:使用本机开发检出 ${ROOT}(非打包运行时)" >&2
|
||||
fi
|
||||
|
||||
# ── 工作目录:宿主不会传项目目录(cwd 通常是插件根),按产品档位定稳定位置 ──
|
||||
WS="${DETA_WORKSPACE:-${ANT_HEADLESS_WORKSPACE:-$HOME/.deta/$PROFILE/workspace}}"
|
||||
mkdir -p "$WS"
|
||||
export ANT_HEADLESS_WORKSPACE="$WS"
|
||||
|
||||
# ── 工具面:产品档位缺省全量面;DETA_SURFACE 可覆盖(如 engine)──
|
||||
export DETA_TOOL_SURFACE="${DETA_SURFACE:-full}"
|
||||
|
||||
echo "[deta] 档位=${PROFILE} 运行时=${ROOT} 工作区=${WS} 工具面=${DETA_TOOL_SURFACE} 云令牌=$([ -n "${DETA_TOKEN:-}" ] && echo 已注入 || echo 未注入)" >&2
|
||||
|
||||
exec node "$ENTRY" "$@"
|
||||
Reference in New Issue
Block a user