[
  {
    "id": "01-cli-startup",
    "title": "CLI / 启动入口",
    "difficulty": "入门",
    "status": "complete",
    "estimatedMinutes": 30,
    "summary": "理解 opencode 命令如何启动、注册子命令，并把 run/serve 等命令导向统一 runtime。",
    "html": "chapters/01-cli-startup.html",
    "markdown": "markdown/01-cli-startup.md",
    "sourceFiles": [
      "packages/opencode/package.json",
      "packages/opencode/src/index.ts",
      "packages/opencode/src/cli/cmd/run.ts",
      "packages/opencode/src/cli/effect-cmd.ts"
    ]
  },
  {
    "id": "02-session-message",
    "title": "用户输入与会话",
    "difficulty": "中等",
    "status": "complete",
    "estimatedMinutes": 35,
    "summary": "理解 CLI/API 输入如何变成 session、message 和 part，并被后续 agent loop 消费。",
    "html": "chapters/02-session-message.html",
    "markdown": "markdown/02-session-message.md",
    "sourceFiles": [
      "packages/opencode/src/server/routes/instance/httpapi/groups/session.ts",
      "packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts",
      "packages/opencode/src/session/prompt.ts",
      "packages/opencode/src/session/session.ts",
      "packages/opencode/src/session/message-v2.ts"
    ]
  },
  {
    "id": "03-agent-core-loop",
    "title": "Agent 核心循环",
    "difficulty": "较难",
    "status": "complete",
    "estimatedMinutes": 55,
    "summary": "理解 OpenCode 如何在 session 内反复读取消息、选择模型和工具、调用 LLM、处理 tool call，并决定继续或结束。",
    "html": "chapters/03-agent-core-loop.html",
    "markdown": "markdown/03-agent-core-loop.md",
    "sourceFiles": [
      "packages/opencode/src/session/prompt.ts",
      "packages/opencode/src/session/processor.ts",
      "packages/opencode/src/session/run-state.ts",
      "packages/opencode/src/session/tools.ts",
      "packages/opencode/src/session/llm.ts",
      "packages/opencode/src/session/llm/ai-sdk.ts",
      "packages/opencode/src/session/message-v2.ts",
      "packages/opencode/src/cli/cmd/run.ts",
      "packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts"
    ]
  },
  {
    "id": "04-llm-provider",
    "title": "模型 Provider / LLM 调用",
    "difficulty": "较难",
    "status": "complete",
    "estimatedMinutes": 50,
    "summary": "理解内部消息、system prompt、工具 schema 如何被转换成不同 provider 的模型请求。",
    "html": "chapters/04-llm-provider.html",
    "markdown": "markdown/04-llm-provider.md",
    "sourceFiles": [
      "packages/opencode/src/session/llm.ts",
      "packages/opencode/src/session/llm/ai-sdk.ts",
      "packages/opencode/src/session/llm/native-runtime.ts",
      "packages/opencode/src/provider/provider.ts",
      "packages/opencode/src/provider/transform.ts",
      "packages/llm/src/protocols/index.ts"
    ]
  },
  {
    "id": "05-tool-calling",
    "title": "Tool 调用系统",
    "difficulty": "中等",
    "status": "complete",
    "estimatedMinutes": 45,
    "summary": "理解 Tool 定义、注册、暴露给模型、执行、权限和结果回填的完整机制。",
    "html": "chapters/05-tool-calling.html",
    "markdown": "markdown/05-tool-calling.md",
    "sourceFiles": [
      "packages/opencode/src/tool/tool.ts",
      "packages/opencode/src/tool/registry.ts",
      "packages/opencode/src/session/tools.ts",
      "packages/plugin/src/tool.ts"
    ]
  },
  {
    "id": "06-file-editing",
    "title": "文件读写与代码修改",
    "difficulty": "中等",
    "status": "complete",
    "estimatedMinutes": 40,
    "summary": "理解 read/edit/write 工具如何解析路径、申请权限、修改文件、格式化并触发诊断。",
    "html": "chapters/06-file-editing.html",
    "markdown": "markdown/06-file-editing.md",
    "sourceFiles": [
      "packages/opencode/src/tool/read.ts",
      "packages/opencode/src/tool/edit.ts",
      "packages/opencode/src/tool/write.ts",
      "packages/opencode/src/file/",
      "packages/opencode/src/format/",
      "packages/opencode/src/lsp/lsp.ts"
    ]
  },
  {
    "id": "07-shell-execution",
    "title": "Shell / 命令执行",
    "difficulty": "较难",
    "status": "complete",
    "estimatedMinutes": 45,
    "summary": "理解 shell tool 如何解析命令、识别路径和命令模式、审批并执行进程。",
    "html": "chapters/07-shell-execution.html",
    "markdown": "markdown/07-shell-execution.md",
    "sourceFiles": [
      "packages/opencode/src/tool/shell.ts",
      "packages/opencode/src/session/prompt.ts",
      "packages/opencode/src/session/run-state.ts",
      "packages/opencode/src/permission/index.ts"
    ]
  },
  {
    "id": "08-lsp-diagnostics",
    "title": "LSP / 诊断 / 上下文增强",
    "difficulty": "较难",
    "status": "complete",
    "estimatedMinutes": 45,
    "summary": "理解 OpenCode 如何启动 LSP client，并把 diagnostics、hover、definition 等反馈给 agent。",
    "html": "chapters/08-lsp-diagnostics.html",
    "markdown": "markdown/08-lsp-diagnostics.md",
    "sourceFiles": [
      "packages/opencode/src/lsp/lsp.ts",
      "packages/opencode/src/lsp/client.ts",
      "packages/opencode/src/lsp/diagnostic.ts",
      "packages/opencode/src/tool/edit.ts",
      "packages/opencode/src/tool/write.ts"
    ]
  },
  {
    "id": "09-permission-security",
    "title": "权限、审批、安全边界",
    "difficulty": "中等",
    "status": "complete",
    "estimatedMinutes": 40,
    "summary": "理解 allow/deny/ask ruleset 如何保护读写文件、执行命令和外部目录访问。",
    "html": "chapters/09-permission-security.html",
    "markdown": "markdown/09-permission-security.md",
    "sourceFiles": [
      "packages/opencode/src/permission/index.ts",
      "packages/opencode/src/permission/evaluate.ts",
      "packages/opencode/src/permission/schema.ts",
      "packages/opencode/src/agent/agent.ts",
      "packages/opencode/src/session/tools.ts"
    ]
  },
  {
    "id": "10-config-system",
    "title": "配置系统",
    "difficulty": "较难",
    "status": "pending",
    "estimatedMinutes": 45,
    "summary": "理解全局、项目、环境变量、远程和内联配置如何合并并影响 agent/provider/tool。",
    "html": "chapters/10-config-system.html",
    "markdown": "markdown/10-config-system.md",
    "sourceFiles": [
      "packages/opencode/src/config/config.ts",
      "packages/opencode/src/config/agent.ts",
      "packages/opencode/src/config/permission.ts",
      "packages/opencode/src/config/plugin.ts",
      "packages/opencode/src/project/bootstrap.ts"
    ]
  },
  {
    "id": "11-ui-tui-desktop-ide",
    "title": "UI / TUI / Desktop / IDE 相关",
    "difficulty": "中等到较难",
    "status": "complete",
    "estimatedMinutes": 35,
    "summary": "理解 CLI/TUI、Web app、Desktop 和 VS Code extension 如何复用同一套 runtime。",
    "html": "chapters/11-ui-tui-desktop-ide.html",
    "markdown": "markdown/11-ui-tui-desktop-ide.md",
    "sourceFiles": [
      "packages/opencode/src/cli/cmd/run.ts",
      "packages/opencode/src/cli/cmd/tui/",
      "packages/app/package.json",
      "packages/ui/package.json",
      "packages/desktop/package.json",
      "sdks/vscode/package.json",
      "sdks/vscode/src/extension.ts"
    ]
  },
  {
    "id": "12-sdk-api-extension",
    "title": "SDK / API / 对外扩展点",
    "difficulty": "中等",
    "status": "complete",
    "estimatedMinutes": 40,
    "summary": "理解 HTTP API、generated SDK、plugin hooks 和扩展点如何让外部程序接入 OpenCode。",
    "html": "chapters/12-sdk-api-extension.html",
    "markdown": "markdown/12-sdk-api-extension.md",
    "sourceFiles": [
      "packages/opencode/src/server/server.ts",
      "packages/opencode/src/server/routes/instance/httpapi/api.ts",
      "packages/opencode/src/server/routes/instance/httpapi/groups/session.ts",
      "packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts",
      "packages/sdk/js/src/client.ts",
      "packages/sdk/js/src/server.ts",
      "packages/opencode/src/plugin/index.ts",
      "packages/plugin/src/index.ts"
    ]
  },
  {
    "id": "13-testing-engineering",
    "title": "测试与工程化",
    "difficulty": "入门",
    "status": "complete",
    "estimatedMinutes": 25,
    "summary": "理解 monorepo 构建、类型检查、测试任务和开发规范如何支撑大型 agent 项目。",
    "html": "chapters/13-testing-engineering.html",
    "markdown": "markdown/13-testing-engineering.md",
    "sourceFiles": [
      "package.json",
      "turbo.json",
      "tsconfig.json",
      "AGENTS.md",
      "packages/opencode/package.json",
      "packages/sdk/js/package.json"
    ]
  },
  {
    "id": "14-mini-coding-agent",
    "title": "从 OpenCode 反推 mini coding agent",
    "difficulty": "中等",
    "status": "complete",
    "estimatedMinutes": 60,
    "summary": "把 OpenCode 的 CLI、session、LLM、tool、permission 和 processor 源码反推成一个可自己实现的 mini coding agent 闭环。",
    "html": "chapters/14-mini-coding-agent.html",
    "markdown": "markdown/14-mini-coding-agent.md",
    "sourceFiles": [
      "packages/opencode/src/cli/cmd/run.ts",
      "packages/opencode/src/session/prompt.ts",
      "packages/opencode/src/session/llm.ts",
      "packages/opencode/src/tool/tool.ts",
      "packages/opencode/src/session/tools.ts",
      "packages/opencode/src/permission/index.ts",
      "packages/opencode/src/tool/read.ts",
      "packages/opencode/src/tool/edit.ts",
      "packages/opencode/src/tool/shell.ts",
      "packages/opencode/src/session/processor.ts",
      "packages/opencode/src/server/routes/instance/httpapi/handlers/event.ts"
    ]
  }
]
