{"_id":"@agentskillmania/wrangler","name":"@agentskillmania/wrangler","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@agentskillmania/wrangler","version":"0.2.0","description":"Core library for Wrangler — agent crew orchestration, skill management, and workspace composition.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./host-env/node-host-env":{"types":"./dist/host-env/node-host-env.d.ts","import":"./dist/host-env/node-host-env.js"},"./tools/web":{"types":"./dist/tools/web/index.d.ts","import":"./dist/tools/web/index.js"},"./tools/mcp":{"types":"./dist/tools/mcp/index.d.ts","import":"./dist/tools/mcp/index.js"},"./package.json":"./package.json"},"author":{"name":"yusangeng","email":"yusangeng@outlook.com"},"license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/agentskillmania/wrangler.git","directory":"packages/wrangler"},"dependencies":{"@agentskillmania/colts":"^0.4.0","@agentskillmania/genui":"^0.1.1","@agentskillmania/llm-client":"^0.4.0","@agentskillmania/sandbox":"^1.3.1","@mariozechner/pi-ai":"^0.73.1","@mozilla/readability":"^0.6.0","diff":"^9.0.0","fast-glob":"^3.3.3","immer":"^11.1.4","isbinaryfile":"^6.0.0","js-yaml":"^4.1.0","jsdom":"^29.1.1","mcporter":"^0.10.2","ripgrep":"^0.3.1","shell-quote":"^1.9.0","turndown":"^7.2.4","zod":"^3.25.76"},"devDependencies":{"@types/js-yaml":"^4.0.9","@types/jsdom":"^28.0.1","@types/node":"^20.0.0","@types/turndown":"^5.0.6","@vitest/coverage-v8":"^2.0.0","typescript":"^5.0.0","vitest":"^2.0.0"},"engines":{"node":">=18.0.0"},"scripts":{"build":"tsc && node -e \"const fs=require('fs'),path=require('path');function copyRecursive(src,dest){if(!fs.existsSync(src))return;fs.mkdirSync(dest,{recursive:true});for(const e of fs.readdirSync(src,{withFileTypes:true})){const s=path.join(src,e.name);const d=path.join(dest,e.name);if(e.isDirectory()){copyRecursive(s,d)}else if(e.isFile()&&e.name.endsWith('.md')){fs.copyFileSync(s,d)}}}copyRecursive(path.join('src','spec-plan','skills'),path.join('dist','spec-plan','skills'))\"","dev":"tsc --watch","test":"vitest run","test:unit":"vitest run test/unit","test:intg":"vitest run test/integration","test:coverage":"vitest run test/unit --coverage","test:watch":"vitest watch test/unit","demo:code-reviewer":"node --import tsx examples/agent/code-reviewer/demo.ts","demo:travel-concierge":"node --import tsx examples/agent/travel-concierge/demo.ts","demo:tech-evaluation":"node --import tsx examples/crew/tech-evaluation/demo.ts","demo:newsroom":"node --import tsx examples/crew/newsroom/demo.ts"},"_id":"@agentskillmania/wrangler@0.2.0","bugs":{"url":"https://github.com/agentskillmania/wrangler/issues"},"homepage":"https://github.com/agentskillmania/wrangler#readme","_integrity":"sha512-IRclDPe00RGlFZUbw5vKbXwKiDWKjrrD2Nn+iHtq8yC49SgBPlQ7fwVYpN2C5rI3anhSVHH8mMmCx0iSZIQbJg==","_resolved":"/private/var/folders/dc/61lk2kgn1697rt0gd1s5jwf80000gn/T/c37b831ac18d15ee7f4dfeb6748f88f8/agentskillmania-wrangler-0.2.0.tgz","_from":"file:agentskillmania-wrangler-0.2.0.tgz","_nodeVersion":"22.15.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-IRclDPe00RGlFZUbw5vKbXwKiDWKjrrD2Nn+iHtq8yC49SgBPlQ7fwVYpN2C5rI3anhSVHH8mMmCx0iSZIQbJg==","shasum":"b8690bf418e5cc77d7cfc41ac9ff30cd3cf8a198","tarball":"https://registry.npmjs.org/@agentskillmania/wrangler/-/wrangler-0.2.0.tgz","fileCount":457,"unpackedSize":687309,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDBvXfW4N7EMkpdNdWzoj3krY8WXzupBD10YEhIqgSZCgIhAKfxLJVn0Q3onyEyC1QHSlUQHCznlehJzfyPL5cy0aIz"}]},"_npmUser":{"name":"yusangeng","email":"yusangeng@outlook.com"},"directories":{},"maintainers":[{"name":"yusangeng","email":"yusangeng@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wrangler_0.2.0_1786612350869_0.6094389708273336"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-13T09:12:30.692Z","0.2.0":"2026-08-13T09:12:31.064Z","modified":"2026-08-13T09:12:31.282Z"},"maintainers":[{"name":"yusangeng","email":"yusangeng@outlook.com"}],"description":"Core library for Wrangler — agent crew orchestration, skill management, and workspace composition.","homepage":"https://github.com/agentskillmania/wrangler#readme","repository":{"type":"git","url":"git+https://github.com/agentskillmania/wrangler.git","directory":"packages/wrangler"},"author":{"name":"yusangeng","email":"yusangeng@outlook.com"},"bugs":{"url":"https://github.com/agentskillmania/wrangler/issues"},"license":"MIT","readme":"# @agentskillmania/wrangler\n\n[![npm version](https://img.shields.io/npm/v/@agentskillmania/wrangler.svg)](https://www.npmjs.com/package/@agentskillmania/wrangler)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![English Documentation](https://img.shields.io/badge/docs-English-blue.svg)](./README.md)\n\n智能体配置与多 Agent 团队核心库 —— [colts](https://github.com/agentskillmania/colts) ReAct 框架与可用多 Agent 系统之间的抽象层。\n\n## 功能特性\n\n- **EnhancedRunner** — 在 colts `AgentRunner` 基础上扩展 workspace 组合、Skill 目录、Thinking 支持和 Markdown 上下文组装\n- **Crew 即配置** — 加载团队目录（`CREW.md` + 各 Agent 的 `AGENT.md`），转换为 `EnhancedRunner.create({ subAgents })` 选项。主 Agent 成为主 Runner，其余 Agent 成为可通过 colts `delegate` 工具调用的子代理。`CREW.md` 正文注入主 Agent 的 system prompt。\n- **Agent 加载** — 解析 `AGENT.md` 文件定义 Agent 身份、指令和 Skill 目录\n- **Session 管理** — Session 存储、对话格式化和元数据管理\n- **内置工具** — 平台无关 core 工具（文件读写编辑、grep、glob、shell 等 10 个）；web 工具经 `./tools/web` 子路径由宿主注入\n- **MCP 集成** — 宿主从 `./tools/mcp` 子路径注入加载器（引擎 core 不捆绑 MCP 加载）\n- **Spec/Plan 系统** — 面向复杂工作流的结构化规格和计划文档\n- **Todolist 支持** — Agent 共享的 Todo 状态\n\n## 架构层级\n\n| 层级 | 模块                    | 描述                                                   |\n| ---- | ----------------------- | ------------------------------------------------------ |\n| 2    | `runner/`、`tools/`     | EnhancedRunner、内置工具与 MCP 工具                    |\n| 3    | `todolist/`             | 共享 Todolist 状态                                     |\n| 4    | `spec-plan/`、`loader/` | Spec/Plan 文档、AgentLoader                            |\n| 5    | `agent/`                | AGENT.md 解析                                          |\n| 8    | `crew/`                 | 团队配置加载器（`CrewLoader` → `crewToRunnerOptions`） |\n\n## 安装\n\n```bash\npnpm add @agentskillmania/wrangler\n```\n\n## 快速示例\n\n```typescript\nimport { EnhancedRunner } from '@agentskillmania/wrangler';\nimport { NodeHostEnv } from '@agentskillmania/wrangler/host-env/node-host-env';\nimport { LLMClient } from '@agentskillmania/llm-client';\nimport { createAgentState, addUserMessage } from '@agentskillmania/colts';\n\nconst llmClient = LLMClient.quickInit({\n  providers: [\n    {\n      name: 'openai',\n      apiKey: process.env.OPENAI_API_KEY!,\n      models: [{ modelId: 'gpt-4o', maxConcurrency: 5 }],\n    },\n  ],\n});\n\nconst runner = await EnhancedRunner.create({\n  runtime: new NodeHostEnv(), // 必传——引擎 core 零 Node 依赖\n  workspacePath: '/path/to/project',\n  llm: { client: llmClient, model: 'gpt-4o' },\n  thinking: { enabled: true },\n  sandbox: { enabled: false },\n});\n\nlet state = createAgentState({ name: 'agent', instructions: '...', tools: [] });\nstate = addUserMessage(state, '你好');\n\n// 通过 EventEmitter 消费执行过程（唯一观测通道）\nrunner.on('token', (e) => process.stdout.write(e.token));\n\nconst { result } = await runner.run(state);\nconsole.log('完成:', result.type);\n```\n\n## 加载团队\n\n团队是配置目录，而非运行时编排器。`CrewLoader.load()` 解析 `CREW.md` 和各 Agent 的 `AGENT.md`；`crewToRunnerOptions()` 将其转换为 `EnhancedRunner.create({ subAgents })` 选项。Agent 间的协作通过 `delegate` 工具完成，子代理事件以 `subagent:` 前缀冒泡到 Runner 的 EventEmitter。\n\n```typescript\nimport { CrewLoader, crewToRunnerOptions, EnhancedRunner } from '@agentskillmania/wrangler';\nimport { createAgentState } from '@agentskillmania/colts';\n\nconst crew = await new CrewLoader('./my-crew', new NodeHostEnv()).load();\nconst opts = crewToRunnerOptions(crew);\n\nconst runner = await EnhancedRunner.create({\n  runtime: new NodeHostEnv(), // 必传\n  llm: { client: llmClient, model: opts.model ?? 'gpt-4o' },\n  // 团队的合成 prompt（memory + 主 Agent 指令 + 子代理目录）通过\n  // agentInstructions → AgentState.config.instructions 传递\n  delegation: { subAgents: opts.subAgents },\n  skills: { dirs: opts.skillDirs },\n  crewId: 'my-crew', // 写入 runnerConfig 快照，resume 时据此识别团队会话\n});\n\n// 主 Agent 的指令来自 opts.systemPrompt —— 与单 Agent 一样传给 createAgentState\nconst state = createAgentState({\n  name: opts.primaryAgent,\n  instructions: opts.systemPrompt,\n  tools: runner.getToolInfo(),\n});\n```\n\n### 恢复团队会话\n\n`EnhancedRunner.resume()` 从持久化的 `meta.yaml` 快照重建 Runner。快照不存储 `subAgents`（属于运行时概念），因此需要通过 `ResumeOptions.subAgents` 重新传入 —— 通常的做法是用创建时写入快照的 `crewId` 重新加载团队配置：\n\n```typescript\nconst { runner, state } = await EnhancedRunner.resume(sessionDir, {\n  runtime: new NodeHostEnv(), // 必传\n  llm: { client: llmClient },\n  subAgents: opts.subAgents, // 由 CrewLoader + crewToRunnerOptions 重建\n});\n```\n\n## 配置\n\n`EnhancedRunner.create()` 接受结构化的配置组：\n\n```typescript\nimport { createWebTools } from '@agentskillmania/wrangler/tools/web';   // Node 专属（jsdom）\nimport { loadMCPTools } from '@agentskillmania/wrangler/tools/mcp';     // Node 专属（MCP）\nimport { Sandbox } from '@agentskillmania/sandbox';\n\nawait EnhancedRunner.create({\n  runtime: new NodeHostEnv(),           // 必传\n  workspacePath: '/project',\n\n  llm: {\n    client: llmClient,           // 或 quickInit: { providers } + quickInitFactory（宿主注入创建器，如 (p) => LLMClient.quickInit({ providers: p })）\n    model: 'gpt-4o',\n    temperature: 0.7,\n    requestTimeout: 120_000,\n  },\n  skills: { dirs: ['/skills'] },\n  tools: {\n    builtinFilter: { shell: true, python: false }, // 对 10 个 core 工具的白名单\n    // Node 专属工具由宿主组装注入——主入口不捆绑：\n    injectFactory: (deps) => createWebTools({ deps, provider: 'sogou' }),\n    mcpConfigPaths: ['./mcp.json'],\n    mcpLoader: (paths) => loadMCPTools({ configPaths: paths }),\n    askHumanHandler: myHandler,\n  },\n  sandbox: {\n    enabled: true,\n    instance: new Sandbox({ sandboxDir: '/project' }), // 宿主构造\n  },\n  thinking: { enabled: true, promptLevel: false },\n  session: { enabled: true, baseDir: '/sessions' },\n  todolist: { enabled: true },\n  specPlan: { enabled: true },\n  commands: { enabled: true },\n  a2ui: { enabled: false },\n  delegation: { subAgents: [...] },\n  limits: { maxSteps: 500 },\n  compression: { strategy: 'summarize', threshold: 50 },\n});\n```\n\n旧版扁平字段（`llmClient`、`enableSession`、`skillDirs`、`sandbox: true` 等）已移除——所有选项都通过上面的结构化组传入。按请求覆盖（model、thinking）见 `ResumeOptions`；daemon 的聊天请求 `config` 暴露同样的配置组。\n\n## 依赖\n\n- [`@agentskillmania/colts`](https://github.com/agentskillmania/colts) — ReAct Agent 框架\n- [`@agentskillmania/llm-client`](https://github.com/agentskillmania/colts) — 统一 LLM 客户端\n\n## License\n\nMIT\n","readmeFilename":"README.zh_CN.md","_rev":"1-c5f0187e5a0977f33c416b81dd53968d"}