Back to home

aoye516

pack-Agent

把任意 AI Agent 打包成可移植的 dsh 模式(preset)仓库 / Package any AI agent into a portable dsh preset repo

Stars
0
Language
Python
Created
Aug 16, 2026
Updated
Aug 16, 2026

Introduction

pack-Agent · Agent 打包工具

简体中文 | English

把任意 AI Agent 打包成可移植的 dsh 模式(preset)仓库

打包结果是一个 GitHub 仓库,仓库本身就是 dsh preset:克隆到 ~/.dsh/.agent-presets/<id> 即可在 dsh 模式选择器中使用。

这是什么

pack_agent.py 把一个 AI Agent —— 来自 Claude Code、Codex、opencode、aider、Cursor、已安装的 dsh preset,或任意用 JSON/YAML manifest 描述的自定义 Agent —— 打包成可移植的 dsh preset 仓库:

路径内容
agent.cordis.ymldsh 组装文件(基础 preset + MCP + 工具 + skills 接线)
preset.yml模式名称 / 描述(模式选择器显示)
AGENTS.md合并后的 Agent 指令 + memory
skills/收集到的 skills(每个 skill 一个目录)
tools/打包的自定义工具插件
assets/需要附带的其他文件
.env.exampleMCP token 占位符(绝不包含真实密钥)
install.sh一键安装脚本
pack_agent.py打包器本身,方便以后重新打包

特性

  • 多来源:dsh preset(--from-dsh)、Claude Code(~/.claude.json、skills、CLAUDE.md、项目 .mcp.json)、Codex(~/.codex/config.toml、memory、skills)、opencode / aider / Cursor(--source opencode|aider|cursor),或通用 manifest
  • MCP 脱敏:token/密钥自动替换为 process.env.AGENT_MCP_* 占位符并写入 .env.example,任何敏感信息都不会进仓库
  • memory 脱敏--memory safe 既剔除赋值式密钥,也剔除行内形似凭据的 token(URL 和正常文本不受影响)
  • MCP 过滤--mcp-include--mcp-exclude--exclude-local-mcp(剔除本机专用服务)
  • --dry-run 只预览不打任何文件;--verbose 打印详细发现过程
  • --push 自动 git init 并推送到 GitHub(有 gh 时直接建仓库)

环境要求

  • Python 3.9+
  • pip install pyyaml(Python < 3.11 解析 TOML 还需 pip install tomli

快速开始

# 自动检测本机的 dsh / Claude Code / Codex / opencode / aider / Cursor,合并打包
python3 pack_agent.py --id my-agent --name "我的 Agent" --description "..." --out dist/my-agent

# 只打包某个已安装的 dsh preset
python3 pack_agent.py --from-dsh standard --id my-agent --out dist/my-agent

# 用 manifest 打包任意 Agent
python3 pack_agent.py --manifest agent.manifest.json --out dist/my-agent

# 先预览,不写任何文件
python3 pack_agent.py --manifest agent.manifest.json --out dist/my-agent --dry-run

# 只保留 github MCP、剔除本机服务
python3 pack_agent.py --id my-agent --mcp-include github --exclude-local-mcp --out dist/my-agent

# 打包并推送到 GitHub
python3 pack_agent.py --id my-agent --push --repo my-agent --public

命令行参考

参数说明
--id模式 id(kebab-case 目录名)。默认取 --outmy-agent
--name--description模式选择器里显示的名称 / 描述
--out输出目录。默认 ./dist/<id>
--sourceauto(默认,合并所有检测到的来源)、dshclaudecodexopencodeaidercursorgeneric
--from-dsh <id>以已安装的 dsh preset 为基底(隐含 --source dsh
--manifest <path>描述通用 Agent 的 JSON/YAML manifest
--skills [名称...]要包含的 skill 名称/路径;不带值 = 一个都不包含。默认:全部发现的
--mcp-config <path>额外的 MCP 配置文件(JSON/YAML/TOML,可重复)
--mcp-include <name>只包含这些 MCP(可重复 / 逗号分隔)
--mcp-exclude <name>排除这些 MCP(可重复 / 逗号分隔)
--exclude-local-mcp剔除本机专用 MCP(home/本地路径、localhost URL)
--agent-md <path>要包含的指令文件(可重复)
--memoryauto(默认)/ full / safe / none
--memory-files <path>额外的 memory 文件(可重复)
--extra-file <src:dst>把额外文件/目录复制到 assets/<dst>(可重复)
--tool <path>把自定义工具插件打包进 tools/(可重复)
--base-preset <id>非 dsh 来源时的基底 preset。默认 standard
--dry-run只打印计划,不写任何文件
--verbose详细发现 / 脱敏输出
--push--repo--public--privategit init 并推送到 GitHub
--yes跳过所有确认提示

Manifest 格式

{
  "id": "my-agent",
  "name": "My Agent",
  "description": "A packaged agent",
  "skills": ["/path/to/skill-dir", "skill-name-from-common-roots"],
  "mcp": {
    "github": {
      "transport": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "ghp_xxx" }
    }
  },
  "agent_md": ["/path/to/AGENTS.md"],
  "memory": {
    "mode": "safe",
    "files": ["/path/to/memory.md"]
  },
  "tools": [
    "/path/to/tool.mjs",
    {"path": "/path/to/tool-dir", "id": "my-tool", "name": "./tools/tool-dir/index.mjs", "config": {}}
  ],
  "extra_files": [
    {"src": "/path/to/file", "dst": "notes/guide.md"}
  ]
}

安装打包结果

在目标机器上:

git clone --depth 1 https://github.com/you/my-agent ~/.dsh/.agent-presets/my-agent

或进入仓库运行:

./install.sh https://github.com/you/my-agent my-agent

然后重启 dsh,在模式选择器中选择新模式。MCP 需要的环境变量见 .env.example

安全说明

  • MCP 的 token/密钥不会写入仓库,只生成 process.env.AGENT_MCP_* 占位符和 .env.example
  • memory 默认 safe 模式,行内形似凭据的 token 也会被剔除;确实需要全量保留时用 --memory full
  • 发布前建议检查 AGENTS.mdskills/assets/ 里没有意外包含的敏感信息。

License

MIT © aoye516