open-gitagent/gitagent

GitHub: open-gitagent/gitagent

一个通用型 git-native AI Agent 框架,将 Agent 的身份、记忆、规则和工具全部定义为受 git 版本控制的文件。

Stars: 539 | Forks: 114

GitAgent Logo

npm version node version license typescript

Gitagent

一个通用的 git-native 多模态持续学习 AI Agent (TinyHuman)
你的 agent 生存于一个 git repo 中 —— 身份、规则、记忆、工具和技能都是受版本控制的文件。

安装快速开始SDK架构工具Hooks技能插件

## 为什么选择 Gitagent? 大多数 agent 框架将配置视为散布在应用程序各处的代码。Gitagent 颠覆了这一点 —— **你的 agent 就是一个 git 仓库**: - **`agent.yaml`** — 模型、工具、运行时配置 - **`SOUL.md`** — 个性与身份 - **`RULES.md`** — 行为约束 - **`memory/`** — 拥有完整历史的 git 提交记录 - **`tools/`** — 声明式 YAML 工具定义 - **`skills/`** — 可组合的技能模块 - **`hooks/`** — 生命周期 Hooks(脚本或编程方式) Fork 一个 agent。Branch 一个个性。用 `git log` 查看 agent 的记忆。Diff 它的规则。这就是 **agents as repos**。 ## 一键安装 复制,粘贴,运行。就这么简单 —— 无需 clone,无需手动设置。安装程序会处理一切: ``` bash <(curl -fsSL "https://raw.githubusercontent.com/open-gitagent/gitagent/main/install.sh?$(date +%s)") ``` 这将会: - 通过 npm 全局安装 gitagent - 引导你完成 API key 设置(快速或高级模式) - 在你的浏览器中启动语音 UI,地址为 `http://localhost:3333` ### 或者手动安装: ``` # Slim CLI + SDK (recommended in sandboxed/CI environments where supply-chain # scanners reject larger bundles) npm install -g @open-gitagent/gitagent # Add voice mode + web UI (the same web UI install.sh launches at :3333) npm install -g @open-gitagent/voice ``` `install.sh` 默认会安装两个包。在执行 curl-bash 命令之前设置 `GITAGENT_SLIM=1` 可以跳过语音安装。 ## 从 1.x 迁移到 2.0 语音模式现在位于 `@open-gitagent/voice` 中。原因是:作为单个 bundle,该包被一些供应链扫描工具拦截,因为其标记了 3,800 行的 `dist/voice/ui.html` 和未使用的 `baileys` 依赖。将语音功能拆分出去使精简核心 tarball 包从 ~180 kB 降至 ~85 kB,并彻底消除了扫描工具的触发。 ``` # If you were on v1.x and used voice: npm install -g @open-gitagent/gitagent@latest @open-gitagent/voice # If you only use the SDK / non-voice CLI: npm install -g @open-gitagent/gitagent@latest ``` `gitagent` 命令和 `@open-gitagent/gitagent` SDK 的导出保持不变。 `gitagent --voice` 会动态加载 `@open-gitagent/voice`;如果未安装该包,它将打印一行安装提示并正常退出。 ## 快速开始 **一行代码运行你的第一个 agent:** ``` export OPENAI_API_KEY="sk-..." gitagent --dir ~/my-project "Explain this project and suggest improvements" ``` 就这样。Gitagent 会在首次运行时自动搭建一切 —— `agent.yaml`、`SOUL.md`、`memory/` —— 并让你直接进入该 agent。 ### 本地仓库模式 Clone 一个 GitHub 仓库,在其上运行一个 agent,自动提交并推送到一个 session branch: ``` gitagent --repo https://github.com/org/repo --pat ghp_xxx "Fix the login bug" ``` 恢复一个现有的会话: ``` gitagent --repo https://github.com/org/repo --pat ghp_xxx --session gitagent/session-a1b2c3d4 "Continue" ``` Token 可以来自环境变量,而不是使用 `--pat`: ``` export GITHUB_TOKEN=ghp_xxx gitagent --repo https://github.com/org/repo "Add unit tests" ``` ### CLI 选项 | 标志 | 简写 | 描述 | |---|---|---| | `--dir ` | `-d` | Agent 目录(默认:cwd) | | `--repo ` | `-r` | 要 clone 并在其上工作的 GitHub 仓库 URL | | `--pat ` | | GitHub PAT(或设置 `GITHUB_TOKEN` / `GIT_TOKEN`) | | `--session ` | | 恢复一个现有的会话 branch | | `--model ` | `-m` | 覆盖模型(例如 `anthropic:claude-sonnet-4-5-20250929`) | | `--sandbox` | `-s` | 在 sandbox VM 中运行 | | `--prompt ` | `-p` | 单次提示(跳过 REPL) | | `--env ` | `-e` | 环境配置 | ### SDK ``` import { query } from "gitagent"; // Simple query for await (const msg of query({ prompt: "List all TypeScript files and summarize them", dir: "./my-agent", model: "openai:gpt-4o-mini", })) { if (msg.type === "delta") process.stdout.write(msg.content); if (msg.type === "assistant") console.log("\n\nDone."); } // Local repo mode via SDK for await (const msg of query({ prompt: "Fix the login bug", model: "openai:gpt-4o-mini", repo: { url: "https://github.com/org/repo", token: process.env.GITHUB_TOKEN!, }, })) { if (msg.type === "delta") process.stdout.write(msg.content); } ``` ## SDK SDK 提供了一个用于操作 Gitagent agent 的编程接口。它借鉴了 [Claude Agent SDK](https://github.com/anthropics/claude-code-sdk) 的模式,但**在进程内(in-process)**运行 —— 没有 subprocess,没有 IPC。 ### `query(options): Query` 返回一个 `AsyncGenerator`,用于流式传输 agent 事件。 ``` import { query } from "gitagent"; for await (const msg of query({ prompt: "Refactor the auth module", dir: "/path/to/agent", model: "anthropic:claude-sonnet-4-5-20250929", })) { switch (msg.type) { case "delta": // streaming text chunk process.stdout.write(msg.content); break; case "assistant": // complete response console.log(`\nTokens: ${msg.usage?.totalTokens}`); break; case "tool_use": // tool invocation console.log(`Tool: ${msg.toolName}(${JSON.stringify(msg.args)})`); break; case "tool_result": // tool output console.log(`Result: ${msg.content}`); break; case "system": // lifecycle events & errors console.log(`[${msg.subtype}] ${msg.content}`); break; } } ``` ### `tool(name, description, schema, handler): GCToolDefinition` 定义 agent 可以调用的自定义工具: ``` import { query, tool } from "gitagent"; const search = tool( "search_docs", "Search the documentation", { properties: { query: { type: "string", description: "Search query" }, limit: { type: "number", description: "Max results" }, }, required: ["query"], }, async (args) => { const results = await mySearchEngine(args.query, args.limit ?? 10); return { text: JSON.stringify(results), details: { count: results.length } }; }, ); for await (const msg of query({ prompt: "Find docs about authentication", tools: [search], })) { // agent can now call search_docs } ``` ### Hooks 用于门控、日志记录和控制的编程式生命周期 Hooks: ``` for await (const msg of query({ prompt: "Deploy the service", hooks: { preToolUse: async (ctx) => { // Block dangerous operations if (ctx.toolName === "cli" && ctx.args.command?.includes("rm -rf")) return { action: "block", reason: "Destructive command blocked" }; // Modify arguments if (ctx.toolName === "write" && !ctx.args.path.startsWith("/safe/")) return { action: "modify", args: { ...ctx.args, path: `/safe/${ctx.args.path}` } }; return { action: "allow" }; }, onError: async (ctx) => { console.error(`Agent error: ${ctx.error}`); }, }, })) { // ... } ``` ### QueryOptions 参考 | 选项 | 类型 | 描述 | |---|---|---| | `prompt` | `string \| AsyncIterable` | 用户提示或多轮对话流 | | `dir` | `string` | Agent 目录(默认:`cwd`) | | `model` | `string` | `"provider:model-id"` | | `env` | `string` | 环境配置(`config/.yaml`) | | `systemPrompt` | `string` | 覆盖已发现的系统提示 | | `systemPromptSuffix` | `string` | 追加到已发现的系统提示末尾 | | `tools` | `GCToolDefinition[]` | 额外的工具 | | `replaceBuiltinTools` | `boolean` | 跳过 cli/read/write/memory | | `allowedTools` | `string[]` | 工具名称允许列表 | | `disallowedTools` | `string[]` | 工具名称拒绝列表 | | `repo` | `LocalRepoOptions` | Clone 一个 GitHub 仓库并在一个会话 branch 上工作 | | `sandbox` | `SandboxOptions \| boolean` | 在 sandbox VM 中运行(与 `repo` 互斥) | | `hooks` | `GCHooks` | 编程式生命周期 Hooks | | `maxTurns` | `number` | 最大 agent 轮数 | | `abortController` | `AbortController` | 取消信号 | | `constraints` | `object` | `temperature`, `maxTokens`, `topP`, `topK` | ### 消息类型 | 类型 | 描述 | 关键字段 | |---|---|---| | `delta` | 流式文本/思考块 | `deltaType`, `content` | | `assistant` | 完整的 LLM 响应 | `content`, `model`, `usage`, `stopReason` | | `tool_use` | 工具调用 | `toolName`, `args`, `toolCallId` | | `tool_result` | 工具输出 | `content`, `isError`, `toolCallId` | | `system` | 生命周期事件 | `subtype`, `content`, `metadata` | | `user` | 用户消息(多轮对话) | `content` | ## 架构 ``` my-agent/ ├── agent.yaml # Model, tools, runtime config ├── SOUL.md # Agent identity & personality ├── RULES.md # Behavioral rules & constraints ├── DUTIES.md # Role-specific responsibilities ├── memory/ │ └── MEMORY.md # Git-committed agent memory ├── tools/ │ └── *.yaml # Declarative tool definitions ├── skills/ │ └── / │ ├── SKILL.md # Skill instructions (YAML frontmatter) │ └── scripts/ # Skill scripts ├── workflows/ │ └── *.yaml|*.md # Multi-step workflow definitions ├── agents/ │ └── / # Sub-agent definitions ├── plugins/ │ └── / # Local plugins (plugin.yaml + tools/hooks/skills) ├── hooks/ │ └── hooks.yaml # Lifecycle hook scripts ├── knowledge/ │ └── index.yaml # Knowledge base entries ├── config/ │ ├── default.yaml # Default environment config │ └── .yaml # Environment overrides ├── examples/ │ └── *.md # Few-shot examples └── compliance/ └── *.yaml # Compliance & audit config ``` ### Agent 清单 (`agent.yaml`) ``` spec_version: "0.1.0" name: my-agent version: 1.0.0 description: An agent that does things model: preferred: "anthropic:claude-sonnet-4-5-20250929" fallback: ["openai:gpt-4o"] constraints: temperature: 0.7 max_tokens: 4096 tools: [cli, read, write, memory] runtime: max_turns: 50 timeout: 120 # Optional extends: "https://github.com/org/base-agent.git" skills: [code-review, deploy] delegation: mode: auto compliance: risk_level: medium human_in_the_loop: true ``` ## 工具 ### 内置工具 | 工具 | 描述 | |---|---| | `cli` | 执行 shell 命令 | | `read` | 分页读取文件 | | `write` | 写入/创建文件 | | `memory` | 加载/保存 git 提交的记忆 | ### 声明式工具 将工具定义为 `tools/` 目录下的 YAML: ``` # tools/search.yaml name: search description: Search the codebase input_schema: properties: query: type: string description: Search query path: type: string description: Directory to search required: [query] implementation: script: search.sh runtime: sh ``` 脚本通过 stdin 接收 JSON 格式的参数,并通过 stdout 返回输出。 ## Hooks `hooks/hooks.yaml` 中的基于脚本的 Hooks: ``` hooks: on_session_start: - script: validate-env.sh description: Check environment is ready pre_tool_use: - script: audit-tools.sh description: Log and gate tool usage post_response: - script: notify.sh on_error: - script: alert.sh ``` Hook 脚本通过 stdin 接收 JSON 格式的 context,并返回: ``` { "action": "allow" } { "action": "block", "reason": "Not permitted" } { "action": "modify", "args": { "modified": "args" } } ``` ## 技能 技能是位于 `skills//` 中的可组合指令模块: ``` skills/ code-review/ SKILL.md scripts/ lint.sh ``` ``` --- name: code-review description: Review code for quality and security --- # Code Review When reviewing code: 1. Check for security vulnerabilities 2. Verify error handling 3. Run the lint script for style checks ``` 通过 CLI 调用:`/skill:code-review Review the auth module` ## 插件 插件是可重用的扩展,可以提供工具、Hooks、技能、提示和记忆层。它们遵循相同的 git-native 理念 —— 一个插件就是一个包含 `plugin.yaml` 清单的目录。 ### CLI 命令 ``` # Install from git URL gitagent plugin install https://github.com/org/my-plugin.git # Install from local path gitagent plugin install ./path/to/plugin # Install with options gitagent plugin install --name custom-name --force --no-enable # List all discovered plugins gitagent plugin list # Enable / disable gitagent plugin enable my-plugin gitagent plugin disable my-plugin # Remove gitagent plugin remove my-plugin # Scaffold a new plugin gitagent plugin init my-plugin ``` | 标志 | 描述 | |---|---| | `--name ` | 自定义插件名称(默认:从源派生) | | `--force` | 即使已存在也重新安装 | | `--no-enable` | 安装但不自动启用 | ### 插件清单 (`plugin.yaml`) ``` id: my-plugin # Required, kebab-case name: My Plugin version: 0.1.0 description: What this plugin does author: Your Name license: MIT engine: ">=0.3.0" # Min gitagent version provides: tools: true # Load tools from tools/*.yaml skills: true # Load skills from skills/ prompt: prompt.md # Inject into system prompt hooks: pre_tool_use: - script: hooks/audit.sh description: Audit tool calls config: properties: api_key: type: string description: API key env: MY_API_KEY # Env var fallback timeout: type: number default: 30 required: [api_key] entry: index.ts # Optional programmatic entry point ``` ### `agent.yaml` 中的插件配置 ``` plugins: my-plugin: enabled: true source: https://github.com/org/my-plugin.git # Auto-install on load version: main # Git branch/tag config: api_key: "${MY_API_KEY}" # Supports env interpolation timeout: 60 ``` 配置解析优先级:`agent.yaml config` > `env var` > `manifest default`。 ### 发现顺序 插件按以下顺序发现(首个匹配项生效): 1. **本地** — `/plugins//` 2. **全局** — `~/.gitagent/plugins//` 3. **已安装** — `/.gitagent/plugins//` ### 编程式插件 在其清单中包含 `entry` 字段的插件将获得完整的 API: ``` // index.ts import type { GitagentPluginApi } from "gitagent"; export async function register(api: GitagentPluginApi) { // Register a tool api.registerTool({ name: "search_docs", description: "Search documentation", inputSchema: { properties: { query: { type: "string" } }, required: ["query"], }, handler: async (args) => { const results = await search(args.query); return { text: JSON.stringify(results) }; }, }); // Register a lifecycle hook api.registerHook("pre_tool_use", async (ctx) => { api.logger.info(`Tool called: ${ctx.tool}`); return { action: "allow" }; }); // Add to system prompt api.addPrompt("Always check docs before answering questions."); // Register a memory layer api.registerMemoryLayer({ name: "docs-cache", path: "memory/docs-cache.md", description: "Cached documentation lookups", }); } ``` **可用的 API 方法:** | 方法 | 描述 | |---|---| | `registerTool(def)` | 注册一个 agent 可调用的工具 | | `registerHook(event, handler)` | 注册一个生命周期 Hook(`on_session_start`, `pre_tool_use`, `post_response`, `on_error`) | | `addPrompt(text)` | 将文本追加到系统提示中 | | `registerMemoryLayer(layer)` | 注册一个记忆层 | | `logger.info/warn/error(msg)` | 带前缀的日志记录(`[plugin:id]`) | | `pluginId` | 插件标识符 | | `pluginDir` | 插件目录的绝对路径 | | `config` | 解析后的配置值 | ### 插件结构 ``` my-plugin/ ├── plugin.yaml # Manifest (required) ├── tools/ # Declarative tool definitions │ └── *.yaml ├── hooks/ # Hook scripts ├── skills/ # Skill modules ├── prompt.md # System prompt addition └── index.ts # Programmatic entry point ``` ## 多模型支持 Gitagent 与 [pi-ai](https://github.com/badlogic/pi-mono/tree/main/packages/ai) 支持的任何 LLM 提供商配合使用: ``` # agent.yaml model: preferred: "anthropic:claude-sonnet-4-5-20250929" fallback: - "openai:gpt-4o" - "google:gemini-2.0-flash" ``` 支持的提供商:`anthropic`、`openai`、`google`、`xai`、`groq`、`mistral` 等。 ## 继承与组合 Agent 可以扩展基础 agent: ``` # agent.yaml extends: "https://github.com/org/base-agent.git" # Dependencies dependencies: - name: shared-tools source: "https://github.com/org/shared-tools.git" version: main mount: tools # Sub-agents delegation: mode: auto ``` ## 合规与审计 内置合规性验证和审计日志记录: ``` # agent.yaml compliance: risk_level: high human_in_the_loop: true data_classification: confidential regulatory_frameworks: [SOC2, GDPR] recordkeeping: audit_logging: true retention_days: 90 ``` 审计日志将写入 `.gitagent/audit.jsonl`,包含完整的工具调用追踪。 ## 遥测 Gitagent 内置了 OpenTelemetry 监测功能。设置 `OTEL_EXPORTER_OTLP_ENDPOINT` 即可开启遥测;如果不设置,运行时开销为零。 三层信号: 1. **HTTP 级别** — `@opentelemetry/instrumentation-undici` 自动修补 `fetch`/`undici`,因此每一次 LLM 提供商调用(Anthropic, OpenAI, Google, …)都会获得一个包含 URL、状态码和时间的客户端 span。 2. **`gen_ai.chat` spans** — 在每次 assistant `message_end` 时发出。携带 `gen_ai.system`、`gen_ai.request.model`、`gen_ai.usage.input_tokens`、`gen_ai.usage.output_tokens`、`gen_ai.response.finish_reasons` 和 `gitagent.cost_usd`。Span/metric 内容绝不包含提示或补全文本。 3. **`gitagent.tool.execute` spans** — 封装每次工具调用,包含 `tool.name`、`tool.call_id`、`tool.status`(`ok`/`error`),以及失败时的 `tool.error_message`。 一个根 `gitagent.agent.session` span 在 agent 构建时打开,并在所有退出路径(成功、Hook 拦截、SIGINT、错误)上关闭。 ### CLI 用法 只需设置 endpoint —— 不需要 `--import` 标志,不需要额外的安装步骤: ``` OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 gitagent -p "your prompt" ``` 当设置了 endpoint 时,遥测会自动启用;未设置时则禁用。如果要在设置了 endpoint 的情况下强制禁用,请传入 `GITAGENT_OTEL_ENABLED=false`。 ### 环境变量 | 变量 | 描述 | 默认值 | |----------|-------------|---------| | `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP/HTTP collector 基础 URL(例如 `http://localhost:4318`)。设置后,遥测将自动启用。 | (未设置 → 遥测关闭) | | `GITAGENT_OTEL_ENABLED` | 设置为 `false` 可在设置了 endpoint 的情况下也禁用遥测 | (未设置 = 自动) | | `OTEL_SERVICE_NAME` | 资源 `service.name` | `gitagent` | |OTEL_SERVICE_VERSION` | 资源 `service.version` | (未设置) | | `OTEL_EXPORTER_OTLP_HEADERS` | 逗号分隔的 key=value 对,无引号(例如 `Authorization=Bearer xyz,x-tenant=abc`) | (未设置) | | `OTEL_TRACES_EXPORTER` | 设置为 `console` 可将 spans 打印到 stdout —— 无需 collector | (未设置) | ### SDK 用法 对于以编程方式嵌入的开发者,请显式调用 `initTelemetry` —— 你可以控制初始化发生的时机: ``` import { initTelemetry, shutdownTelemetry, query } from "gitagent"; await initTelemetry({ serviceName: "my-app" }); for await (const msg of query({ prompt: "hello", model: "anthropic:claude-4-6-sonnet-latest" })) { // … } await shutdownTelemetry(); ``` 当不以编程方式提供时,`OTEL_EXPORTER_OTLP_ENDPOINT` 和 `OTEL_EXPORTER_OTLP_HEADERS` 会被 OTLP exporter 自动读取。仅当需要在代码中覆盖基于环境变量的配置时,才传入 `exporterEndpoint` / `headers`。 ### 发出的 spans | 名称 | 类型 | 关键属性 | |------|------|----------------| | `gitagent.agent.session` | INTERNAL | `gitagent.entry` (`sdk` / `cli`), `gitagent.cost_usd`, `gitagent.session.duration_ms` | | `gitagent.tool.execute` | INTERNAL | `tool.name`, `tool.call_id`, `tool.status`, `tool.error_message` | | `gen_ai.chat` | CLIENT | `gen_ai.system`, `gen_ai.request.model`, `gen_ai.usage.input_tokens`, `gen_ai.usage.output_tokens`, `gen_ai.response.finish_reasons`, `gitagent.cost_usd` | | `HTTP …` | CLIENT | URL, 状态码, 持续时间(自动来自 `instrumentation-undici`) | ### 发出的指标 | 名称 | 类型 | 描述 | |------|------|-------------| | `gitagent.tool.calls` | counter | 工具执行次数,按 `tool.name` 标记 | | `gitagent.tool.duration_ms` | histogram | 工具执行持续时间 | | `gitagent.session.duration_ms` | histogram | 会话持续时间 | | `gitagent.session.cost_usd` | counter (USD) | 累计会话成本 | | `gen_ai.client.token.usage` | counter | Token 使用情况,按 `gen_ai.system`, `gen_ai.request.model`, `gen_ai.token.type` 标记 | | `gen_ai.client.operation.duration` | histogram | LLM 调用持续时间 | ### 控制台快速开始(无需 collector) 将 spans 直接打印到 stdout —— 对本地调试非常有用: ``` OTEL_TRACES_EXPORTER=console gitagent -p "test" ``` ### 本地 Jaeger 快速开始 ``` docker run --rm -p 16686:16686 -p 4318:4318 jaegertracing/all-in-one:latest OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 gitagent -p "test" # Open http://localhost:16686 → service "gitagent" ``` ## 贡献 欢迎提交贡献!请查阅 [CONTRIBUTING.md](./CONTRIBUTING.md) 了解指南。 ## ❓ 常见问题 ### 通用 **什么是 Gitagent?** GitAgent(原名 Gitclaw)是一个 git-native 的 AI agent 框架,其中 agent 本身就是一个 git 仓库。身份、规则、记忆、工具和技能都是受版本控制的文件,从而实现了“agents as repos”的范式。 **Gitagent 与其他 agent 框架有何不同?** 与那些将配置散布在应用程序代码中的框架不同,Gitagent 让 agent 本身成为一个 git 仓库: - Fork 一个 agent → 继承个性、规则、工具 - Branch → 创建备用个性版本 - `git log` → 查看 agent 的记忆演变 - Diff → 追踪随时间变化的规则 **什么是“agents as repos”概念?** 你的 agent 生存于一个包含结构化文件的 git 仓库中: - `agent.yaml` — 模型、工具、运行时配置 - `SOUL.md` — 个性与身份 - `RULES.md` — 行为约束 - `memory/` — 拥有完整历史的 git 提交记忆 - `tools/` — 声明式 YAML 工具定义 - `skills/` — 可组合的技能模块 - `hooks/` — 生命周期 Hooks ### 安装与设置 **有什么系统要求?** Node.js 18+(或推荐 20+)、npm 和 git。通过 `npm install -g @open-gitagent/gitagent` 全局安装(精简版 CLI + SDK)。添加 `@open-gitagent/voice` 以获取语音模式和 Web UI。 **我该如何设置 API key?** 运行安装程序以进行引导式设置: ``` bash <(curl -fsSL "https://raw.githubusercontent.com/open-gitagent/gitagent/main/install.sh") ``` 或者手动设置: ``` export OPENAI_API_KEY="sk-..." ``` **支持哪些 LLM 提供商?** - OpenAI (GPT-4o, GPT-4o-mini 等) - Anthropic (通过原生 SDK 支持 Claude 模型) - 任何兼容 OpenAI 的提供商 使用 `--model` 标志进行覆盖:`gitagent --model anthropic:claude-sonnet-4-5-20250929` ### 核心概念 **什么是 SDK,我该如何使用它?** SDK 通过 `query()` 函数提供编程访问权限,该函数流式传输 agent 事件: ``` import { query } from "gitagent"; for await (const msg of query({ prompt: "hello", model: "openai:gpt-4o-mini" })) { if (msg.type === "delta") process.stdout.write(msg.content); } ``` **本地仓库模式会话是如何工作的?** Clone 一个 GitHub 仓库,在其上运行 agent,并自动提交到一个 session branch: ``` gitagent --repo https://github.com/org/repo --pat ghp_xxx "Fix the bug" ``` 恢复会话:`gitagent --repo URL --session gitagent/session-xxx "Continue"` **有哪些可用的 Hooks?** Hooks 是位于 `hooks/` 目录中的生命周期脚本或编程处理程序。它们在工具执行、会话开始/结束或记忆更新等 agent 事件发生时触发。 ### 开发 **我该如何创建自定义工具?** 使用声明式 YAML 格式在 `tools/` 目录中定义工具。每个工具需指定名称、描述、参数和执行逻辑。 **我该如何添加技能?** 在 `skills/` 目录中创建技能模块。技能是可组合的,可以从已安装的包中导入,也可以在本地定义。 **有哪些遥测选项可用?** 用于系统可观测性的 OpenTelemetry 集成: - 设置 `OTEL_EXPORTER_OTLP_ENDPOINT` 以自动启用 - 使用 `OTEL_TRACES_EXPORTER=console` 进行本地调试 - 使用 Docker 快速开始 Jaeger ### 故障排除 **为什么我的 agent 没有响应?** - 检查是否设置了 API key(`OPENAI_API_KEY` 或类似变量) - 验证与 LLM 提供商的网络连接 - 使用 `--verbose` 标志获取详细日志 - 检查 `agent.yaml` 模型配置 **我该如何调试 agent 行为?** - 使用控制台 exporter:`OTEL_TRACES_EXPORTER=console gitagent -p "test"` - 在 Jaeger 中检查 spans:`docker run -p 16686:16686 -p 4318:4318 jaegertracing/all-in-one` - 检查 `memory/` 目录以获取 agent 状态 **我可以在哪里获得帮助?** - GitHub Issues:https://github.com/open-gitagent/gitagent/issues - 示例:请参阅 README SDK 部分和 CLI 选项 - 贡献:请参阅 CONTRIBUTING.md 了解指南 ## 许可证 本项目基于 [MIT License](./LICENSE) 授权。
标签:Git, MITM代理, Petitpotam, TypeScript, 多模态, 安全可观测性, 安全插件, 开发框架, 暗色界面, 版本控制, 自动化攻击