feat(kimi): implement Kimi CLI usage tracking by azidancorp · Pull Request #840 · ccusage/ccusage · GitHub
Skip to content

feat(kimi): implement Kimi CLI usage tracking#840

Closed
azidancorp wants to merge 40 commits into
ccusage:mainfrom
azidancorp:main
Closed

feat(kimi): implement Kimi CLI usage tracking#840
azidancorp wants to merge 40 commits into
ccusage:mainfrom
azidancorp:main

Conversation

@azidancorp

@azidancorp azidancorp commented Feb 5, 2026

Copy link
Copy Markdown
  • Add new @ccusage/kimi CLI package for analyzing Kimi CLI sessions
  • Extend MCP server with 4 new tools: kimi-daily, kimi-monthly, kimi-session, kimi-weekly
  • Add Kimi data loader and type definitions
  • Extract reasoning tokens from ContentPart think messages (~4 chars/token
    estimate)
  • Update tests for new MCP tools
  • Support KIMI_SHARE_DIR and KIMI_MODEL_NAME environment variables
  • Update pnpm-lock.yaml with new workspace dependencies

Summary by CodeRabbit

  • New Features
    • Kimi CLI: daily/weekly/monthly/session usage reports (JSON or formatted table), timezone/locale filters, compact mode, per-model cost aggregation, model alias/pricing handling, and session-level reporting.
  • Documentation
    • Added README and detailed CLAUDE guide with quick start, examples, env vars, and session/log locations.
  • Integration
    • Kimi CLI exposed as a tool and wired into existing toolset/programmatic APIs.
  • Tests
    • Unit and end-to-end tests plus test/config support added.

@coderabbitai

coderabbitai Bot commented Feb 5, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/mcp/package.json (1)

55-66: 🛠️ Refactor suggestion | 🟠 Major

Move @ccusage/kimi to devDependencies.

Per coding guidelines, all projects under apps/ ship as bundled CLIs — runtime dependencies should be listed in devDependencies (never dependencies) so the bundler owns the runtime payload.

Proposed fix
 	"dependencies": {
 		"@ccusage/codex": "workspace:*",
-		"@ccusage/kimi": "workspace:*",
 		"@hono/mcp": "catalog:runtime",
 		...
 	},
 	"devDependencies": {
 		"@ccusage/internal": "workspace:*",
+		"@ccusage/kimi": "workspace:*",
 		"@ryoppippi/eslint-config": "catalog:lint",
 		...
 	},

As per coding guidelines: "All projects under apps/ ship as bundled CLIs/binaries - list runtime dependencies in devDependencies (never dependencies) so the bundler owns the runtime payload".

🤖 Fix all issues with AI agents
In `@apps/ccusage/README.md`:
- Around line 36-38: Update the README blurb under the "### 🌙 [`@ccusage/kimi`]"
header to list "weekly" alongside "daily, monthly, and session-based" reports;
specifically, edit the sentence that currently reads "Track daily, monthly, and
session-based token usage and costs from your local `~/.kimi/sessions` logs." to
include "weekly" (and optionally reference the provided `kimi-weekly` tool) so
it reads something like "Track daily, weekly, monthly, and session-based token
usage and costs from your local `~/.kimi/sessions` logs." Ensure the change is
made in the same section containing the [`@ccusage/kimi`] heading and the
backticked path `~/.kimi/sessions`.

