dev-memo
Tags Activity
Claude Code skill最新仕様メモ(2026年2月時点) 2026/2/14
claude-code skill specification

新しいfrontmatterフィールド

フィールド説明
context: forkサブエージェント分離実行
agentforkのエージェントタイプ(Explore, Plan等)
hooksPreToolUse/PostToolUse/Stopフック

動的コンテキスト注入

## Context
- Current branch: !`git branch --show-current`

!command“ でスキル送信前にコマンド出力を埋め込める。

descriptionのベストプラクティス

Triggers: キーワードで自動起動条件を明記する。これがClaude自動起動の唯一の判断材料。

"PRをレビューする。Triggers: user says 'レビューして', or when a PR number is mentioned."

Progressive Disclosure

  • Level 1: メタデータ(常時ロード、~100トークン)
  • Level 2: SKILL.md本文(起動時、<5000トークン推奨)
  • Level 3: references/(必要時にRead)
~/.claude/ 肥大化対策 — cleanupPeriodDaysとサイズ確認 2026/2/14
claude-code maintenance

肥大化の犯人

  • projects/ — 会話履歴。最大(数百MB〜GB級)
  • debug/ — デバッグログ。数百MBになる
  • file-history/ — ファイル変更履歴。300GB到達の報告あり

対策

settings.json に追加:

{
  "cleanupPeriodDays": 20
}

サイズ確認エイリアス:

alias claude-size='du -sh ~/.claude/ && du -sh ~/.claude/* 2>/dev/null | sort -h'

削除可能なディレクトリ

