ccus-cli 0.2.18 → 0.2.19

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.
Files changed (3) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.js +21 -8
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -209,6 +209,8 @@ ccus aggregate serve --input-dir ./team-exports
209
209
 
210
210
  ## 定时同步
211
211
 
212
+ `sync`(含后台同步)、`export` 和个人 dashboard 在统计前自动同步 session 文件修改时间,默认仅修复跨天差异,并按实际文件去重硬链接。自动同步保持静默,异常信息可通过 `--verbose` 查看。
213
+
212
214
  session 内容已更新但文件修改时间仍旧,导致统计遗漏时,可手动修复:
213
215
 
214
216
  ```bash
package/dist/cli.js CHANGED
@@ -247,6 +247,25 @@ async function handleStatuslineEmit(options) {
247
247
  process.stdout.write(`${fallback.statusLine}\n`);
248
248
  }
249
249
  }
250
+ /** 统计前静默同步会话修改时间,修复失败时仍尝试原有统计流程。 */
251
+ async function loadSessionUsage(start, end) {
252
+ try {
253
+ const { repairSessionMtimes } = await Promise.resolve().then(() => __importStar(require("./lib/session-mtime")));
254
+ const results = await repairSessionMtimes(false);
255
+ (0, debug_1.debugLog)("sessions", "统计前同步修改时间", {
256
+ scanned: results.length,
257
+ repaired: results.filter((result) => result.status === "repaired").length,
258
+ issues: results.filter((result) => result.status === "failed" || result.status === "skipped"),
259
+ });
260
+ }
261
+ catch (error) {
262
+ (0, debug_1.debugLog)("sessions", "统计前同步修改时间失败", error);
263
+ }
264
+ return Promise.all([
265
+ (0, claude_1.summarizeClaudeProjectUsageCombined)(start, end),
266
+ (0, codex_sessions_1.summarizeCodexSessionUsageCombined)(start, end),
267
+ ]);
268
+ }
250
269
  /**
251
270
  * 加载 dashboard 渲染数据:statusline 事件、Claude/Codex 每日消息数与标准 API 等效成本。
252
271
  *
@@ -264,10 +283,7 @@ async function loadDashboardData(options, defaultRange) {
264
283
  // codex 消息柱图走 dailyUserMessages,不受影响。
265
284
  const events = (await (0, storage_1.readEventsForRange)(dataDir, range, now))
266
285
  .map((record) => (0, payload_1.computeStatuslineEvent)(record));
267
- const [claudeUsage, codexUsage] = await Promise.all([
268
- (0, claude_1.summarizeClaudeProjectUsageCombined)(window.start, window.end),
269
- (0, codex_sessions_1.summarizeCodexSessionUsageCombined)(window.start, window.end),
270
- ]);
286
+ const [claudeUsage, codexUsage] = await loadSessionUsage(window.start, window.end);
271
287
  const claudeDailyUsage = claudeUsage.daily;
272
288
  const codexDailyUsage = codexUsage.daily;
273
289
  const dailyUserMessages = (0, time_1.enumerateDateKeys)(window.start, window.end).map((date) => ({
@@ -401,10 +417,7 @@ async function runExport(options) {
401
417
  const statuslineDailyRows = (0, export_1.buildSummaryRows)(claudeEvents);
402
418
  const codexStatuslineSummary = (0, dashboard_2.summarizeEvents)(codexEvents);
403
419
  const codexStatuslineDailyRows = (0, export_1.buildSummaryRows)(codexEvents);
404
- const [claudeScan, codexScan] = await Promise.all([
405
- (0, claude_1.summarizeClaudeProjectUsageCombined)(window.start, window.end),
406
- (0, codex_sessions_1.summarizeCodexSessionUsageCombined)(window.start, window.end),
407
- ]);
420
+ const [claudeScan, codexScan] = await loadSessionUsage(window.start, window.end);
408
421
  const claudeUsage = claudeScan.weekly;
409
422
  const claudeDailyUsage = claudeScan.daily;
410
423
  const codexUsage = codexScan.weekly;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccus-cli",
3
- "version": "0.2.18",
3
+ "version": "0.2.19",
4
4
  "description": "Claude Code statusline usage logger and dashboard CLI",
5
5
  "type": "commonjs",
6
6
  "bin": {