{"owner":"XiaomiMiMo","repo":"MiMo-Code","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# MiMo-Code\n\n## Conventions\n\n- Use MiMoCode Compose skills when available, otherwise use superpowers skill if installed.\n- To regenerate the JavaScript SDK, run `./packages/sdk/js/script/build.ts`.\n- ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE.\n- The default branch in this repo is `main`.\n- CI triggers on `main`.\n- Prefer automation: execute requested actions without confirmation unless blocked by missing info or safety/irreversibility.\n- Install deps with `bun ci` (= `bun install --frozen-lockfile`) — install per `bun.lock`, don't mutate the lockfile. ⛔ Do NOT use `bun install`/`npm install`.\n\n## Core Focus\n\nDevelopment focuses on the **TUI** (`packages/opencode/src/cli/cmd/tui/`) and the **engine core** it runs on. The Web, App and Desktop surfaces are not currently maintained. In practice this means an operation should default to checking the TUI path first.\n\n## Style Guide\n\n### General Principles\n\n- Keep things in one function unless composable or reusable\n- Avoid `try`/`catch` where possible\n- Avoid using the `any` type\n- Use Bun APIs where the runtime is Bun-only, like `Bun.file()` in the TUI (`src/cli/cmd/tui/`); build-time macros are fine anywhere, as they never reach the shipped runtime\n- In core code reachable from `src/node.ts`, prefer the Node equivalent when one exists — `createHash` over `Bun.CryptoHasher`, `prepare()` over bun:sqlite's `query()` — as that code also ships through `script/build-node.ts` and must run on plain Node\n- Bun-only calls in core escape both `typecheck` and `bun test`, which run on Bun; existing usage needs no urgent removal, and APIs with no Node equivalent may stay until a runtime seam exists\n- Rely on type inference when possible; avoid explicit type annotations or interfaces unless necessary for exports or clarity\n- Prefer functional array methods (flatMap, filter, map) over for loops; use type guards on filter to maintain type inference downstream\n- In `src/config`, follow the existing self-export pattern at the top of the file (for example `export * as ConfigAgent from \"./agent\"`) when adding a new config module.\n\nReduce total variable count by inlining when a value is only used once.\n\n```ts\n// Good\nconst journal = await Bun.file(path.join(dir, \"journal.json\")).json()\n\n// Bad\nconst journalPath = path.join(dir, \"journal.json\")\nconst journal = await Bun.file(journalPath).json()\n```\n\n### Destructuring\n\nAvoid unnecessary destructuring. Use dot notation to preserve context.\n\n```ts\n// Good\nobj.a\nobj.b\n\n// Bad\nconst { a, b } = obj\n```\n\n### Variables\n\nPrefer `const` over `let`. Use ternaries or early returns instead of reassignment.\n\n```ts\n// Good\nconst foo = condition ? 1 : 2\n\n// Bad\nlet foo\nif (condition) foo = 1\nelse foo = 2\n```\n\n### Control Flow\n\nAvoid `else` statements. Prefer early returns.\n\n```ts\n// Good\nfunction foo() {\n  if (condition) return 1\n  return 2\n}\n\n// Bad\nfunction foo() {\n  if (condition) return 1\n  else return 2\n}\n```\n\n### Schema Definitions (Drizzle)\n\nUse snake_case for field names so column names don't need to be redefined as strings.\n\n```ts\n// Good\nconst table = sqliteTable(\"session\", {\n  id: text().primaryKey(),\n  project_id: text().notNull(),\n  created_at: integer().notNull(),\n})\n\n// Bad\nconst table = sqliteTable(\"session\", {\n  id: text(\"id\").primaryKey(),\n  projectID: text(\"project_id\").notNull(),\n  createdAt: integer(\"created_at\").notNull(),\n})\n```\n\n### Reading a nullable column\n\nTwo independent absences meet in one expression, and only one of them is\n`undefined`. `.get()` yields `undefined` when no row matches — Drizzle normalises\nthe driver's `null` there — while a nullable column's SQL `NULL` arrives as\n`null`. So `row?.some_column` is `T | null | undefined`.\n\nWhen a caller only asks \"is there a value\", flatten to `undefined`, and write the\nflattening as an annotation rather than an `as` cast:\n\n```ts\n// Good — the compiler enforces it; deleting the `?? undefined` is a type error\nconst boundary: MessageID | undefined = row?.last_checkpoint_message_id ?? undefined\n\n// Bad — the cast removes `null` from the union without converting anything,\n// so the declared type is untrue at runtime\nreturn row?.last_checkpoint_message_id as MessageID | undefined\n```\n\nDiscriminate a possibly-absent value with truthiness or `== null`, never with\n`=== undefined` / `!== undefined`. Because `null !== undefined` is `true`, such a\nguard typechecks, reads correctly in review, and does nothing.\n\n## Testing\n\n- Avoid mocks as much as possible\n- Test actual implementation, do not duplicate logic into tests\n- Tests cannot run from repo root (guard: `do-not-run-tests-from-root`); run from package dirs like `packages/opencode`.\n\n## Type Checking\n\n- Always run `bun typecheck` from package directories (e.g., `packages/opencode`), never `tsc` directly.\n"},"files":{"AGENTS.md":"# MiMo-Code\n\n## Conventions\n\n- Use MiMoCode Compose skills when available, otherwise use superpowers skill if installed.\n- To regenerate the JavaScript SDK, run `./packages/sdk/js/script/build.ts`.\n- ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE.\n- The default branch in this repo is `main`.\n- CI triggers on `main`.\n- Prefer automation: execute requested actions without confirmation unless blocked by missing info or safety/irreversibility.\n- Install deps with `bun ci` (= `bun install --frozen-lockfile`) — install per `bun.lock`, don't mutate the lockfile. ⛔ Do NOT use `bun install`/`npm install`.\n\n## Core Focus\n\nDevelopment focuses on the **TUI** (`packages/opencode/src/cli/cmd/tui/`) and the **engine core** it runs on. The Web, App and Desktop surfaces are not currently maintained. In practice this means an operation should default to checking the TUI path first.\n\n## Style Guide\n\n### General Principles\n\n- Keep things in one function unless composable or reusable\n- Avoid `try`/`catch` where possible\n- Avoid using the `any` type\n- Use Bun APIs where the runtime is Bun-only, like `Bun.file()` in the TUI (`src/cli/cmd/tui/`); build-time macros are fine anywhere, as they never reach the shipped runtime\n- In core code reachable from `src/node.ts`, prefer the Node equivalent when one exists — `createHash` over `Bun.CryptoHasher`, `prepare()` over bun:sqlite's `query()` — as that code also ships through `script/build-node.ts` and must run on plain Node\n- Bun-only calls in core escape both `typecheck` and `bun test`, which run on Bun; existing usage needs no urgent removal, and APIs with no Node equivalent may stay until a runtime seam exists\n- Rely on type inference when possible; avoid explicit type annotations or interfaces unless necessary for exports or clarity\n- Prefer functional array methods (flatMap, filter, map) over for loops; use type guards on filter to maintain type inference downstream\n- In `src/config`, follow the existing self-export pattern at the top of the file (for example `export * as ConfigAgent from \"./agent\"`) when adding a new config module.\n\nReduce total variable count by inlining when a value is only used once.\n\n```ts\n// Good\nconst journal = await Bun.file(path.join(dir, \"journal.json\")).json()\n\n// Bad\nconst journalPath = path.join(dir, \"journal.json\")\nconst journal = await Bun.file(journalPath).json()\n```\n\n### Destructuring\n\nAvoid unnecessary destructuring. Use dot notation to preserve context.\n\n```ts\n// Good\nobj.a\nobj.b\n\n// Bad\nconst { a, b } = obj\n```\n\n### Variables\n\nPrefer `const` over `let`. Use ternaries or early returns instead of reassignment.\n\n```ts\n// Good\nconst foo = condition ? 1 : 2\n\n// Bad\nlet foo\nif (condition) foo = 1\nelse foo = 2\n```\n\n### Control Flow\n\nAvoid `else` statements. Prefer early returns.\n\n```ts\n// Good\nfunction foo() {\n  if (condition) return 1\n  return 2\n}\n\n// Bad\nfunction foo() {\n  if (condition) return 1\n  else return 2\n}\n```\n\n### Schema Definitions (Drizzle)\n\nUse snake_case for field names so column names don't need to be redefined as strings.\n\n```ts\n// Good\nconst table = sqliteTable(\"session\", {\n  id: text().primaryKey(),\n  project_id: text().notNull(),\n  created_at: integer().notNull(),\n})\n\n// Bad\nconst table = sqliteTable(\"session\", {\n  id: text(\"id\").primaryKey(),\n  projectID: text(\"project_id\").notNull(),\n  createdAt: integer(\"created_at\").notNull(),\n})\n```\n\n### Reading a nullable column\n\nTwo independent absences meet in one expression, and only one of them is\n`undefined`. `.get()` yields `undefined` when no row matches — Drizzle normalises\nthe driver's `null` there — while a nullable column's SQL `NULL` arrives as\n`null`. So `row?.some_column` is `T | null | undefined`.\n\nWhen a caller only asks \"is there a value\", flatten to `undefined`, and write the\nflattening as an annotation rather than an `as` cast:\n\n```ts\n// Good — the compiler enforces it; deleting the `?? undefined` is a type error\nconst boundary: MessageID | undefined = row?.last_checkpoint_message_id ?? undefined\n\n// Bad — the cast removes `null` from the union without converting anything,\n// so the declared type is untrue at runtime\nreturn row?.last_checkpoint_message_id as MessageID | undefined\n```\n\nDiscriminate a possibly-absent value with truthiness or `== null`, never with\n`=== undefined` / `!== undefined`. Because `null !== undefined` is `true`, such a\nguard typechecks, reads correctly in review, and does nothing.\n\n## Testing\n\n- Avoid mocks as much as possible\n- Test actual implementation, do not duplicate logic into tests\n- Tests cannot run from repo root (guard: `do-not-run-tests-from-root`); run from package dirs like `packages/opencode`.\n\n## Type Checking\n\n- Always run `bun typecheck` from package directories (e.g., `packages/opencode`), never `tsc` directly.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# MiMo-Code\n\n## Conventions\n\n- Use MiMoCode Compose skills when available, otherwise use superpowers skill if installed.\n- To regenerate the JavaScript SDK, run `./packages/sdk/js/script/build.ts`.\n- ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE.\n- The default branch in this repo is `main`.\n- CI triggers on `main`.\n- Prefer automation: execute requested actions without confirmation unless blocked by missing info or safety/irreversibility.\n- Install deps with `bun ci` (= `bun install --frozen-lockfile`) — install per `bun.lock`, don't mutate the lockfile. ⛔ Do NOT use `bun install`/`npm install`.\n\n## Core Focus\n\nDevelopment focuses on the **TUI** (`packages/opencode/src/cli/cmd/tui/`) and the **engine core** it runs on. The Web, App and Desktop surfaces are not currently maintained. In practice this means an operation should default to checking the TUI path first.\n\n## Style Guide\n\n### General Principles\n\n- Keep things in one function unless composable or reusable\n- Avoid `try`/`catch` where possible\n- Avoid using the `any` type\n- Use Bun APIs where the runtime is Bun-only, like `Bun.file()` in the TUI (`src/cli/cmd/tui/`); build-time macros are fine anywhere, as they never reach the shipped runtime\n- In core code reachable from `src/node.ts`, prefer the Node equivalent when one exists — `createHash` over `Bun.CryptoHasher`, `prepare()` over bun:sqlite's `query()` — as that code also ships through `script/build-node.ts` and must run on plain Node\n- Bun-only calls in core escape both `typecheck` and `bun test`, which run on Bun; existing usage needs no urgent removal, and APIs with no Node equivalent may stay until a runtime seam exists\n- Rely on type inference when possible; avoid explicit type annotations or interfaces unless necessary for exports or clarity\n- Prefer functional array methods (flatMap, filter, map) over for loops; use type guards on filter to maintain type inference downstream\n- In `src/config`, follow the existing self-export pattern at the top of the file (for example `export * as ConfigAgent from \"./agent\"`) when adding a new config module.\n\nReduce total variable count by inlining when a value is only used once.\n\n```ts\n// Good\nconst journal = await Bun.file(path.join(dir, \"journal.json\")).json()\n\n// Bad\nconst journalPath = path.join(dir, \"journal.json\")\nconst journal = await Bun.file(journalPath).json()\n```\n\n### Destructuring\n\nAvoid unnecessary destructuring. Use dot notation to preserve context.\n\n```ts\n// Good\nobj.a\nobj.b\n\n// Bad\nconst { a, b } = obj\n```\n\n### Variables\n\nPrefer `const` over `let`. Use ternaries or early returns instead of reassignment.\n\n```ts\n// Good\nconst foo = condition ? 1 : 2\n\n// Bad\nlet foo\nif (condition) foo = 1\nelse foo = 2\n```\n\n### Control Flow\n\nAvoid `else` statements. Prefer early returns.\n\n```ts\n// Good\nfunction foo() {\n  if (condition) return 1\n  return 2\n}\n\n// Bad\nfunction foo() {\n  if (condition) return 1\n  else return 2\n}\n```\n\n### Schema Definitions (Drizzle)\n\nUse snake_case for field names so column names don't need to be redefined as strings.\n\n```ts\n// Good\nconst table = sqliteTable(\"session\", {\n  id: text().primaryKey(),\n  project_id: text().notNull(),\n  created_at: integer().notNull(),\n})\n\n// Bad\nconst table = sqliteTable(\"session\", {\n  id: text(\"id\").primaryKey(),\n  projectID: text(\"project_id\").notNull(),\n  createdAt: integer(\"created_at\").notNull(),\n})\n```\n\n### Reading a nullable column\n\nTwo independent absences meet in one expression, and only one of them is\n`undefined`. `.get()` yields `undefined` when no row matches — Drizzle normalises\nthe driver's `null` there — while a nullable column's SQL `NULL` arrives as\n`null`. So `row?.some_column` is `T | null | undefined`.\n\nWhen a caller only asks \"is there a value\", flatten to `undefined`, and write the\nflattening as an annotation rather than an `as` cast:\n\n```ts\n// Good — the compiler enforces it; deleting the `?? undefined` is a type error\nconst boundary: MessageID | undefined = row?.last_checkpoint_message_id ?? undefined\n\n// Bad — the cast removes `null` from the union without converting anything,\n// so the declared type is untrue at runtime\nreturn row?.last_checkpoint_message_id as MessageID | undefined\n```\n\nDiscriminate a possibly-absent value with truthiness or `== null`, never with\n`=== undefined` / `!== undefined`. Because `null !== undefined` is `true`, such a\nguard typechecks, reads correctly in review, and does nothing.\n\n## Testing\n\n- Avoid mocks as much as possible\n- Test actual implementation, do not duplicate logic into tests\n- Tests cannot run from repo root (guard: `do-not-run-tests-from-root`); run from package dirs like `packages/opencode`.\n\n## Type Checking\n\n- Always run `bun typecheck` from package directories (e.g., `packages/opencode`), never `tsc` directly.\n","category":"root","tokens":1193}]}