debug/, projects/*, file-history/, stats-cache.json, statsig/

削除不可: settings.json, commands/, skills/, rules/

Claude Code skill vs subagent — 実装形態の判断フロー 2026/2/14
claude-code skill subagent architecture

3つの実装形態

形態構成使い分け
A: スキル単体SKILL.md対話的 + 軽量処理
B: サブエージェント単体agent.md非対話、他から呼ばれる
C: ラッパーパターンSKILL.md + agent.md/command起動 + 重い処理は別コンテキスト

判断フロー

対話が必要?
├─ Yes → 処理重い? → Yes: C / No: A
└─ No  → /command起動したい? → Yes: C / No: B

ポイント

  • disable-model-invocation: true は使わない。descriptionのトリガー条件で起動制御する方が柔軟
  • ラッパーパターンでは SKILL.md は薄く(委譲のみ)、実処理は agent.md に書く
  • 軽量処理のagentは model: haiku でコスト3倍削減
SvelteKit +server.ts はNext.jsのAPIルートと同じ 2026/2/14
sveltekit cloudflare-workers api

+server.ts = サーバー専用APIエンドポイント

SvelteKitのファイル規約:

ファイル役割
+page.svelteページUI(ブラウザ)
+page.server.tsページ用サーバー処理
+server.ts純粋なAPIエンドポイント

Next.jsとの対応:

Next.jsSvelteKit
app/api/xxx/route.tssrc/routes/api/xxx/+server.ts

Cloudflare環境変数の取得パターン

// +server.ts 内(サーバー専用、フロントに露出しない)
const apiKey = platform?.env?.CLAUDE_API_KEY;
  • platform.env = Cloudflare Workers の Bindings(環境変数)
  • process.env ではなく platform.env を使うのがCF固有のパターン
  • ?. は ローカル開発時に platform が undefined になる可能性があるため
Zellijの恩恵はZedユーザーには薄い — 本当に活きる場面 2026/2/14
zellij zed terminal workflow

Zedエディタ複数起動 + 内蔵ターミナルのワークフローだとZellijの利点の大半はカバー済み

Zellijの売りZedで代替可能
プロジェクトごとの分離ウィンドウを分けて起動
ペイン分割エディタ内ターミナル分割
エディタ+ターミナル同時表示標準機能

Zellijが本当に活きる場面

  • SSH先での作業 — 接続切れてもセッション生存
  • エディタ再起動時 — dev serverなど長時間プロセスがZellijで動いていれば死なない
  • エディタ非依存の作業環境 — Zedを使わない日でも環境が残る

macOS + Zed内蔵ターミナルでAltキーを使うには

Zed設定で option_as_meta: true が必要。これがないとAltキーが特殊文字入力になる。

{
  "terminal": {
    "option_as_meta": true
  }
}
git worktreeでのquick-fix時の依存関係の罠 2026/2/12
git worktree pre-commit nuxt

問題

git worktree add で一時ディレクトリにブランチをチェックアウトすると、node_modules が存在しないためpre-commitフック(lefthook)が失敗する。

必要な準備

worktreeでgit commitする前に以下が必要:

# 1. ルートの依存
yarn install --frozen-lockfile

# 2. サブディレクトリの依存(monorepo構成の場合)
cd site && yarn install --frozen-lockfile

# 3. Nuxtプロジェクトの場合、ESLint設定が .nuxt/ に依存
cd site && npx nuxt prepare

教訓

  • biome: ルートの node_modules だけで動く
  • prettier: site/node_modules も必要(tailwind plugin等)
  • eslint: .nuxt/eslint.config.mjs が必要 → nuxt prepare 必須
  • フックが段階的に失敗するので、全部入れてからコミットすると効率的
ProseMirror/tiptapのrenderHTMLにおける0(hole)の意味 2026/2/12
tiptap prosemirror

renderHTMLの0とは

tiptap(ProseMirror)の renderHTML で返す配列の 0 は “hole” と呼ばれ、子要素(コンテンツ)が挿入される位置を示す。

// Mark拡張の例
renderHTML({ HTMLAttributes }) {
  // 0 = ProseMirrorの"hole"(子要素が挿入される位置)
  return ['a', HTMLAttributes, 0];
}

配列の構造

['タグ名', 属性オブジェクト, 0]
  │         │              └─ 子要素の挿入位置(hole)
  │         └─ HTML属性
  └─ 出力するHTML要素

0 がないとコンテンツが描画されない。Mark(インライン装飾)では必須。

BetterAuth + Cloudflare D1: kysely→drizzle移行とSPAモード 2026/2/11
better-auth cloudflare-d1 drizzle-orm sveltekit

BetterAuthのD1アダプタはDrizzle一択

kysely-d1はCF Workers本番でFailed to initialize database adapterエラー。drizzle-orm + drizzleAdapterが正解。

import { drizzleAdapter } from 'better-auth/adapters/drizzle';
import { drizzle } from 'drizzle-orm/d1';
import * as authSchema from './auth-schema';

const drizzleDb = drizzle(db, { schema: authSchema });
betterAuth({
  database: drizzleAdapter(drizzleDb, { provider: 'sqlite', schema: authSchema }),
});

schema必須 — 渡さないとThe model "verification" was not foundエラー。Drizzleスキーマでuser, session, account, verificationの4テーブルを定義して渡す。

認証必須アプリはSPAモードでよい

SEO不要なアプリでssr: trueは百害あって一利なし。src/routes/+layout.tsにexport const ssr = falseで解決。SSR起因のブラウザAPI問題(window未定義等)が全て消える。

ローカル開発でD1を使うには

svelte.config.jsのplatformProxy設定 + ローカルD1マイグレーション適用が必要:

wrangler d1 execute DB_NAME --local --file ./migrations/0001_initial.sql

vite devでplatform.env.DBがundefinedになる場合、.wrangler/state/v3/にローカルDBが存在しないのが原因。

Astro 5のContent Collectionsはloaderベースに変更 2026/2/10
astro

Astro 5ではContent Collectionsの設定が大きく変わった。

変更点

  • 設定ファイル: src/content/config.ts → src/content.config.ts
  • type: "content" が廃止され、loader が必須に
// Astro 5
import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";

const blog = defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
  }),
});

renderも変更

// 旧: post.render()
// 新: import { render } from "astro:content"
import { render } from "astro:content";
const { Content } = await render(post);

post.slug も廃止され、post.id を使う。

BiomeでSvelteファイルをフォーマットする設定 2026/2/8
biome svelte

Biome 2.xからSvelteファイルのフォーマットに対応した。biome.jsonで以下のように設定する。

{
  "formatter": {
    "enabled": true,
    "indentStyle": "tab"
  },
  "files": {
    "includes": ["**/*.svelte"]
  }
}

ただし、Svelteの<script>タグ内のみがフォーマット対象。テンプレート部分(HTML)は対象外なので注意。

# フォーマット実行
pnpm biome format --write "src/**/*.svelte"
← 前へ 5 / 6 次へ →
© 2026