In `@apps/kimi/CLAUDE.md`:
- Line 150: The sentence in CLAUDE.md is self-contradictory; update the line
that reads "No weekly command: Implemented (unlike other apps)" to correctly
state that the weekly command is implemented (e.g., "Weekly command: Implemented
(unlike other apps)"), reflecting the presence of the weekly.ts command in the
codebase.

In `@apps/kimi/README.md`:
- Around line 121-125: The sponsors SVG image tag in the README (<img
src="https://cdn.jsdelivr.net/gh/ryoppippi/sponsors@main/sponsors.svg">) is
missing an alt attribute; update that <img> element to include a descriptive alt
text (e.g., alt="Project sponsors" or similar) to satisfy accessibility
guidelines and ensure screen readers convey the image purpose.

In `@apps/kimi/src/_consts.ts`:
- Around line 12-13: SESSION_GLOB is constructed incorrectly and expands to a
two-level pattern; change its definition so it matches one-level session
directories. Replace the current SESSION_GLOB = `*/${WIRE_GLOB}` with a pattern
that directly uses KIMI_WIRE_FILE_NAME (e.g., SESSION_GLOB =
`*/${KIMI_WIRE_FILE_NAME}`) or set SESSION_GLOB to the same value as WIRE_GLOB
so glob(cwd: sessionsDir) will correctly match files like
~/.kimi/sessions/{session_id}/wire.jsonl; update the constant in
apps/kimi/src/_consts.ts where WIRE_GLOB, SESSION_GLOB, and KIMI_WIRE_FILE_NAME
are defined.
🧹 Nitpick comments (10)
apps/kimi/src/command-utils.ts (1)

3-8: Type inconsistency: reasoningOutputTokens nullish coalescing vs required type.

Line 7 declares reasoningOutputTokens: number as required, but line 19 uses usage.reasoningOutputTokens ?? 0, implying it could be undefined. Either make the type optional (reasoningOutputTokens?: number) or remove the nullish coalescing if the field is always present.

♻️ Option A: Make type optional
 export type UsageGroup = {
 	inputTokens: number;
 	cachedInputTokens: number;
 	outputTokens: number;
-	reasoningOutputTokens: number;
+	reasoningOutputTokens?: number;
 };
♻️ Option B: Remove nullish coalescing
-	const rawReasoning = usage.reasoningOutputTokens ?? 0;
+	const rawReasoning = usage.reasoningOutputTokens;

Also applies to: 19-19

apps/kimi/src/token-utils.ts (1)

15-21: Consider documenting the mutation behavior.

addUsage mutates target in place rather than returning a new object. This is a valid pattern for performance, but a brief JSDoc comment would clarify intent for future maintainers.

apps/kimi/src/commands/monthly.ts (1)

36-42: Consider preserving error details in logging.

String(error) may lose stack trace information. For better debugging, consider logging the error object directly or checking if it's an Error instance.

♻️ Proposed improvement
 		} catch (error) {
-			logger.error(String(error));
+			logger.error(error instanceof Error ? error.message : String(error));
 			process.exit(1);
 		}
apps/kimi/CLAUDE.md (2)

49-55: Add language specifier to fenced code block.

The markdownlint tool flags this code block for missing a language specifier. Consider adding a language identifier (e.g., text or plaintext) to satisfy MD040.

Suggested fix
-```
+```text
 inputTokens = input_other + input_cache_read + input_cache_creation

117-119: Add language specifier to fenced code block.

Same markdownlint MD040 issue - add a language identifier.

Suggested fix
-```
+```text
 {work_directory_path}/{session_file_id}
apps/kimi/src/commands/session.ts (1)

175-177: Missing compact mode notice.

The daily command (lines 166-169 in daily.ts) displays a helpful notice when running in compact mode, informing users to expand terminal width for additional metrics. This session command lacks that notice, creating inconsistent UX.

Suggested fix
 	log(table.toString());
+
+	if (table.isCompactMode()) {
+		logger.info('\nRunning in Compact Mode');
+		logger.info('Expand terminal width to see reasoning and cache metrics');
+	}
 },
apps/kimi/src/daily-report.ts (1)

83-86: Consider parallelizing pricing lookups.

The sequential await in the loop could be parallelized for better performance when there are multiple unique models. While the impact is likely minimal (few unique models), it's a common optimization pattern.

Suggested fix
 const modelPricing = new Map<string, Awaited<ReturnType<PricingSource['getPricing']>>>();
