仓库 →

Plugin 系统

Plugin 是一组 skill / 命令 / hook 的集合,通过 git 仓库分发。一行 /plugin install 就能把别人写好的工作流装到 AtomCode 里,装完即用。AtomCode 的 plugin 协议与 Claude Code 兼容,CC 生态的 plugin 仓库可以直接安装运行。

核心概念

命令速查

命令作用
/plugin打开交互式插件管理器(上/下选择,回车确认,Esc 返回),可在里面浏览 marketplace、安装/卸载插件、添加/移除 marketplace
/plugin marketplace add <url>克隆一个 git 仓库并注册为 marketplace
/plugin marketplace remove <name>移除已注册的 marketplace(若其下还有已装插件会拒绝)
/plugin marketplace update <name>拉取该 marketplace 仓库的最新提交,刷新可用插件列表
/plugin marketplace list列出所有已注册的 marketplace
/plugin install <plugin>@<marketplace>从指定 marketplace 安装一个插件
/plugin uninstall <plugin>@<marketplace>卸载已安装的插件(保留 marketplace 注册)
/plugin list列出本地已安装的所有插件
/plugin reload重新加载所有插件(扫描磁盘变更、刷新 skill/hook 注册)

装一个 plugin

方式 1:交互式管理器(推荐)

在 TUI 中直接输入 /plugin(不带任何子命令),会打开一个全屏交互式管理器。通过方向键导航、回车确认:

/plugin
# → 打开管理器主菜单:
#   Browse & install    — 浏览 marketplace 中的插件,回车安装/卸载
#   Add marketplace…   — 输入 git URL 添加新 marketplace
#   Remove marketplace… — 选择并移除已注册的 marketplace
#   Installed (N)      — 查看已安装插件列表,回车卸载

安装插件时,已安装的会显示 ✓ 标记,回车即可切换安装/卸载。克隆和安装是异步的,操作期间底部会显示状态提示,完成后列表自动刷新。

方式 2:命令行子命令

# 1. 注册 marketplace(克隆其 git 仓库到本地)
/plugin marketplace add https://gitcode.com/gmq123/ascend-model-agent-plugin

# 2. 装其中的 plugin
/plugin install ascend-model-agent-plugin@ascend-model-agent-plugin

# 3. 列出已装
/plugin list

方式 3:CLI

atomcode plugin marketplace add <git-url>
atomcode plugin install <plugin>@<marketplace>
atomcode plugin list
atomcode plugin uninstall <plugin>@<marketplace>
atomcode plugin marketplace remove|update|list

CLI 与 TUI 共享 ~/.atomcode/plugins/ 目录,任意一边装的另一边立即可见。

装完之后

目录布局

~/.atomcode/plugins/
├── marketplaces.json              # 注册的 marketplace 元数据
├── installed_plugins.json         # 已装 plugin 的状态记录
├── marketplaces/
│   └── <marketplace-name>/        # marketplace 仓库克隆
│       ├── .claude-plugin/marketplace.json
│       └── <plugin-subdir>/        # inline plugin
└── installed/
    └── <marketplace>/<plugin>/    # 外部 source 的 plugin 克隆

plugin.json 内嵌结构

每个 plugin 根目录(或 .claude-plugin/ / .atomcode-plugin/ 子目录)下的 plugin.json:

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "干啥用的",
  "skills": ["./skills"],          // 也接受字符串 "skills"
  "commands": ["./commands"],
  "hooks": {                        // 也接受路径字符串 "hooks.json"
    "UserPromptSubmit": [{
      "hooks": [{
        "type": "command",
        "command": "python \"${CLAUDE_PLUGIN_ROOT}/hook.py\"",
        "timeout": 5
      }]
    }]
  }
}

Hook 事件

plugin 可以挂以下事件(与 CC 一致)。事件名大小写/风格不敏感——loader 同时接受 PascalCase(PreToolUseSessionStart)和 snake_case(pre_tool_usesession_start),两种拼写等价。

