@vite-plugin-opencode-assistant/opencode 1.0.61 → 1.0.63

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.
@@ -106,7 +106,7 @@ const PageContextPlugin = async () => {
106
106
  1. **确保操作正确页面(强制)**
107
107
  在使用 Chrome DevTools Mcp 执行任何与用户正在浏览的页面相关的任务之前,必须先确认当前操作的页面就是用户正在浏览的页面。如果不确定,应先获取当前页面 URL 并与上下文中的页面 URL 进行比对。
108
108
 
109
- 2. **快照获取**
109
+ 2. **快照获取(强制)**
110
110
  在没有获取到需要的节点信息时,使用 verbose 参数来获取更详细的节点信息。如果设置了 verbose 参数还是没有获取到节点信息,再尝试考虑其他方案。
111
111
 
112
112
  3. **单页应用(SPA)特性**
@@ -114,6 +114,9 @@ const PageContextPlugin = async () => {
114
114
 
115
115
  4. **HTTP 请求成功判断(强制)**
116
116
  判断请求成功时,不要只看 HTTP 状态码!HTTP 状态码 200 并不代表业务逻辑成功。必须获取接口的详细响应内容,检查响应体中的业务状态码或错误信息。在确认请求成功之前,始终解析并检查响应体的完整内容
117
+
118
+ 5. **工具使用优先级(强制)**
119
+ 在使用 Chrome DevTools MCP 工具时,\`chrome-devtools_evaluate_script\` 工具的使用优先级最低。只有在其他工具无法满足需求时,才考虑使用该工具
117
120
  `.trim();
118
121
  output.system.push(systemPrompt);
119
122
  }
@@ -128,7 +128,7 @@ const PageContextPlugin = () => __async(null, null, function* () {
128
128
  1. **\u786E\u4FDD\u64CD\u4F5C\u6B63\u786E\u9875\u9762\uFF08\u5F3A\u5236\uFF09**
129
129
  \u5728\u4F7F\u7528 Chrome DevTools Mcp \u6267\u884C\u4EFB\u4F55\u4E0E\u7528\u6237\u6B63\u5728\u6D4F\u89C8\u7684\u9875\u9762\u76F8\u5173\u7684\u4EFB\u52A1\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u786E\u8BA4\u5F53\u524D\u64CD\u4F5C\u7684\u9875\u9762\u5C31\u662F\u7528\u6237\u6B63\u5728\u6D4F\u89C8\u7684\u9875\u9762\u3002\u5982\u679C\u4E0D\u786E\u5B9A\uFF0C\u5E94\u5148\u83B7\u53D6\u5F53\u524D\u9875\u9762 URL \u5E76\u4E0E\u4E0A\u4E0B\u6587\u4E2D\u7684\u9875\u9762 URL \u8FDB\u884C\u6BD4\u5BF9\u3002
130
130
 
131
- 2. **\u5FEB\u7167\u83B7\u53D6**
131
+ 2. **\u5FEB\u7167\u83B7\u53D6\uFF08\u5F3A\u5236\uFF09**
132
132
  \u5728\u6CA1\u6709\u83B7\u53D6\u5230\u9700\u8981\u7684\u8282\u70B9\u4FE1\u606F\u65F6\uFF0C\u4F7F\u7528 verbose \u53C2\u6570\u6765\u83B7\u53D6\u66F4\u8BE6\u7EC6\u7684\u8282\u70B9\u4FE1\u606F\u3002\u5982\u679C\u8BBE\u7F6E\u4E86 verbose \u53C2\u6570\u8FD8\u662F\u6CA1\u6709\u83B7\u53D6\u5230\u8282\u70B9\u4FE1\u606F\uFF0C\u518D\u5C1D\u8BD5\u8003\u8651\u5176\u4ED6\u65B9\u6848\u3002
133
133
 
134
134
  3. **\u5355\u9875\u5E94\u7528\uFF08SPA\uFF09\u7279\u6027**
@@ -136,6 +136,9 @@ const PageContextPlugin = () => __async(null, null, function* () {
136
136
 
137
137
  4. **HTTP \u8BF7\u6C42\u6210\u529F\u5224\u65AD\uFF08\u5F3A\u5236\uFF09**
138
138
  \u5224\u65AD\u8BF7\u6C42\u6210\u529F\u65F6\uFF0C\u4E0D\u8981\u53EA\u770B HTTP \u72B6\u6001\u7801\uFF01HTTP \u72B6\u6001\u7801 200 \u5E76\u4E0D\u4EE3\u8868\u4E1A\u52A1\u903B\u8F91\u6210\u529F\u3002\u5FC5\u987B\u83B7\u53D6\u63A5\u53E3\u7684\u8BE6\u7EC6\u54CD\u5E94\u5185\u5BB9\uFF0C\u68C0\u67E5\u54CD\u5E94\u4F53\u4E2D\u7684\u4E1A\u52A1\u72B6\u6001\u7801\u6216\u9519\u8BEF\u4FE1\u606F\u3002\u5728\u786E\u8BA4\u8BF7\u6C42\u6210\u529F\u4E4B\u524D\uFF0C\u59CB\u7EC8\u89E3\u6790\u5E76\u68C0\u67E5\u54CD\u5E94\u4F53\u7684\u5B8C\u6574\u5185\u5BB9
139
+
140
+ 5. **\u5DE5\u5177\u4F7F\u7528\u4F18\u5148\u7EA7\uFF08\u5F3A\u5236\uFF09**
141
+ \u5728\u4F7F\u7528 Chrome DevTools MCP \u5DE5\u5177\u65F6\uFF0C\`chrome-devtools_evaluate_script\` \u5DE5\u5177\u7684\u4F7F\u7528\u4F18\u5148\u7EA7\u6700\u4F4E\u3002\u53EA\u6709\u5728\u5176\u4ED6\u5DE5\u5177\u65E0\u6CD5\u6EE1\u8DB3\u9700\u6C42\u65F6\uFF0C\u624D\u8003\u8651\u4F7F\u7528\u8BE5\u5DE5\u5177
139
142
  `.trim();
140
143
  output.system.push(systemPrompt);
141
144
  })
@@ -35,8 +35,13 @@ function detectLogLevel(line) {
35
35
  }
36
36
  function parseLogTimestamp(line) {
37
37
  const timestampPatterns = [
38
+ /(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{2}:\d{2})/,
38
39
  /(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z?)/,
40
+ /(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z)/,
39
41
  /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/,
42
+ /(\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2} [+-]\d{4})/,
43
+ /(\d{2}\/\d{2}\/\d{4},\s*\d{1,2}:\d{2}:\d{2}\s*(?:AM|PM))/i,
44
+ /([A-Z]{3}, \d{2} \w{3} \d{4} \d{2}:\d{2}:\d{2} GMT)/,
40
45
  /(\[([^\]]+)\])/
41
46
  ];
42
47
  for (const pattern of timestampPatterns) {
@@ -179,28 +184,29 @@ ${logFileConfig.description}
179
184
  sessionID: context.sessionID,
180
185
  directory: context.directory
181
186
  });
187
+ const requestedLimit = limit ?? 50;
182
188
  const entries = await readLogFileTail({
183
189
  name: logFileConfig.name,
184
190
  filePath: logFileConfig.path,
185
191
  projectRoot: process.cwd(),
186
- lines: limit ? Math.max(limit, 200) : 200,
192
+ lines: Math.max(requestedLimit * 3, 500),
187
193
  level: level ? level.split(",").map((l) => l.trim()) : void 0,
188
- since
194
+ since,
195
+ limit: requestedLimit
189
196
  });
190
- const filteredEntries = entries.slice(0, limit ?? 50);
191
- if (filteredEntries.length === 0) {
197
+ if (entries.length === 0) {
192
198
  return `当前没有符合条件的日志。
193
199
 
194
200
  建议:
195
201
  - 不指定参数获取所有日志
196
202
  - 使用 level=error,warn 获取错误和警告`;
197
203
  }
198
- const formattedLogs = filteredEntries.map((entry) => {
204
+ const formattedLogs = entries.map((entry) => {
199
205
  const time = new Date(entry.timestamp).toLocaleTimeString();
200
206
  const levelIcon = entry.level === "error" ? "❌" : entry.level === "warn" ? "⚠️" : "ℹ️";
201
207
  return `${time} ${levelIcon} ${entry.message}`;
202
208
  }).join("\n");
203
- return `${logFileConfig.name} 日志(${filteredEntries.length} 条):
209
+ return `${logFileConfig.name} 日志(${entries.length} 条):
204
210
 
205
211
  ${formattedLogs}`;
206
212
  }
@@ -70,28 +70,29 @@ ${logFileConfig.description}
70
70
  sessionID: context.sessionID,
71
71
  directory: context.directory
72
72
  });
73
+ const requestedLimit = limit != null ? limit : 50;
73
74
  const entries = yield readLogFileTail({
74
75
  name: logFileConfig.name,
75
76
  filePath: logFileConfig.path,
76
77
  projectRoot: process.cwd(),
77
- lines: limit ? Math.max(limit, 200) : 200,
78
+ lines: Math.max(requestedLimit * 3, 500),
78
79
  level: level ? level.split(",").map((l) => l.trim()) : void 0,
79
- since
80
+ since,
81
+ limit: requestedLimit
80
82
  });
81
- const filteredEntries = entries.slice(0, limit != null ? limit : 50);
82
- if (filteredEntries.length === 0) {
83
+ if (entries.length === 0) {
83
84
  return `\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u65E5\u5FD7\u3002
84
85
 
85
86
  \u5EFA\u8BAE\uFF1A
86
87
  - \u4E0D\u6307\u5B9A\u53C2\u6570\u83B7\u53D6\u6240\u6709\u65E5\u5FD7
87
88
  - \u4F7F\u7528 level=error,warn \u83B7\u53D6\u9519\u8BEF\u548C\u8B66\u544A`;
88
89
  }
89
- const formattedLogs = filteredEntries.map((entry) => {
90
+ const formattedLogs = entries.map((entry) => {
90
91
  const time = new Date(entry.timestamp).toLocaleTimeString();
91
92
  const levelIcon = entry.level === "error" ? "\u274C" : entry.level === "warn" ? "\u26A0\uFE0F" : "\u2139\uFE0F";
92
93
  return `${time} ${levelIcon} ${entry.message}`;
93
94
  }).join("\n");
94
- return `${logFileConfig.name} \u65E5\u5FD7\uFF08${filteredEntries.length} \u6761\uFF09\uFF1A
95
+ return `${logFileConfig.name} \u65E5\u5FD7\uFF08${entries.length} \u6761\uFF09\uFF1A
95
96
 
96
97
  ${formattedLogs}`;
97
98
  });
@@ -151,7 +151,7 @@ const PageContextPlugin = () => __async(null, null, function* () {
151
151
  1. **\u786E\u4FDD\u64CD\u4F5C\u6B63\u786E\u9875\u9762\uFF08\u5F3A\u5236\uFF09**
152
152
  \u5728\u4F7F\u7528 Chrome DevTools Mcp \u6267\u884C\u4EFB\u4F55\u4E0E\u7528\u6237\u6B63\u5728\u6D4F\u89C8\u7684\u9875\u9762\u76F8\u5173\u7684\u4EFB\u52A1\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u786E\u8BA4\u5F53\u524D\u64CD\u4F5C\u7684\u9875\u9762\u5C31\u662F\u7528\u6237\u6B63\u5728\u6D4F\u89C8\u7684\u9875\u9762\u3002\u5982\u679C\u4E0D\u786E\u5B9A\uFF0C\u5E94\u5148\u83B7\u53D6\u5F53\u524D\u9875\u9762 URL \u5E76\u4E0E\u4E0A\u4E0B\u6587\u4E2D\u7684\u9875\u9762 URL \u8FDB\u884C\u6BD4\u5BF9\u3002
153
153
 
154
- 2. **\u5FEB\u7167\u83B7\u53D6**
154
+ 2. **\u5FEB\u7167\u83B7\u53D6\uFF08\u5F3A\u5236\uFF09**
155
155
  \u5728\u6CA1\u6709\u83B7\u53D6\u5230\u9700\u8981\u7684\u8282\u70B9\u4FE1\u606F\u65F6\uFF0C\u4F7F\u7528 verbose \u53C2\u6570\u6765\u83B7\u53D6\u66F4\u8BE6\u7EC6\u7684\u8282\u70B9\u4FE1\u606F\u3002\u5982\u679C\u8BBE\u7F6E\u4E86 verbose \u53C2\u6570\u8FD8\u662F\u6CA1\u6709\u83B7\u53D6\u5230\u8282\u70B9\u4FE1\u606F\uFF0C\u518D\u5C1D\u8BD5\u8003\u8651\u5176\u4ED6\u65B9\u6848\u3002
156
156
 
157
157
  3. **\u5355\u9875\u5E94\u7528\uFF08SPA\uFF09\u7279\u6027**
@@ -159,6 +159,9 @@ const PageContextPlugin = () => __async(null, null, function* () {
159
159
 
160
160
  4. **HTTP \u8BF7\u6C42\u6210\u529F\u5224\u65AD\uFF08\u5F3A\u5236\uFF09**
161
161
  \u5224\u65AD\u8BF7\u6C42\u6210\u529F\u65F6\uFF0C\u4E0D\u8981\u53EA\u770B HTTP \u72B6\u6001\u7801\uFF01HTTP \u72B6\u6001\u7801 200 \u5E76\u4E0D\u4EE3\u8868\u4E1A\u52A1\u903B\u8F91\u6210\u529F\u3002\u5FC5\u987B\u83B7\u53D6\u63A5\u53E3\u7684\u8BE6\u7EC6\u54CD\u5E94\u5185\u5BB9\uFF0C\u68C0\u67E5\u54CD\u5E94\u4F53\u4E2D\u7684\u4E1A\u52A1\u72B6\u6001\u7801\u6216\u9519\u8BEF\u4FE1\u606F\u3002\u5728\u786E\u8BA4\u8BF7\u6C42\u6210\u529F\u4E4B\u524D\uFF0C\u59CB\u7EC8\u89E3\u6790\u5E76\u68C0\u67E5\u54CD\u5E94\u4F53\u7684\u5B8C\u6574\u5185\u5BB9
162
+
163
+ 5. **\u5DE5\u5177\u4F7F\u7528\u4F18\u5148\u7EA7\uFF08\u5F3A\u5236\uFF09**
164
+ \u5728\u4F7F\u7528 Chrome DevTools MCP \u5DE5\u5177\u65F6\uFF0C\`chrome-devtools_evaluate_script\` \u5DE5\u5177\u7684\u4F7F\u7528\u4F18\u5148\u7EA7\u6700\u4F4E\u3002\u53EA\u6709\u5728\u5176\u4ED6\u5DE5\u5177\u65E0\u6CD5\u6EE1\u8DB3\u9700\u6C42\u65F6\uFF0C\u624D\u8003\u8651\u4F7F\u7528\u8BE5\u5DE5\u5177
162
165
  `.trim();
163
166
  output.system.push(systemPrompt);
164
167
  })
@@ -93,28 +93,29 @@ ${logFileConfig.description}
93
93
  sessionID: context.sessionID,
94
94
  directory: context.directory
95
95
  });
96
+ const requestedLimit = limit != null ? limit : 50;
96
97
  const entries = yield (0, import_shared.readLogFileTail)({
97
98
  name: logFileConfig.name,
98
99
  filePath: logFileConfig.path,
99
100
  projectRoot: process.cwd(),
100
- lines: limit ? Math.max(limit, 200) : 200,
101
+ lines: Math.max(requestedLimit * 3, 500),
101
102
  level: level ? level.split(",").map((l) => l.trim()) : void 0,
102
- since
103
+ since,
104
+ limit: requestedLimit
103
105
  });
104
- const filteredEntries = entries.slice(0, limit != null ? limit : 50);
105
- if (filteredEntries.length === 0) {
106
+ if (entries.length === 0) {
106
107
  return `\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u65E5\u5FD7\u3002
107
108
 
108
109
  \u5EFA\u8BAE\uFF1A
109
110
  - \u4E0D\u6307\u5B9A\u53C2\u6570\u83B7\u53D6\u6240\u6709\u65E5\u5FD7
110
111
  - \u4F7F\u7528 level=error,warn \u83B7\u53D6\u9519\u8BEF\u548C\u8B66\u544A`;
111
112
  }
112
- const formattedLogs = filteredEntries.map((entry) => {
113
+ const formattedLogs = entries.map((entry) => {
113
114
  const time = new Date(entry.timestamp).toLocaleTimeString();
114
115
  const levelIcon = entry.level === "error" ? "\u274C" : entry.level === "warn" ? "\u26A0\uFE0F" : "\u2139\uFE0F";
115
116
  return `${time} ${levelIcon} ${entry.message}`;
116
117
  }).join("\n");
117
- return `${logFileConfig.name} \u65E5\u5FD7\uFF08${filteredEntries.length} \u6761\uFF09\uFF1A
118
+ return `${logFileConfig.name} \u65E5\u5FD7\uFF08${entries.length} \u6761\uFF09\uFF1A
118
119
 
119
120
  ${formattedLogs}`;
120
121
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vite-plugin-opencode-assistant/opencode",
3
- "version": "1.0.61",
3
+ "version": "1.0.63",
4
4
  "type": "module",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "es/index.mjs",
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "execa": "^9.6.1",
25
- "@vite-plugin-opencode-assistant/shared": "1.0.61"
25
+ "@vite-plugin-opencode-assistant/shared": "1.0.63"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@opencode-ai/plugin": "^1.3.15",