-for (const modelName of uniqueModels) {
-	modelPricing.set(modelName, await pricingSource.getPricing(modelName));
-}
+await Promise.all(
+	Array.from(uniqueModels).map(async (modelName) => {
+		modelPricing.set(modelName, await pricingSource.getPricing(modelName));
+	}),
+);
apps/kimi/src/pricing.ts (2)

4-4: Module-level warnedModels state may affect test isolation.

The warnedModels Set persists across all KimiPricingSource instances and test runs within the same process. While this correctly deduplicates warnings in production, it means:

  1. Tests cannot verify the warning is emitted without mocking the logger
  2. If a test queries an unknown model, subsequent tests won't see the warning for that same model

Consider either:

  • Accepting this as intended behavior (warnings are one-time per process)
  • Adding a clearWarnings() method for testing purposes (unexported)

This is a minor concern since the current test uses a unique model name and the behavior is documented.

Also applies to: 65-70


12-15: IIFE for lastSegment extraction is unconventional.

The immediately-invoked function expression (IIFE) works but is unusual for this simple operation. A more idiomatic approach would be direct assignment.

Suggested simplification
-const lastSegment = (() => {
-	const idx = trimmed.lastIndexOf('/');
-	return idx >= 0 ? trimmed.slice(idx + 1) : trimmed;
-})();
+const idx = trimmed.lastIndexOf('/');
+const lastSegment = idx >= 0 ? trimmed.slice(idx + 1) : trimmed;
apps/mcp/src/kimi.ts (1)

145-163: Wrap JSON parsing with Result.try() for consistent error handling.

JSON.parse can throw; using @praha/byethrow keeps failures consistent with project guidelines.

♻️ Suggested refactor
-import { z } from 'zod';
+import { Result } from '@praha/byethrow';
+import { z } from 'zod';
@@
 const kimiWeeklyResponseSchema = z.object({
 	weekly: z.array(kimiWeeklyRowSchema),
 	totals: kimiTotalsSchema.nullable(),
 });
+
+function parseKimiJson<T>(raw: string, schema: z.ZodType<T>): T {
+	const parsed = Result.try({
+		try: () => JSON.parse(raw) as unknown,
+		catch: (error) => error,
+	})();
+	if (Result.isFailure(parsed)) {
+		throw parsed.error;
+	}
+	return schema.parse(parsed.value);
+}
@@
 export async function getKimiDaily(parameters: z.infer<typeof kimiParametersSchema>) {
 	const raw = await runKimiCliJson('daily', parameters);
-	return kimiDailyResponseSchema.parse(JSON.parse(raw));
+	return parseKimiJson(raw, kimiDailyResponseSchema);
 }
@@
 export async function getKimiMonthly(parameters: z.infer<typeof kimiParametersSchema>) {
 	const raw = await runKimiCliJson('monthly', parameters);
-	return kimiMonthlyResponseSchema.parse(JSON.parse(raw));
+	return parseKimiJson(raw, kimiMonthlyResponseSchema);
 }
@@
 export async function getKimiSession(parameters: z.infer<typeof kimiParametersSchema>) {
 	const raw = await runKimiCliJson('session', parameters);
-	return kimiSessionResponseSchema.parse(JSON.parse(raw));
+	return parseKimiJson(raw, kimiSessionResponseSchema);
 }
@@
 export async function getKimiWeekly(parameters: z.infer<typeof kimiParametersSchema>) {
 	const raw = await runKimiCliJson('weekly', parameters);
-	return kimiWeeklyResponseSchema.parse(JSON.parse(raw));
+	return parseKimiJson(raw, kimiWeeklyResponseSchema);
 }