事件触发时机用途
UserPromptSubmit用户消息提交后,LLM 调用前注入额外上下文 / 路由 / 阻断
PreToolUse工具调用前校验、阻断、改参
PostToolUse工具调用后审计、副作用
SessionStartsession 启动预热、记录
SessionEndsession 结束清理、归档
Stop回合结束——正常停止、安全熔断、用户取消或限流暂停通知插件回合已结束;触发后续动作
StopFailure回合因 API/provider 错误(流失败/超时)而结束通知插件回合失败;告警 / 记录
Notification系统通知转发外部告警通道

每个回合结束时都会触发 且仅触发一个 Stop/StopFailure——不会两个都触发,也不会都不触发。StopFailure 只保留给因为 API/provider 失败而结束的回合;回合中途的工具报错不会触发它(回合会继续,以真实的终态结束)。stdin payload 携带 hook_event_namesession_idcwd、会话的 transcript_path(append-only JSONL 会话记录,非持久化运行为 null)、CC 风格的 stop_hook_active 标志(当另有一个终态 hook 配置并会同场触发时为 true——用它可以避免 Stop hook 递归地重新触发自己),以及 kernel 的 stop_reason(如 StoppedProviderErrorTimeoutCancelled),hook 无需再解析其他内容即可区分具体结果。

默认目录自动发现

plugin 的资产目录无需在 plugin.json 中逐一声明——loader 会按以下规则自动下钻:

只有当路径不符合默认约定时(如自定义子目录名),才需要在 plugin.json 中显式声明 "skills"/"commands"/"hooks" 字段。

Hook 信任流程

为防止恶意插件静默执行任意命令,plugin hook 受信任门控保护:

  1. 安装时(/plugin install / atomcode plugin install)——打印 hook 内容告知,不立即运行 hook。
  2. 授权信任——用户确认后运行:
    atomcode plugin trust <plugin-name>
    AtomCode 记录当前 hook 命令集的哈希值。
  3. 下次 session 生效——受信任的 hook 在下次启动时加载并激活。
  4. 更新失效——插件更新后若 hook 命令有变动,哈希自动失效;需重新 trust 才能运行新版本 hook。

撤销信任:

atomcode plugin untrust <plugin-name>

UserPromptSubmit IO 协议

Hook 通过 stdin 拿到 JSON,通过 stdout 决定如何处理:

{
  "session_id": "...",
  "hook_event_name": "UserPromptSubmit",
  "prompt": "用户输入的文本",
  "cwd": "/工作目录"
}

Hook 可以用以下方式响应(优先级由高到低):

AtomCode 解析 stdout 时,优先用最后一个非空行试 JSON;失败再回退到整段文本注入 —— 让 hook 脚本可以前置打印 debug 输出而不影响最终决策。

路径变量

Hook 命令字符串中可以引用以下环境变量(由 executor 注入):

这些是真实环境变量由 shell 自身展开,不是字符串替换 —— 安装路径含空格、引号、$; 都不会破命令。

Marketplace 管理

# 列出已注册的 marketplace
/plugin marketplace list

# 拉最新提交(更新该 marketplace 包含的 plugin 列表)
/plugin marketplace update <name>

# 移除(若该 marketplace 下还有 plugin 装着,会拒绝)
/plugin marketplace remove <name>

实战:装昇腾插件

/plugin marketplace add https://gitcode.com/gmq123/ascend-model-agent-plugin
# > cloning marketplace from https://gitcode.com/...
# > marketplace `ascend-model-agent-plugin` added at 7a59537 (1 plugins)

/plugin install ascend-model-agent-plugin@ascend-model-agent-plugin
# > installing `...`...
# > installed `ascend-model-agent-plugin@ascend-model-agent-plugin` — 23 skills loaded, 5 skipped

# 这个 plugin 装了一个 UserPromptSubmit hook(workflow_planner_hook.py),
# 当你说"帮我验证 Qwen3 在昇腾上的适配"时,它会注入一份 workflow JSON,
# 让模型按照 ascend-model-verification skill 链路执行。
帮我验证 Qwen3 在昇腾上的适配

已知限制

下一步