{"owner":"obot-platform","repo":"nanobot","hasSkills":true,"hasMcp":true,"mcpConfig":{"mcpServers":{"nanobot":{"command":"npx","args":["-y","@modelcontextprotocol/server-nanobot"]}}},"found":["CLAUDE.md","pkg/servers/workflows/testdata/with-workflows/workflows/test-workflow/SKILL.md","pkg/servers/system/testdata/with-user-skills/skills/user-skill.md"],"skills":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nNanobot is a standalone MCP (Model Context Protocol) host that enables building agents with MCP and MCP-UI. Unlike built-in MCP hosts in applications like VSCode, Claude, or ChatGPT, Nanobot is designed to be an open-source, deployable solution that combines MCP servers with LLMs to create agent experiences through external interfaces such as Obot. The project is written in Go.\n\n**Technology Stack:**\n- Go 1.26.0 with GORM (SQLite, MySQL, PostgreSQL) and goja (JavaScript runtime for hooks)\n\n## Build and Development Commands\n\n### Backend (Go)\n\n```bash\n# Build the nanobot binary\nmake\n\n# Run nanobot with a configuration file\n./bin/nanobot run ./nanobot.yaml\n\n# Run Go tests\ngo test ./...\n\n# Run a specific test\ngo test ./pkg/agents -run TestName\n\n# Format Go code\ngofmt -w .\n```\n\n## Architecture Overview\n\n### Backend Architecture\n\n**Core Components:**\n\n- **Runtime (`pkg/runtime/`)** - Main orchestration layer that initializes the system. Creates and wires together the LLM client, tool service, agents, and sampling components. Manages the overall execution environment.\n\n- **Agents (`pkg/agents/`)** - Agent execution engine that handles tool mapping, request population, and agent interactions. Responsible for running agents backed by LLMs with access to tools.\n\n- **Tools Service (`pkg/tools/`)** - Central registry for tools and agents. Handles tool discovery, mapping, and execution delegation. Manages MCP server connections.\n\n- **MCP Layer (`pkg/mcp/`)** - MCP protocol implementation including sessions, clients, servers, and wire protocols. Handles both stdio and HTTP transports. Key types:\n  - `Session` - Manages MCP session lifecycle and message routing\n  - `Client` - MCP client implementation for connecting to servers\n  - `Wire` - Protocol transport abstraction (stdio/HTTP)\n\n- **LLM Integration (`pkg/llm/`)** - Abstraction over different LLM providers (OpenAI, Anthropic). Routes requests to appropriate providers based on model names. Handles both completion and response APIs.\n\n- **Session Management (`pkg/session/`, `pkg/sessiondata/`)** - Manages user sessions, conversation state, and session-scoped data. Handles agent context, tool mappings, and resource mappings within sessions. Supports parent-child session relationships and database-backed OAuth token storage.\n\n- **Server Layer (`pkg/server/`)** - HTTP server handling MCP protocol over HTTP. Routes requests for initialize, tools/list, tools/call, prompts/*, resources/*, etc. Manages session creation and request routing.\n\n- **Built-in MCP Servers (`pkg/servers/`)** - Nanobot includes several built-in MCP servers:\n  - `agent/` - Exposes individual agents as MCP servers with chat capabilities\n  - `capabilities/` - Session initialization and capability management (workspace setup)\n  - `meta/` - Metadata and introspection tools (list_chats, update_chat, list_agents)\n  - `resources/` - Database-backed resource management (create_resource, delete_resource) with automatic mimetype detection\n  - `workspace/` - Workspace and session management (create/update/delete workspaces, session reading)\n\n- **Configuration (`pkg/config/`)** - YAML-based configuration loading and validation. Supports profiles, extends (inheritance), and environment variables. See `pkg/config/schema.yaml` for the complete schema.\n\n**Key Architectural Patterns:**\n\n- **Tool Mappings** - Tools from MCP servers are mapped to agent-accessible tools. The `BuildToolMappings` method creates this mapping by resolving tool references from agents and MCP servers.\n\n- **Hooks** - Lifecycle hooks for agents and MCP servers (config, request, response). Hooks are TypeScript/JavaScript functions that can modify configuration and messages. See `hooks.ts` for type definitions.\n\n- **Sandboxing** - MCP servers can run in Docker containers for isolation. The `pkg/mcp/sandbox/` handles containerization and port mapping.\n\nNanobot does not bundle a frontend. External UIs communicate through MCP endpoints, `/api/events`, and the browser proxy routes.\n\n## Configuration\n\nConfiguration is YAML-based. Key top-level sections:\n\n- `agents` - Define agents with their models, tools, instructions, and behaviors\n- `mcp-servers` - MCP server configurations (command, URL, Docker image, etc.)\n- `prompts` - Template definitions\n- `publish` - Defines what to expose when Nanobot itself acts as an MCP server\n- `env` - Environment variable definitions with descriptions and defaults\n- `auth` - Authentication configuration (OAuth, remote headers)\n- `profiles` - Configuration profiles for different environments\n- `extends` - Inherit from other configuration files\n\nExample minimal configuration:\n\n```yaml\nagents:\n  myagent:\n    name: My Agent\n    model: gpt-4\n    mcpServers: my-mcp-server\n\nmcpServers:\n  my-mcp-server:\n    url: https://example.com/mcp\n```\n\n## Important Go Packages\n\n- `pkg/types/` - Core type definitions shared across the system (Config, Agent, Message, ToolCall, etc.)\n- `pkg/complete/` - Utility package for handling option completion and merging\n- `pkg/expr/` - Expression evaluation for dynamic values in configurations\n- `pkg/schema/` - JSON Schema validation and manipulation\n- `pkg/supervise/` - Process supervision for running MCP server subprocesses\n- `pkg/sampling/` - Handles MCP sampling requests (LLM-in-the-loop)\n- `pkg/envvar/` - Environment variable handling with descriptions and defaults\n- `pkg/cmd/` - CLI command handling (routes from `main.go`)\n\n## Entry Points and Special Modes\n\n**Main Entry Point:** `main.go` routes commands to `pkg/cmd`\n\n**Special `_exec` Mode:** Nanobot can act as a daemon wrapper for MCP server subprocesses. When invoked with `_exec` as the first argument, it handles stdio piping and process lifecycle management for MCP servers. This enables Nanobot to supervise and manage MCP server processes.\n\n## Testing\n\nGo tests follow standard Go conventions:\n- Test files are named `*_test.go`\n- Run all tests: `go test ./...`\n- Run specific package tests: `go test ./pkg/agents`\n- Run specific test: `go test ./pkg/agents -run TestName`\n\n## Common Patterns\n\n### Adding a New Agent Hook\n\n1. Define TypeScript types in `hooks.ts` (root level)\n2. Update corresponding Go types in `pkg/types/hooks.go`\n3. Implement hook handling in `pkg/agents/` or relevant package\n4. Hook execution is managed through `pkg/mcp/hooks.go`\n\n### Adding a New Tool\n\n1. Tools come from MCP servers (external or built-in servers in `pkg/servers/`)\n2. Tool resolution happens in `pkg/tools/service.go`\n\n### Working with Sessions\n\n- Sessions are scoped to MCP connections\n- Use `mcp.SessionFromContext(ctx)` to get current session\n- Session state includes tool mappings, current agent, and custom attributes\n- Parent sessions can be accessed via `Session.Parent`\n- Root session can be accessed via `session.Root()`\n\n## MCP Protocol Notes\n\nNanobot supports both MCP standard and MCP-UI extensions:\n- Standard MCP: tools, prompts, resources, sampling\n- MCP-UI: Elicitations (user input prompts), progress notifications, structured UI elements\n\nWhen implementing MCP features, refer to:\n- MCP types in `pkg/mcp/types.go`\n- Message handling in `pkg/mcp/message.go`\n- Protocol reference at `https://modelcontextprotocol.io`\n\n## Code Style\n\n- Go: Follow standard Go conventions, use `gofmt`\n","pkg/servers/workflows/testdata/with-workflows/workflows/test-workflow/SKILL.md":"---\nname: test-workflow\ndescription: This is a test workflow for unit testing purposes.\nlicense: MIT\ncompatibility: nanobot >= 0.1.0\nmetadata:\n  createdAt: \"2026-01-15T09:00:00Z\"\n  author: testuser\n---\n\n## Inputs\n\n- **input_name** (required): A test input parameter.\n\n## Steps\n\n### 1. first_step\nDo something useful.\n\n---\n\n### 2. second_step\nDo something else.\n\n---\n\n## Output\n\nThe workflow completed successfully.\n","pkg/servers/system/testdata/with-user-skills/skills/user-skill.md":"---\nname: User-Defined Skill\ndescription: A user-defined skill\n---\n\n# User Skill\n\nThis is a custom user skill.\n"},"files":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nNanobot is a standalone MCP (Model Context Protocol) host that enables building agents with MCP and MCP-UI. Unlike built-in MCP hosts in applications like VSCode, Claude, or ChatGPT, Nanobot is designed to be an open-source, deployable solution that combines MCP servers with LLMs to create agent experiences through external interfaces such as Obot. The project is written in Go.\n\n**Technology Stack:**\n- Go 1.26.0 with GORM (SQLite, MySQL, PostgreSQL) and goja (JavaScript runtime for hooks)\n\n## Build and Development Commands\n\n### Backend (Go)\n\n```bash\n# Build the nanobot binary\nmake\n\n# Run nanobot with a configuration file\n./bin/nanobot run ./nanobot.yaml\n\n# Run Go tests\ngo test ./...\n\n# Run a specific test\ngo test ./pkg/agents -run TestName\n\n# Format Go code\ngofmt -w .\n```\n\n## Architecture Overview\n\n### Backend Architecture\n\n**Core Components:**\n\n- **Runtime (`pkg/runtime/`)** - Main orchestration layer that initializes the system. Creates and wires together the LLM client, tool service, agents, and sampling components. Manages the overall execution environment.\n\n- **Agents (`pkg/agents/`)** - Agent execution engine that handles tool mapping, request population, and agent interactions. Responsible for running agents backed by LLMs with access to tools.\n\n- **Tools Service (`pkg/tools/`)** - Central registry for tools and agents. Handles tool discovery, mapping, and execution delegation. Manages MCP server connections.\n\n- **MCP Layer (`pkg/mcp/`)** - MCP protocol implementation including sessions, clients, servers, and wire protocols. Handles both stdio and HTTP transports. Key types:\n  - `Session` - Manages MCP session lifecycle and message routing\n  - `Client` - MCP client implementation for connecting to servers\n  - `Wire` - Protocol transport abstraction (stdio/HTTP)\n\n- **LLM Integration (`pkg/llm/`)** - Abstraction over different LLM providers (OpenAI, Anthropic). Routes requests to appropriate providers based on model names. Handles both completion and response APIs.\n\n- **Session Management (`pkg/session/`, `pkg/sessiondata/`)** - Manages user sessions, conversation state, and session-scoped data. Handles agent context, tool mappings, and resource mappings within sessions. Supports parent-child session relationships and database-backed OAuth token storage.\n\n- **Server Layer (`pkg/server/`)** - HTTP server handling MCP protocol over HTTP. Routes requests for initialize, tools/list, tools/call, prompts/*, resources/*, etc. Manages session creation and request routing.\n\n- **Built-in MCP Servers (`pkg/servers/`)** - Nanobot includes several built-in MCP servers:\n  - `agent/` - Exposes individual agents as MCP servers with chat capabilities\n  - `capabilities/` - Session initialization and capability management (workspace setup)\n  - `meta/` - Metadata and introspection tools (list_chats, update_chat, list_agents)\n  - `resources/` - Database-backed resource management (create_resource, delete_resource) with automatic mimetype detection\n  - `workspace/` - Workspace and session management (create/update/delete workspaces, session reading)\n\n- **Configuration (`pkg/config/`)** - YAML-based configuration loading and validation. Supports profiles, extends (inheritance), and environment variables. See `pkg/config/schema.yaml` for the complete schema.\n\n**Key Architectural Patterns:**\n\n- **Tool Mappings** - Tools from MCP servers are mapped to agent-accessible tools. The `BuildToolMappings` method creates this mapping by resolving tool references from agents and MCP servers.\n\n- **Hooks** - Lifecycle hooks for agents and MCP servers (config, request, response). Hooks are TypeScript/JavaScript functions that can modify configuration and messages. See `hooks.ts` for type definitions.\n\n- **Sandboxing** - MCP servers can run in Docker containers for isolation. The `pkg/mcp/sandbox/` handles containerization and port mapping.\n\nNanobot does not bundle a frontend. External UIs communicate through MCP endpoints, `/api/events`, and the browser proxy routes.\n\n## Configuration\n\nConfiguration is YAML-based. Key top-level sections:\n\n- `agents` - Define agents with their models, tools, instructions, and behaviors\n- `mcp-servers` - MCP server configurations (command, URL, Docker image, etc.)\n- `prompts` - Template definitions\n- `publish` - Defines what to expose when Nanobot itself acts as an MCP server\n- `env` - Environment variable definitions with descriptions and defaults\n- `auth` - Authentication configuration (OAuth, remote headers)\n- `profiles` - Configuration profiles for different environments\n- `extends` - Inherit from other configuration files\n\nExample minimal configuration:\n\n```yaml\nagents:\n  myagent:\n    name: My Agent\n    model: gpt-4\n    mcpServers: my-mcp-server\n\nmcpServers:\n  my-mcp-server:\n    url: https://example.com/mcp\n```\n\n## Important Go Packages\n\n- `pkg/types/` - Core type definitions shared across the system (Config, Agent, Message, ToolCall, etc.)\n- `pkg/complete/` - Utility package for handling option completion and merging\n- `pkg/expr/` - Expression evaluation for dynamic values in configurations\n- `pkg/schema/` - JSON Schema validation and manipulation\n- `pkg/supervise/` - Process supervision for running MCP server subprocesses\n- `pkg/sampling/` - Handles MCP sampling requests (LLM-in-the-loop)\n- `pkg/envvar/` - Environment variable handling with descriptions and defaults\n- `pkg/cmd/` - CLI command handling (routes from `main.go`)\n\n## Entry Points and Special Modes\n\n**Main Entry Point:** `main.go` routes commands to `pkg/cmd`\n\n**Special `_exec` Mode:** Nanobot can act as a daemon wrapper for MCP server subprocesses. When invoked with `_exec` as the first argument, it handles stdio piping and process lifecycle management for MCP servers. This enables Nanobot to supervise and manage MCP server processes.\n\n## Testing\n\nGo tests follow standard Go conventions:\n- Test files are named `*_test.go`\n- Run all tests: `go test ./...`\n- Run specific package tests: `go test ./pkg/agents`\n- Run specific test: `go test ./pkg/agents -run TestName`\n\n## Common Patterns\n\n### Adding a New Agent Hook\n\n1. Define TypeScript types in `hooks.ts` (root level)\n2. Update corresponding Go types in `pkg/types/hooks.go`\n3. Implement hook handling in `pkg/agents/` or relevant package\n4. Hook execution is managed through `pkg/mcp/hooks.go`\n\n### Adding a New Tool\n\n1. Tools come from MCP servers (external or built-in servers in `pkg/servers/`)\n2. Tool resolution happens in `pkg/tools/service.go`\n\n### Working with Sessions\n\n- Sessions are scoped to MCP connections\n- Use `mcp.SessionFromContext(ctx)` to get current session\n- Session state includes tool mappings, current agent, and custom attributes\n- Parent sessions can be accessed via `Session.Parent`\n- Root session can be accessed via `session.Root()`\n\n## MCP Protocol Notes\n\nNanobot supports both MCP standard and MCP-UI extensions:\n- Standard MCP: tools, prompts, resources, sampling\n- MCP-UI: Elicitations (user input prompts), progress notifications, structured UI elements\n\nWhen implementing MCP features, refer to:\n- MCP types in `pkg/mcp/types.go`\n- Message handling in `pkg/mcp/message.go`\n- Protocol reference at `https://modelcontextprotocol.io`\n\n## Code Style\n\n- Go: Follow standard Go conventions, use `gofmt`\n","pkg/servers/workflows/testdata/with-workflows/workflows/test-workflow/SKILL.md":"---\nname: test-workflow\ndescription: This is a test workflow for unit testing purposes.\nlicense: MIT\ncompatibility: nanobot >= 0.1.0\nmetadata:\n  createdAt: \"2026-01-15T09:00:00Z\"\n  author: testuser\n---\n\n## Inputs\n\n- **input_name** (required): A test input parameter.\n\n## Steps\n\n### 1. first_step\nDo something useful.\n\n---\n\n### 2. second_step\nDo something else.\n\n---\n\n## Output\n\nThe workflow completed successfully.\n","pkg/servers/system/testdata/with-user-skills/skills/user-skill.md":"---\nname: User-Defined Skill\ndescription: A user-defined skill\n---\n\n# User Skill\n\nThis is a custom user skill.\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nNanobot is a standalone MCP (Model Context Protocol) host that enables building agents with MCP and MCP-UI. Unlike built-in MCP hosts in applications like VSCode, Claude, or ChatGPT, Nanobot is designed to be an open-source, deployable solution that combines MCP servers with LLMs to create agent experiences through external interfaces such as Obot. The project is written in Go.\n\n**Technology Stack:**\n- Go 1.26.0 with GORM (SQLite, MySQL, PostgreSQL) and goja (JavaScript runtime for hooks)\n\n## Build and Development Commands\n\n### Backend (Go)\n\n```bash\n# Build the nanobot binary\nmake\n\n# Run nanobot with a configuration file\n./bin/nanobot run ./nanobot.yaml\n\n# Run Go tests\ngo test ./...\n\n# Run a specific test\ngo test ./pkg/agents -run TestName\n\n# Format Go code\ngofmt -w .\n```\n\n## Architecture Overview\n\n### Backend Architecture\n\n**Core Components:**\n\n- **Runtime (`pkg/runtime/`)** - Main orchestration layer that initializes the system. Creates and wires together the LLM client, tool service, agents, and sampling components. Manages the overall execution environment.\n\n- **Agents (`pkg/agents/`)** - Agent execution engine that handles tool mapping, request population, and agent interactions. Responsible for running agents backed by LLMs with access to tools.\n\n- **Tools Service (`pkg/tools/`)** - Central registry for tools and agents. Handles tool discovery, mapping, and execution delegation. Manages MCP server connections.\n\n- **MCP Layer (`pkg/mcp/`)** - MCP protocol implementation including sessions, clients, servers, and wire protocols. Handles both stdio and HTTP transports. Key types:\n  - `Session` - Manages MCP session lifecycle and message routing\n  - `Client` - MCP client implementation for connecting to servers\n  - `Wire` - Protocol transport abstraction (stdio/HTTP)\n\n- **LLM Integration (`pkg/llm/`)** - Abstraction over different LLM providers (OpenAI, Anthropic). Routes requests to appropriate providers based on model names. Handles both completion and response APIs.\n\n- **Session Management (`pkg/session/`, `pkg/sessiondata/`)** - Manages user sessions, conversation state, and session-scoped data. Handles agent context, tool mappings, and resource mappings within sessions. Supports parent-child session relationships and database-backed OAuth token storage.\n\n- **Server Layer (`pkg/server/`)** - HTTP server handling MCP protocol over HTTP. Routes requests for initialize, tools/list, tools/call, prompts/*, resources/*, etc. Manages session creation and request routing.\n\n- **Built-in MCP Servers (`pkg/servers/`)** - Nanobot includes several built-in MCP servers:\n  - `agent/` - Exposes individual agents as MCP servers with chat capabilities\n  - `capabilities/` - Session initialization and capability management (workspace setup)\n  - `meta/` - Metadata and introspection tools (list_chats, update_chat, list_agents)\n  - `resources/` - Database-backed resource management (create_resource, delete_resource) with automatic mimetype detection\n  - `workspace/` - Workspace and session management (create/update/delete workspaces, session reading)\n\n- **Configuration (`pkg/config/`)** - YAML-based configuration loading and validation. Supports profiles, extends (inheritance), and environment variables. See `pkg/config/schema.yaml` for the complete schema.\n\n**Key Architectural Patterns:**\n\n- **Tool Mappings** - Tools from MCP servers are mapped to agent-accessible tools. The `BuildToolMappings` method creates this mapping by resolving tool references from agents and MCP servers.\n\n- **Hooks** - Lifecycle hooks for agents and MCP servers (config, request, response). Hooks are TypeScript/JavaScript functions that can modify configuration and messages. See `hooks.ts` for type definitions.\n\n- **Sandboxing** - MCP servers can run in Docker containers for isolation. The `pkg/mcp/sandbox/` handles containerization and port mapping.\n\nNanobot does not bundle a frontend. External UIs communicate through MCP endpoints, `/api/events`, and the browser proxy routes.\n\n## Configuration\n\nConfiguration is YAML-based. Key top-level sections:\n\n- `agents` - Define agents with their models, tools, instructions, and behaviors\n- `mcp-servers` - MCP server configurations (command, URL, Docker image, etc.)\n- `prompts` - Template definitions\n- `publish` - Defines what to expose when Nanobot itself acts as an MCP server\n- `env` - Environment variable definitions with descriptions and defaults\n- `auth` - Authentication configuration (OAuth, remote headers)\n- `profiles` - Configuration profiles for different environments\n- `extends` - Inherit from other configuration files\n\nExample minimal configuration:\n\n```yaml\nagents:\n  myagent:\n    name: My Agent\n    model: gpt-4\n    mcpServers: my-mcp-server\n\nmcpServers:\n  my-mcp-server:\n    url: https://example.com/mcp\n```\n\n## Important Go Packages\n\n- `pkg/types/` - Core type definitions shared across the system (Config, Agent, Message, ToolCall, etc.)\n- `pkg/complete/` - Utility package for handling option completion and merging\n- `pkg/expr/` - Expression evaluation for dynamic values in configurations\n- `pkg/schema/` - JSON Schema validation and manipulation\n- `pkg/supervise/` - Process supervision for running MCP server subprocesses\n- `pkg/sampling/` - Handles MCP sampling requests (LLM-in-the-loop)\n- `pkg/envvar/` - Environment variable handling with descriptions and defaults\n- `pkg/cmd/` - CLI command handling (routes from `main.go`)\n\n## Entry Points and Special Modes\n\n**Main Entry Point:** `main.go` routes commands to `pkg/cmd`\n\n**Special `_exec` Mode:** Nanobot can act as a daemon wrapper for MCP server subprocesses. When invoked with `_exec` as the first argument, it handles stdio piping and process lifecycle management for MCP servers. This enables Nanobot to supervise and manage MCP server processes.\n\n## Testing\n\nGo tests follow standard Go conventions:\n- Test files are named `*_test.go`\n- Run all tests: `go test ./...`\n- Run specific package tests: `go test ./pkg/agents`\n- Run specific test: `go test ./pkg/agents -run TestName`\n\n## Common Patterns\n\n### Adding a New Agent Hook\n\n1. Define TypeScript types in `hooks.ts` (root level)\n2. Update corresponding Go types in `pkg/types/hooks.go`\n3. Implement hook handling in `pkg/agents/` or relevant package\n4. Hook execution is managed through `pkg/mcp/hooks.go`\n\n### Adding a New Tool\n\n1. Tools come from MCP servers (external or built-in servers in `pkg/servers/`)\n2. Tool resolution happens in `pkg/tools/service.go`\n\n### Working with Sessions\n\n- Sessions are scoped to MCP connections\n- Use `mcp.SessionFromContext(ctx)` to get current session\n- Session state includes tool mappings, current agent, and custom attributes\n- Parent sessions can be accessed via `Session.Parent`\n- Root session can be accessed via `session.Root()`\n\n## MCP Protocol Notes\n\nNanobot supports both MCP standard and MCP-UI extensions:\n- Standard MCP: tools, prompts, resources, sampling\n- MCP-UI: Elicitations (user input prompts), progress notifications, structured UI elements\n\nWhen implementing MCP features, refer to:\n- MCP types in `pkg/mcp/types.go`\n- Message handling in `pkg/mcp/message.go`\n- Protocol reference at `https://modelcontextprotocol.io`\n\n## Code Style\n\n- Go: Follow standard Go conventions, use `gofmt`\n","category":"root","tokens":1851},{"name":"SKILL.md","path":"pkg/servers/workflows/testdata/with-workflows/workflows/test-workflow/SKILL.md","title":"test-workflow Skill","content":"---\nname: test-workflow\ndescription: This is a test workflow for unit testing purposes.\nlicense: MIT\ncompatibility: nanobot >= 0.1.0\nmetadata:\n  createdAt: \"2026-01-15T09:00:00Z\"\n  author: testuser\n---\n\n## Inputs\n\n- **input_name** (required): A test input parameter.\n\n## Steps\n\n### 1. first_step\nDo something useful.\n\n---\n\n### 2. second_step\nDo something else.\n\n---\n\n## Output\n\nThe workflow completed successfully.\n","category":"pkg","tokens":104},{"name":"user-skill.md","path":"pkg/servers/system/testdata/with-user-skills/skills/user-skill.md","title":"user-skill.md","content":"---\nname: User-Defined Skill\ndescription: A user-defined skill\n---\n\n# User Skill\n\nThis is a custom user skill.\n","category":"pkg","tokens":28}]}