Comment thread apps/ccusage/README.md Outdated
Comment thread apps/kimi/CLAUDE.md Outdated
Comment thread apps/kimi/README.md
Comment thread apps/kimi/src/_consts.ts Outdated
azidancorp and others added 3 commits February 5, 2026 12:55
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apps/kimi/CLAUDE.md`:
- Around line 138-141: The three consecutive bullets in CLAUDE.md start with the
same phrase "Tests verify …", which reduces readability; update one or two of
them to vary the phrasing while preserving meaning—e.g., change the second
bullet ("Tests verify token field mapping from Kimi's wire format") to "Verifies
token field mapping from Kimi's wire format" and the third ("Tests verify work
directory hash mapping and deduplication logic") to "Checks work directory hash
mapping and deduplication logic", keeping the first bullet unchanged; ensure the
wording still accurately reflects the tests' intent.
🧹 Nitpick comments (1)
apps/kimi/README.md (1)

2-2: Use relative paths for images stored in /docs/public/.

These two images are served from docs/public but use absolute CDN URLs. Per the markdown guideline, switch to relative paths.
As per coding guidelines: "Use relative image paths like /screenshot.png for images stored in /docs/public/."

🔧 Suggested fix
-    <img src="https://cdn.jsdelivr.net/gh/ryoppippi/ccusage@main/docs/public/logo.svg" alt="ccusage logo" width="256" height="256">
+    <img src="/logo.svg" alt="ccusage logo" width="256" height="256">
-        <img src="https://cdn.jsdelivr.net/gh/ryoppippi/ccusage@main/docs/public/ccusage_thumbnail.png" alt="ccusage: The Claude Code cost scorecard that went viral" width="600">
+        <img src="/ccusage_thumbnail.png" alt="ccusage: The Claude Code cost scorecard that went viral" width="600">

Also applies to: 117-117

Comment thread apps/kimi/CLAUDE.md Outdated
@azidancorp

Copy link
Copy Markdown
Author

I havent registered or published anything on npm for this, link in the readme wont work until then

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apps/kimi/README.md`:
- Around line 7-8: The README currently includes an npm badge/link for
`@ccusage/kimi` which will 404 until the package is published; update the
README.md to either remove the npm badge/link lines referencing `@ccusage/kimi` or
replace them with a “Coming soon — package not yet published” note (leave the
existing socket.dev badge if desired) so users aren’t led to a broken npm page;
look for the badge markup containing "@ccusage/kimi" to locate and change the
lines.

Comment thread apps/kimi/README.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
apps/kimi/src/data-loader.ts (1)

7-7: Consider moving test-only import inside the vitest block.

createFixture is only used within the import.meta.vitest block but is imported at module top-level. While tree-shaking should handle this in production builds, moving it inside the test block makes the test dependency scope explicit:

if (import.meta.vitest != null) {
    const { createFixture } = await import('fs-fixture');
    // ...tests
}

However, given the coding guideline against dynamic imports, the current approach is acceptable if the bundler handles tree-shaking correctly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/kimi/src/data-loader.ts` at line 7, The top-level import of
createFixture should be moved into the test-only block so the test dependency is
scoped to import.meta.vitest: remove the top-level "import { createFixture }
from 'fs-fixture';" and inside the "if (import.meta.vitest != null) { ... }"
block dynamically import it (e.g. const { createFixture } = await
import('fs-fixture');) and use that local symbol for tests; if your project
forbids dynamic imports, leave the top-level import but add a comment explaining
it's test-only and relies on bundler tree-shaking.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/kimi/src/data-loader.ts`:
- Around line 649-651: Update the misleading comment near the thinkContent and
expectedReasoningTokens declarations: the string in thinkContent is 65
characters, not "~40 chars", so correct the comment to reflect the actual length
(or remove the approximate char count) and clarify token estimation (e.g., "65
chars ≈ 17 tokens at 4 chars/token"), keeping the Math.ceil(thinkContent.length
/ 4) calculation unchanged.
- Around line 125-133: The toIsoTimestamp function currently calls
date.toISOString() which will throw for invalid dates; change it to validate the
Date before calling toISOString: after creating const date = new Date(ms), check
Number.isFinite(date.getTime()) (or !Number.isNaN(date.getTime())) and return
null if false, then safely call date.toISOString() and return it; update the
function to remove the iso === 'Invalid Date' check and rely on the pre-check to
avoid the RangeError in toIsoTimestamp.
- Around line 227-230: The endsWith check in the for loop over files fails on
Windows because tinyglobby returns POSIX-style paths; update the condition that
uses path.sep so it works cross-platform—either compare using a forward slash
like file.endsWith(`/${KIMI_WIRE_FILE_NAME}`) or, more robustly, use
path.basename(file) === KIMI_WIRE_FILE_NAME (referencing the for (const file of
files) loop and KIMI_WIRE_FILE_NAME) to locate the wire file regardless of path
separator.

---

Nitpick comments:
In `@apps/kimi/src/data-loader.ts`:
- Line 7: The top-level import of createFixture should be moved into the
test-only block so the test dependency is scoped to import.meta.vitest: remove
the top-level "import { createFixture } from 'fs-fixture';" and inside the "if
(import.meta.vitest != null) { ... }" block dynamically import it (e.g. const {
createFixture } = await import('fs-fixture');) and use that local symbol for
tests; if your project forbids dynamic imports, leave the top-level import but
add a comment explaining it's test-only and relies on bundler tree-shaking.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ca5ada9 and 4388d24.

📒 Files selected for processing (1)
  • apps/kimi/src/data-loader.ts

Comment thread apps/kimi/src/data-loader.ts
Comment thread apps/kimi/src/data-loader.ts Outdated
Comment thread apps/kimi/src/data-loader.ts Outdated
azidancorp and others added 5 commits May 3, 2026 01:49
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@azidancorp

Copy link
Copy Markdown
Author

Resolved conflicts, and updated this PR to a cleaned Kimi-only branch based on current ryoppippi:main.

Local validation passed:

  • pnpm run format
  • pnpm typecheck
  • pnpm run test (376 tests)
  • pnpm run build

Also addressed the Kimi Code dynamic model alias by resolving kimi-for-coding to K2.5/K2.6 around the official K2.6 release cutoff, and verified the CLI against real Kimi logs. This is of course not the ideal scenario, however I believe its the best effort approximation given that only one latest model is available in kimi-cli using kimi-for-coding plan, and the model slug is not stored in wire.json

@azidancorp

Copy link
Copy Markdown
Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 3, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/kimi/CLAUDE.md`:
- Around line 49-55: The fenced code examples containing the token formulas
(e.g., the block with lines showing inputTokens = input_other + input_cache_read
+ input_cache_creation and the later block around the estimated
reasoningOutputTokens) need a language tag to satisfy MD040; add a simple
language identifier like `text` immediately after the opening ``` for each
fenced block (including the other block around the lines 130-132) so they render
the same but pass the linter.

In `@apps/kimi/src/commands/session.ts`:
- Around line 28-31: The code sets the shared singleton logger.level when
ctx.values.json is true (jsonOutput) but never resets it; change the logic in
the function (around where jsonOutput is computed) to save the original
logger.level into a local variable, set logger.level = 0 for JSON output, then
ensure you restore logger.level to the saved value in a finally block before
run() exits (or after the command completes) so that the singleton logger is
returned to its original state regardless of success or error.

In `@apps/kimi/src/data-loader.ts`:
- Around line 403-425: When a StatusUpdate is skipped for inputTokens===0 &&
output===0 or an invalid timestamp (toIsoTimestamp(update.timestamp) == null),
advance the reasoning buffer's lastFlushIndex so accumulated think text is
considered consumed by this StatusUpdate: call getReasoningBuffer(sessionId,
resolvedStreamId) to obtain reasoningBuffer and set
reasoningBuffer.lastFlushIndex = reasoningBuffer.content.length before
returning. Also ensure when calculating reasoningTokens from
estimateTokensFromText(reasoningText) you cap reasoningTokens to not exceed
output (i.e., reasoningTokens = Math.min(reasoningTokens, output)) so reasoning
tokens never exceed the event's output tokens.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9b335806-22e9-4e21-aba7-bb44c4947907

