# OpenCode LSP：让 Agent 根据真实类型诊断修复跨文件接口错配

## 执行范围

已运行 TypeScript tsserver 原生协议，跨文件得到2322诊断并在修复后清空；未调用OpenCode模型或伪装OpenCode会话。

## 输入与目标

两个TS文件间可空类型和函数返回值错配的小工程

交付：修复补丁、诊断前后列表与可运行小工程

## 运行

在 reference 目录执行；先按文件 requirements.txt / package.json 或原生工具文档安装依赖。浏览器练习需 `npx playwright install chromium`；也可设置 `PLAYWRIGHT_EXECUTABLE_PATH` 为自己的 Chrome 路径。

```sh
TSSERVER_JS="<typescript/lib/tsserver.js>" node lsp.mjs
```

## 目录

- fixtures：作者原创输入，不包含用户真实资料。
- starter：读者待完成任务。
- reference：作者完成参考。
- results：作者实际运行所得或明确标注的待运行输入/预期合同。

## 七步

1. **保留跨文件合同**

models.ts定义massGrams为number。坏调用把1200写成字符串；先保留共享类型，不能为了通过检查改成any。

2. **连接真实诊断**

在自己的OpenCode检查TypeScript LSP状态。作者参考直接启动真实tsserver，按协议打开文件并请求semanticDiagnosticsSync。

3. **定位类型错误**

回读2322及relatedInformation：调用端第二行和models.ts属性声明关联起来。不是凭截图猜哪个文件应修改。

4. **约束Agent补丁**

要求只修调用方数值输入，保留克单位与destination枚举。禁止ts-ignore、any或放松共享类型来消除红线。

5. **回读修复诊断**

打开fixed.ts并请求相同原生诊断。坏输入有2322，修复后body为空，两个查询使用同一工具链。

6. **加业务边界**

在自己的任务中补空值和单位错误测试。类型诊断不证明运费算法正确，也不能把克与千克混为一谈。

7. **交付诊断对照**

保存源码、原生前后诊断和实际修改范围。页面展示tsserver输出，OpenCode账号生成补丁仍需单独运行。

## 来源

- https://opencode.ai/docs/lsp/


## 原生工具与边界补充

先在reference执行npm install；TSSERVER_JS可设为本目录node_modules/typescript/lib/tsserver.js。使用Node 20或以上。
