kodevu 0.1.66 → 0.1.68

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kodevu",
3
- "version": "0.1.66",
3
+ "version": "0.1.68",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Poll SVN revisions or Git commits, send each change diff to a reviewer CLI, and write configurable review reports.",
package/src/logger.js CHANGED
@@ -78,7 +78,7 @@ class Logger {
78
78
  const date = formatDate(new Date()).split(" ")[0];
79
79
  this.logFile = path.join(config.logsDir, `run-${date}.log`);
80
80
 
81
- // Simple rotation: Clean up logs older than 7 days
81
+ // Simple rotation: Keep the most recent 7 log files
82
82
  this.#cleanupOldLogs(config.logsDir);
83
83
  this.initialized = true;
84
84
  } catch (err) {
@@ -161,21 +161,32 @@ class Logger {
161
161
  ].join("-");
162
162
  }
163
163
 
164
-
165
-
166
164
  #cleanupOldLogs(logsDir) {
167
165
  try {
168
166
  const files = fs.readdirSync(logsDir);
169
- const now = Date.now();
170
- const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
171
167
 
172
- for (const file of files) {
173
- if (file.startsWith("run-") && file.endsWith(".log")) {
168
+ const logFiles = files
169
+ .filter((file) => file.startsWith("run-") && file.endsWith(".log"))
170
+ .map((file) => {
174
171
  const filePath = path.join(logsDir, file);
175
- const stats = fs.statSync(filePath);
176
- if (now - stats.mtimeMs > MAX_AGE_MS) {
177
- fs.unlinkSync(filePath);
172
+ try {
173
+ const stats = fs.statSync(filePath);
174
+ return { file, path: filePath, mtime: stats.mtimeMs };
175
+ } catch {
176
+ return null;
178
177
  }
178
+ })
179
+ .filter(Boolean)
180
+ .sort((a, b) => b.mtime - a.mtime);
181
+
182
+ const KEEP_COUNT = 7;
183
+ const toRemove = logFiles.slice(KEEP_COUNT);
184
+
185
+ for (const entry of toRemove) {
186
+ try {
187
+ fs.unlinkSync(entry.path);
188
+ } catch {
189
+ // Ignore individual deletion errors
179
190
  }
180
191
  }
181
192
  } catch (err) {
package/src/reviewers.js CHANGED
@@ -190,9 +190,21 @@ export const REVIEWERS = {
190
190
  debug: config.debug
191
191
  });
192
192
 
193
+ const message = execResult.stdout || execResult.stderr || "";
194
+
195
+ // Treat non-zero exit codes as failures and throw so callers can handle them.
196
+ if (typeof execResult.code === "number" && execResult.code !== 0) {
197
+ const err = new Error(
198
+ `OpenCode exited with code ${execResult.code}: ${execResult.stderr || execResult.stdout || ""}`
199
+ );
200
+ // attach execResult for callers that want more details
201
+ err.execResult = execResult;
202
+ throw err;
203
+ }
204
+
193
205
  return {
194
206
  ...execResult,
195
- message: execResult.stdout || execResult.stderr || ""
207
+ message
196
208
  };
197
209
  } finally {
198
210
  await fs.rm(tempDir, { recursive: true, force: true });