📥 Commits

Reviewing files that changed from the base of the PR and between 4388d24 and 08986f5.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (30)
  • apps/ccusage/README.md
  • apps/kimi/CLAUDE.md
  • apps/kimi/README.md
  • apps/kimi/eslint.config.js
  • apps/kimi/package.json
  • apps/kimi/src/_consts.ts
  • apps/kimi/src/_shared-args.ts
  • apps/kimi/src/_types.ts
  • apps/kimi/src/command-utils.ts
  • apps/kimi/src/commands/daily.ts
  • apps/kimi/src/commands/monthly.ts
  • apps/kimi/src/commands/session.ts
  • apps/kimi/src/commands/weekly.ts
  • apps/kimi/src/daily-report.ts
  • apps/kimi/src/data-loader.ts
  • apps/kimi/src/date-utils.ts
  • apps/kimi/src/index.ts
  • apps/kimi/src/logger.ts
  • apps/kimi/src/monthly-report.ts
  • apps/kimi/src/pricing.ts
  • apps/kimi/src/run.ts
  • apps/kimi/src/session-report.ts
  • apps/kimi/src/token-utils.ts
  • apps/kimi/src/weekly-report.ts
  • apps/kimi/tsconfig.json
  • apps/kimi/tsdown.config.ts
  • apps/kimi/vitest.config.ts
  • apps/mcp/package.json
  • apps/mcp/src/kimi.ts
  • apps/mcp/src/mcp.ts
✅ Files skipped from review due to trivial changes (14)
  • apps/mcp/package.json
  • apps/kimi/tsdown.config.ts
  • apps/kimi/eslint.config.js
  • apps/kimi/src/index.ts
  • apps/kimi/vitest.config.ts
  • apps/ccusage/README.md
  • apps/kimi/src/token-utils.ts
  • apps/kimi/src/_types.ts
  • apps/kimi/src/run.ts
  • apps/kimi/package.json
  • apps/kimi/src/_consts.ts
  • apps/kimi/src/_shared-args.ts
  • apps/mcp/src/kimi.ts
  • apps/kimi/src/commands/monthly.ts
🚧 Files skipped from review as they are similar to previous changes (8)
  • apps/kimi/tsconfig.json
  • apps/kimi/src/monthly-report.ts
  • apps/kimi/src/session-report.ts
  • apps/kimi/src/date-utils.ts
  • apps/kimi/src/daily-report.ts
  • apps/kimi/src/pricing.ts
  • apps/kimi/src/commands/weekly.ts
  • apps/kimi/src/commands/daily.ts

Comment thread apps/kimi/CLAUDE.md Outdated
Comment thread apps/kimi/src/commands/session.ts
Comment thread apps/kimi/src/data-loader.ts Outdated
azidancorp and others added 11 commits May 3, 2026 03:55
Restore JSON logger state and tag plain-text docs fences.
Restore JSON logger state and tag plain-text docs fences.
# Conflicts:
#	apps/mcp/package.json
#	apps/mcp/src/mcp.ts
#	pnpm-lock.yaml
# Conflicts:
#	CLAUDE.md
#	apps/ccusage/src/data-loader.ts
#	apps/kimi/CLAUDE.md
#	apps/kimi/src/_types.ts
#	apps/kimi/src/data-loader.ts
#	apps/kimi/src/kimi.ts
#	apps/kimi/src/pricing.ts
#	apps/mcp/AGENTS.md
#	apps/mcp/CLAUDE.md
#	apps/mcp/src/mcp.ts
#	docs/CLAUDE.md
#	packages/internal/CLAUDE.md
#	pnpm-lock.yaml
@ryoppippi

Copy link
Copy Markdown
Member

@ryoppippi ryoppippi closed this May 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants