К основному содержанию
скилл CX Codex

bun-macros — скилл для Claude Code: макросы Bun на этапе сборки

Скилл объясняет, как выполнять JavaScript во время бандлинга и подставлять результат прямо в код. Пригодится, когда версия, git-хэш или файл нужны в сборке, а не в рантайме.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add secondsky/claude-skills --skill bun-macros -a claude-code
Открыть на GitHub

Что делает bun-macros

Макросы Bun выполняются один раз при сборке, а их результат встаёт в итоговый файл как обычное значение. Скилл показывает синтаксис: импорт с атрибутом with { type: "macro" } и вызов функции, который заменяется на готовую константу.

Внутри разобраны типовые случаи: подстановка переменных окружения, git-хэш и ветка через Bun.spawnSync, встраивание файлов и JSON, генерация констант и списка маршрутов из каталога, кодогенерация из схемы. Отдельно описаны асинхронные макросы, параметры, возвращаемые типы и обработка ошибок вроде requireEnv, которая валит сборку при отсутствии переменной.

Главное ограничение: макросы работают только при bun build. При bun run они не выполняются, поэтому логику, зависящую от рантайма, туда не переносишь. Возвращать нужно сериализуемые значения — функция или класс дадут ошибку Not serializable. Это повод проверить, что макрос не тянет за собой побочные эффекты.

Какие задачи решает

  • вшить версию и время сборки в бандл
  • подставить git-хэш и ветку без чтения файлов в рантайме
  • встроить LICENSE или config.json прямо в код
  • сгенерировать типы и API-клиент из схемы на этапе сборки
  • уронить сборку, если не задана нужная переменная окружения

Примеры запросов агенту

  • Покажи, как объявить макрос Bun и импортировать его с with { type: "macro" }
  • Сделай макрос, который возвращает git-хэш через Bun.spawnSync и вшивается в сборку
  • Почему мой макрос не выполняется при bun run?

Как установить bun-macros

1Через Skills CLI (Vercel)

npx skills add secondsky/claude-skills --skill bun-macros -a claude-code

2Вручную: положить файлы

~/.claude/skills/bun-macros/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/bun-macros/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора89

bun-redis Скилл подсказывает агенту, как подключить Redis в проекте на Bun: клиенты, кеш, pub/sub, сессии. CX Codex +1 388установок nuxt-core Скилл для ИИ-агента: подсказывает, как устроен Nuxt 4 — структура каталогов, конфиг, роутинг, SEO и обработка ошибок. CX Codex +1 390установок bun-jest-migration Скилл ведёт миграцию тестов с Jest на встроенный раннер Bun: импорты, моки, таймеры, конфиг. CX Codex +1 386установок nuxt-data Скилл для работы с данными в Nuxt 4: композаблы, useFetch и useAsyncData, состояние через useState и Pinia. CX Codex +1 388установок bun-nuxt Скилл объясняет агенту, как поднять Nuxt 3 на Bun: скрипты, пресет Nitro, серверные маршруты и деплой. Пригодится, если проект уже на Nuxt и вы хотите уйти с Node. CX Codex +1 387установок multi-ai-consultant Скилл зовёт сторонние ИИ на помощь, когда Claude застрял на баге или выбирает архитектуру. Ответы сводятся в один разбор. CX Codex +1 384установок graphql-implementation Скилл для сборки GraphQL API: схема, резолверы, обработка ошибок и защита от N+1. Пригодится при переходе с REST и при подписках в реальном времени. CX Codex +1 380установок model-deployment Скилл для вывода обученной модели в прод: FastAPI-сервер, Docker, Kubernetes, мониторинг и отлов дрейфа. Пригодится, когда модель уже готова, а сервинг ещё нет. CX Codex +1 379установок

Похожие

bun-development sickn33 Скилл помогает вести JavaScript и TypeScript-разработку на Bun: создавать проекты, переносить код с Node.js и разбирать проблемы рантайма. CX Codex +1 2 800установок bun-runtime affaan-m Скилл объясняет агенту, когда брать Bun вместо Node, и даёт команды для установки, тестов и деплоя на Vercel. CX Codex +1 4 700установок bun brianlovin Переключает агента на среду Bun вместо привычных Node.js и npm. Настраивает команды запуска, встроенные базы данных и сервер без внешних пакетов. CX Codex +1 2 800установок rollup-bundler Mindrally Скилл задаёт агенту правила конфигурации Rollup.js: форматы вывода, внешние зависимости, tree-shaking и плагины для сборки библиотек. CX Codex +1 657установок esbuild sanjeed5 Правило для Cursor, которое задаёт агенту порядок работы с esbuild: один конфиг вместо россыпи флагов в package.json. Пригодится, когда сборка уже есть, но её никто не может поддерживать. ★ 3 579звёзд репо guide toss Помогает настроить библиотеку es-toolkit в проекте, подобрать правильный импорт и команду установки для текущего рантайма. CX Codex +1 516установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о bun-macros

Как установить bun-macros в Claude?

Выполни npx skills add secondsky/claude-skills --skill bun-macros -a claude-code. После этого файл скилла лежит в ~/.claude/skills/bun-macros/SKILL.md.

Что делает bun-macros?

Описывает макросы Bun: JavaScript, который выполняется при бандлинге, а результат подставляется в выходной файл. Скилл даёт синтаксис, примеры и разбор частых ошибок.

Когда макросы вообще выполняются?

Только во время bun build. При bun run код макроса не запускается, так что значения из него в рантайме не появятся.

Исходный текст

SKILL.md · MIT
---
name: bun-macros
description: Evaluate JavaScript at bundle time and inline results. Use when optimizing compile-time code generation, embedding files, inlining environment variables, or executing code during the bundling process.
metadata:
  version: "1.0.0"
license: MIT
---

# Bun Macros

Bun macros run JavaScript at bundle time and inline the results into the output.

## Quick Start

```typescript
// src/config.ts (macro file)
export function getVersion() {
  return "1.0.0";
}

export function getBuildTime() {
  return new Date().toISOString();
}

// src/index.ts (consumer)
import { getVersion, getBuildTime } from "./config" with { type: "macro" };

// At bundle time, these become:
const version = "1.0.0";
const buildTime = "2024-01-15T12:00:00.000Z";
```

## Macro Syntax

```typescript
// Import with macro attribute
import { fn } from "./macro-file" with { type: "macro" };

// Call the macro (evaluated at build time)
const result = fn();
```

## Common Use Cases

### Environment Inlining

```typescript
// macros/env.ts
export function env(key: string): string {
  return process.env[key] ?? "";
}

// src/index.ts
import { env } from "./macros/env" with { type: "macro" };

const apiUrl = env("API_URL");
// Becomes: const apiUrl = "https://api.example.com";
```

### Git Information

```typescript
// macros/git.ts
export function gitCommit(): string {
  return Bun.spawnSync(["git", "rev-parse", "HEAD"])
    .stdout.toString().trim();
}

export function gitBranch(): string {
  return Bun.spawnSync(["git", "branch", "--show-current"])
    .stdout.toString().trim();
}

// src/index.ts
import { gitCommit, gitBranch } from "./macros/git" with { type: "macro" };

const BUILD_INFO = {
  commit: gitCommit(),
  branch: gitBranch(),
};
// Inlined at build time
```

### File Embedding

```typescript
// macros/embed.ts
export function embedFile(path: string): string {
  return Bun.file(path).text();
}

export function embedJSON(path: string): unknown {
  return Bun.file(path).json();
}

// src/index.ts
import { embedFile, embedJSON } from "./macros/embed" with { type: "macro" };

const license = embedFile("./LICENSE");
const config = embedJSON("./config.json");
```

### Build Constants

```typescript
// macros/constants.ts
export function isDev(): boolean {
  return process.env.NODE_ENV !== "production";
}

export function buildDate(): number {
  return Date.now();
}

export function randomId(): string {
  return Math.random().toString(36).slice(2);
}

// src/index.ts
import { isDev, buildDate, randomId } from "./macros/constants" with { type: "macro" };

if (isDev()) {
  console.log("Development mode");
}

const BUILD_ID = randomId();
```

### Directory Listing

```typescript
// macros/files.ts
import { readdirSync } from "fs";

export function listRoutes(): string[] {
  return readdirSync("./src/routes")
    .filter(f => f.endsWith(".tsx"))
    .map(f => f.replace(".tsx", ""));
}

// src/router.ts
import { listRoutes } from "./macros/files" with { type: "macro" };

const routes = listRoutes();
// Becomes: const routes = ["home", "about", "users"];
```

### Code Generation

```typescript
// macros/codegen.ts
export function generateTypes(schema: string): string {
  // Parse schema and generate types at build time
  const types = parseSchemaToTypes(schema);
  return types;
}

export function generateAPI(spec: string): string {
  const openapi = JSON.parse(Bun.file(spec).text());
  // Generate API client code
  return generateClientFromOpenAPI(openapi);
}
```

## Return Types

Macros can return:

```typescript
// Primitives
export function getString(): string { return "hello"; }
export function getNumber(): number { return 42; }
export function getBoolean(): boolean { return true; }
export function getNull(): null { return null; }

// Objects (serializable)
export function getObject(): object {
  return { key: "value", nested: { a: 1 } };
}

// Arrays
export function getArray(): string[] {
  return ["a", "b", "c"];
}

// Response (for bundler plugins)
export function getResponse(): Response {
  return new Response("content", {
    headers: { "Content-Type": "text/plain" },
  });
}
```

## Async Macros

```typescript
// macros/fetch.ts
export async function fetchSchema(): Promise<object> {
  const response = await fetch("https://api.example.com/schema.json");
  return response.json();
}

// src/index.ts
import { fetchSchema } from "./macros/fetch" with { type: "macro" };

const schema = await fetchSchema();
// Fetched at build time, inlined as object literal
```

## Parameters

```typescript
// macros/parameterized.ts
export function repeat(str: string, count: number): string {
  return str.repeat(count);
}

export function formatDate(format: string): string {
  return new Date().toLocaleDateString("en-US", {
    dateStyle: format as any,
  });
}

// src/index.ts
import { repeat, formatDate } from "./macros/parameterized" with { type: "macro" };

const separator = repeat("-", 20);
const date = formatDate("long");
```

## Conditional Code

```typescript
// macros/platform.ts
export function platform(): "node" | "bun" | "browser" {
  if (typeof Bun !== "undefined") return "bun";
  if (typeof process !== "undefined") return "node";
  return "browser";
}

// src/index.ts
import { platform } from "./macros/platform" with { type: "macro" };

if (platform() === "bun") {
  // This block is kept or removed at build time
  console.log("Running on Bun");
}
```

## Bundle-Only Execution

Macros ONLY run during bundling:

```bash
# Macros executed
bun build src/index.ts --outdir=dist

# Macros NOT executed (runtime)
bun run src/index.ts
```

## Error Handling

```typescript
// macros/safe.ts
export function requireEnv(key: string): string {
  const value = process.env[key];
  if (!value) {
    throw new Error(`Missing required env var: ${key}`);
  }
  return value;
}

// Build fails if env var missing
import { requireEnv } from "./macros/safe" with { type: "macro" };
const secret = requireEnv("API_SECRET");
```

## Debugging Macros

```typescript
// macros/debug.ts
export function debug(label: string, value: unknown): unknown {
  console.log(`[MACRO] ${label}:`, value);
  return value;
}

// See output during build
bun build src/index.ts --outdir=dist
// [MACRO] config: { ... }
```

## Best Practices

1. **Keep macros pure** - Avoid side effects
2. **Return serializable values** - Must be JSON-compatible
3. **Handle errors** - Throw meaningful errors for build failures
4. **Document dependencies** - Note what files/env vars are required
5. **Test separately** - Macros can be tested as regular functions

## Common Errors

| Error | Cause | Fix |
|-------|-------|-----|
| `Cannot find module` | Wrong import path | Check macro file location |
| `Not serializable` | Function/class returned | Return plain data |
| `Macro failed` | Runtime error in macro | Debug macro separately |
| `Not evaluated` | Missing `with { type: "macro" }` | Add import attribute |

## When to Load References

Load `references/advanced-patterns.md` when:
- Complex code generation
- Plugin integration
- Build pipelines
Retrieve and present patterns for custom macro implementations, integration examples with build systems, and advanced bundler plugin workflows.

Load `references/debugging.md` when:
- Macro not evaluating
- Unexpected output
- Performance issues
Retrieve debugging techniques, provide step-by-step diagnostics, and offer optimization strategies tied to the user's specific issue.

© secondsky · MIT · secondsky/claude-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой