opencode-diff-viewer 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,38 +3,33 @@
3
3
  [![npm version](https://img.shields.io/npm/v/opencode-diff-viewer.svg)](https://www.npmjs.com/package/opencode-diff-viewer)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/opencode-diff-viewer.svg)](https://www.npmjs.com/package/opencode-diff-viewer)
5
5
 
6
- 一个 OpenCode 插件,使用 [lumen](https://github.com/jnsahaj/lumen) 提供美观的 TUI diff 查看功能。
6
+ 一个 OpenCode 插件,使用 [delta](https://github.com/dandavison/delta) 提供语法高亮的 git diff 查看功能。
7
7
 
8
8
  ## 功能特性
9
9
 
10
- - ✨ **自动安装 lumen** - 插件会自动检测并安装 lumen 依赖
10
+ - ✨ **自动安装 delta** - 插件会自动检测并安装 delta 依赖
11
11
  - 🚀 **一键查看 diff** - 使用 `/diff` 命令快速查看代码变更
12
- - 🔧 **智能终端适配** - 自动检测操作系统,打开新终端窗口展示 diff
12
+ - 🎨 **语法高亮** - 支持多种编程语言的语法高亮
13
13
  - 🤖 **LLM 工具集成** - LLM 可自动调用 `view_diff` 工具
14
14
 
15
15
  ## 前置条件
16
16
 
17
- ### 1. 安装 lumen
17
+ ### 1. 安装 delta
18
18
 
19
- 插件会自动尝试安装 lumen,如果自动安装失败,需要手动安装:
19
+ 插件会自动尝试安装 delta,如果自动安装失败,需要手动安装:
20
20
 
21
21
  **macOS / Linux (Homebrew)**:
22
22
  ```bash
23
- brew install jnsahaj/lumen/lumen
24
- ```
25
-
26
- **macOS / Linux (Bun)**:
27
- ```bash
28
- bun install jnsahaj/lumen/lumen
23
+ brew install dandavison/delta/delta
29
24
  ```
30
25
 
31
26
  **Cargo (Rust)**:
32
27
  ```bash
33
- cargo install lumen
28
+ cargo install delta
34
29
  ```
35
30
 
36
31
  **Windows**:
37
- 下载 [lumen releases](https://github.com/jnsahaj/lumen/releases) 并添加到 PATH
32
+ 下载 [delta releases](https://github.com/dandavison/delta/releases) 并添加到 PATH
38
33
 
39
34
  ### 2. Git 仓库
40
35
 
@@ -68,8 +63,8 @@ cat > ~/.config/opencode/opencode.json << 'EOF'
68
63
  {
69
64
  "command": {
70
65
  "diff": {
71
- "template": "View git diff using lumen TUI.",
72
- "description": "View diff of modified files using lumen TUI"
66
+ "template": "View git diff with syntax highlighting.",
67
+ "description": "Show git diff with syntax highlighting"
73
68
  }
74
69
  },
75
70
  "plugin": ["opencode-diff-viewer"]
@@ -96,32 +91,30 @@ EOF
96
91
 
97
92
  LLM 可以自动调用 `view_diff` 工具来展示代码变更。无需手动操作,LLM 会根据对话上下文智能判断何时需要展示 diff。
98
93
 
99
- ## lumen 快捷键
94
+ ## delta 快捷键
100
95
 
101
- lumen diff 查看器中:
96
+ 在 diff 输出中:
102
97
 
103
98
  | 快捷键 | 功能 |
104
99
  |--------|------|
105
- | `j` / `k` 或 `↑` / `↓` | 上/下移动 |
106
- | `{` / `}` | 跳转到上/下一个变更块 |
107
- | `Tab` | 切换侧边栏 |
108
- | `e` | 在编辑器中打开文件 |
109
- | `q` | 退出 |
100
+ | `n` / `p` | 下/上一个变更 |
101
+ | `N` / `P` | 下/上一个文件 |
102
+ | `q` | 退出(如果启用 pager) |
110
103
 
111
104
  ## 故障排除
112
105
 
113
- ### 1. lumen 未安装
106
+ ### 1. delta 未安装
114
107
 
115
108
  ```
116
- lumen is not installed
109
+ delta is not installed
117
110
  ```
118
111
 
119
- **解决方案**: 手动安装 lumen(见上方前置条件)
112
+ **解决方案**: 手动安装 delta(见上方前置条件)
120
113
 
121
114
  ### 2. 没有修改的文件
122
115
 
123
116
  ```
124
- 📝 No modified files to show diff for
117
+ 📝 No modified files
125
118
  ```
126
119
 
127
120
  **解决方案**: 确保文件已修改并暂存:
@@ -129,26 +122,20 @@ LLM 可以自动调用 `view_diff` 工具来展示代码变更。无需手动操
129
122
  git add .
130
123
  ```
131
124
 
132
- ### 3. 新终端未打开
133
-
134
- 检查终端模拟器是否支持:
135
- - macOS: Terminal.app
136
- - Linux: gnome-terminal 或 xterm
137
-
138
- ### 4. 插件未加载
125
+ ### 3. 插件未加载
139
126
 
140
127
  检查全局配置文件是否正确:
141
128
  ```bash
142
129
  cat ~/.config/opencode/opencode.json
143
130
  ```
144
131
 
145
- 确保配置正确,包含 `command` 和 `plugin` 两部分:
132
+ 确保配置正确:
146
133
  ```json
147
134
  {
148
135
  "command": {
149
136
  "diff": {
150
- "template": "View git diff using lumen TUI.",
151
- "description": "View diff of modified files using lumen TUI"
137
+ "template": "View git diff with syntax highlighting.",
138
+ "description": "Show git diff with syntax highlighting"
152
139
  }
153
140
  },
154
141
  "plugin": ["opencode-diff-viewer"]
@@ -158,8 +145,8 @@ cat ~/.config/opencode/opencode.json
158
145
  ## 工作原理
159
146
 
160
147
  1. **检测修改文件** - 插件使用 `git diff` 获取已暂存和未暂存的修改
161
- 2. **启动 lumen** - 在新终端窗口中运行 `lumen diff --file <files>`
162
- 3. **自动安装** - 插件启动时检查 lumen,未安装则自动安装
148
+ 2. **格式化输出** - 通过 `delta` 管道输出,带语法高亮
149
+ 3. **自动安装** - 插件启动时检查 delta,未安装则自动安装
163
150
 
164
151
  ## 项目结构
165
152
 
@@ -213,7 +200,7 @@ npm publish
213
200
 
214
201
  ## 依赖
215
202
 
216
- - [lumen](https://github.com/jnsahaj/lumen) - TUI Diff 查看器
203
+ - [delta](https://github.com/dandavison/delta) - 语法高亮的 git diff 查看器
217
204
  - [@opencode-ai/plugin](https://www.npmjs.com/package/@opencode-ai/plugin) - OpenCode 插件 SDK
218
205
 
219
206
  ## License
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: View diff of modified files using lumen TUI
3
+ agent: build
4
+ ---
5
+
6
+ Open the lumen diff viewer to show visual git diffs for modified files.
7
+
8
+ $ARGUMENTS
package/dist/index.d.ts CHANGED
@@ -1,7 +1,2 @@
1
1
  import type { Plugin } from "@opencode-ai/plugin";
2
- /**
3
- * OpenCode Diff Viewer Plugin
4
- * Uses lumen (https://github.com/jnsahaj/lumen) for visual git diffs.
5
- * Automatically installs lumen if not present.
6
- */
7
2
  export declare const DiffViewerPlugin: Plugin;
package/dist/index.js CHANGED
@@ -1,13 +1,8 @@
1
1
  import { tool } from "@opencode-ai/plugin";
2
- /**
3
- * OpenCode Diff Viewer Plugin
4
- * Uses lumen (https://github.com/jnsahaj/lumen) for visual git diffs.
5
- * Automatically installs lumen if not present.
6
- */
7
2
  export const DiffViewerPlugin = async ({ project, client, $, directory, worktree }) => {
8
- const isLumenInstalled = async () => {
3
+ const isDeltaInstalled = async () => {
9
4
  try {
10
- await $ `which lumen`;
5
+ await $ `which delta`;
11
6
  return true;
12
7
  }
13
8
  catch {
@@ -32,10 +27,10 @@ export const DiffViewerPlugin = async ({ project, client, $, directory, worktree
32
27
  return false;
33
28
  }
34
29
  };
35
- const installLumen = async () => {
30
+ const installDelta = async () => {
36
31
  if (await isBrewInstalled()) {
37
32
  try {
38
- await $ `brew install jnsahaj/lumen/lumen`;
33
+ await $ `brew install delta`;
39
34
  return { success: true, method: "brew" };
40
35
  }
41
36
  catch (e) {
@@ -44,7 +39,7 @@ export const DiffViewerPlugin = async ({ project, client, $, directory, worktree
44
39
  }
45
40
  if (await isCargoInstalled()) {
46
41
  try {
47
- await $ `cargo install lumen`;
42
+ await $ `cargo install delta`;
48
43
  return { success: true, method: "cargo" };
49
44
  }
50
45
  catch (e) {
@@ -53,20 +48,20 @@ export const DiffViewerPlugin = async ({ project, client, $, directory, worktree
53
48
  }
54
49
  return {
55
50
  success: false,
56
- error: "Neither brew nor cargo available. Please install lumen manually:\n brew install jnsahaj/lumen/lumen\n # or\n cargo install lumen"
51
+ error: "Neither brew nor cargo available. Please install delta manually:\n brew install dandavison/delta/delta\n # or\n cargo install delta"
57
52
  };
58
53
  };
59
- const ensureLumenInstalled = async () => {
60
- if (await isLumenInstalled()) {
54
+ const ensureDeltaInstalled = async () => {
55
+ if (await isDeltaInstalled()) {
61
56
  return { installed: true };
62
57
  }
63
- const result = await installLumen();
58
+ const result = await installDelta();
64
59
  if (result.success) {
65
- return { installed: true, message: `✅ lumen installed via ${result.method}` };
60
+ return { installed: true, message: `✅ delta installed via ${result.method}` };
66
61
  }
67
62
  return { installed: false, message: `❌ ${result.error}` };
68
63
  };
69
- await ensureLumenInstalled();
64
+ await ensureDeltaInstalled();
70
65
  const getModifiedFiles = async () => {
71
66
  try {
72
67
  const unstaged = await $ `git diff --name-only`.text();
@@ -81,47 +76,45 @@ export const DiffViewerPlugin = async ({ project, client, $, directory, worktree
81
76
  return [];
82
77
  }
83
78
  };
84
- const launchDiffViewer = async (files) => {
85
- if (!await isLumenInstalled()) {
86
- return "❌ lumen is not installed.\n\nTo install:\n brew install jnsahaj/lumen/lumen\n # or\n cargo install lumen";
79
+ const showDiff = async (files) => {
80
+ if (!await isDeltaInstalled()) {
81
+ return `❌ delta is not installed.
82
+
83
+ To install:
84
+ brew install dandavison/delta/delta
85
+ # or
86
+ cargo install delta
87
+
88
+ Then restart OpenCode.`;
87
89
  }
88
90
  const modifiedFiles = files && files.length > 0 ? files : await getModifiedFiles();
89
91
  if (modifiedFiles.length === 0) {
90
- return "📝 No modified files to show diff for.\n\nRun `git add .` to stage changes first.";
92
+ return "📝 No modified files.\n\nRun \`git add .\` to stage changes first.";
91
93
  }
92
- const platform = process.platform;
93
- const fileArgs = modifiedFiles.map(f => `"${f}"`).join(' ');
94
- const cmd = `cd "${directory}" && lumen diff ${fileArgs}`;
95
94
  try {
96
- if (platform === 'darwin') {
97
- await $ `osascript -e 'tell application "Terminal" to do script "${cmd}; exit"'`;
95
+ // Get diff output with delta
96
+ let diffOutput = "";
97
+ // Show staged diff
98
+ const stagedDiff = await $ `cd "${directory}" && git diff --staged`.text();
99
+ if (stagedDiff.trim()) {
100
+ diffOutput += "=== STAGED CHANGES ===\n\n";
101
+ diffOutput += await $ `cd "${directory}" && git diff --staged | delta --pager=never`.text();
98
102
  }
99
- else if (platform === 'linux') {
100
- try {
101
- await $ `which gnome-terminal && gnome-terminal -- bash -c "${cmd}; read -p 'Press Enter to close...'" `;
102
- }
103
- catch {
104
- try {
105
- await $ `which xterm && xterm -e "bash -c '${cmd}; read -p Press Enter to close...'" `;
106
- }
107
- catch {
108
- return `❌ No terminal emulator found (gnome-terminal/xterm).\n\nPlease run manually:\n ${cmd}`;
109
- }
110
- }
103
+ // Show unstaged diff
104
+ const unstagedDiff = await $ `cd "${directory}" && git diff`.text();
105
+ if (unstagedDiff.trim()) {
106
+ if (diffOutput)
107
+ diffOutput += "\n=== UNSTAGED CHANGES ===\n\n";
108
+ diffOutput += await $ `cd "${directory}" && git diff | delta --pager=never`.text();
111
109
  }
112
- else {
113
- await $ `${cmd}`;
110
+ if (!diffOutput.trim()) {
111
+ return "📝 No changes to show.";
114
112
  }
115
- return `✅ Opened lumen diff viewer for ${modifiedFiles.length} file(s):
116
- ${modifiedFiles.map(f => ` • ${f}`).join('\n')}
117
-
118
- Keybindings:
119
- j/k or ↑/↓: Navigate {/}: Jump between hunks
120
- tab: Toggle sidebar e: Open in editor
121
- q: Quit`;
113
+ const fileList = modifiedFiles.map(f => ` • ${f}`).join('\n');
114
+ return `✅ Modified files (${modifiedFiles.length}):\n${fileList}\n\n${diffOutput}`;
122
115
  }
123
- catch (error) {
124
- return `❌ Failed to launch diff viewer: ${error}\n\nTry running manually:\n ${cmd}`;
116
+ catch (e) {
117
+ return `❌ Error showing diff: ${e.message || e}`;
125
118
  }
126
119
  };
127
120
  return {
@@ -129,7 +122,7 @@ Keybindings:
129
122
  if (input.command === "diff") {
130
123
  const files = input.args?.trim() ? [input.args.trim()] : undefined;
131
124
  output.handled = true;
132
- output.result = await launchDiffViewer(files);
125
+ output.result = await showDiff(files);
133
126
  }
134
127
  },
135
128
  "file.edited": async ({ event }) => {
@@ -137,12 +130,12 @@ Keybindings:
137
130
  },
138
131
  tool: {
139
132
  view_diff: tool({
140
- description: "Open the lumen diff viewer to show git diff for modified files. Use this when the user wants to see visual diffs of their changes.",
133
+ description: "Show git diff with syntax highlighting using delta.",
141
134
  args: {
142
- file: tool.schema.string().optional().describe("Optional: specific file path to show diff for. If not provided, shows all modified files."),
135
+ file: tool.schema.string().optional().describe("Optional: specific file path"),
143
136
  },
144
137
  async execute(args, ctx) {
145
- return await launchDiffViewer(args.file ? [args.file] : undefined);
138
+ return await showDiff(args.file ? [args.file] : undefined);
146
139
  },
147
140
  }),
148
141
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-diff-viewer",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "OpenCode plugin for viewing git diffs using lumen TUI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",