레이블이 claude-code인 게시물을 표시합니다. 모든 게시물 표시
레이블이 claude-code인 게시물을 표시합니다. 모든 게시물 표시

skill.sh(Vercel Agent Skills Ecosystem)

claude code 에서 스킬을 만들어 공유할때 보통 플러그인을 만드는데 skill.md 외 .claude-plugin/{marketplace.json,plugin.json} 을 만들어 버전,키워드등의 메타 데이터를 작성해야 한다.

그런데 최근 vercel 에서 오픈한 https://www.skills.sh 을 보면 그냥 skill.md 만 생성하고 별도의 .json 같은 파일을 필요로 하지 않는다.
마켓에 올리는 것이 아니니 별도의 심사가 없고 스킬이 있는 깃헙 저장소 자체의 버전이 되는 것이다.

claude code 플러그인은 설치하면 ~/.claude/plugin/ 에 추가되는 반면 skills 로 설치하면 사용자 로컬 ~/.claude/skills/ 에 일반 로컬 스킬로 추가된다

skills.sh 은 json 매니페스트를 복잡하게 구성할 필요 없이 .md 상단의 frontmatter 만으로 충분하다.

# 사용 예 (난 npx 보단 bunx 을 선호한다.)
# 특정 브랜치 지정해서 설치(디폴트는 main, HEAD)
bunx skills add my-org/my-skills#develop

# 특정 태그 지정해서 설치
bunx skills add my-org/my-skills#v1.2.0

# 특정 커밋 해시를 지정해서 설치
bunx skills add my-org/my-skills#a1b2c3d

# 다음과 같이 특정 저장소 경로를 명시해서 설치할 수도 있다.
bunx skills add https://github.com/ysoftman/myenv/tree/main/.claude/skills

# https://github.com/Leonxlnx/taste-skill 설치 예시
bunx skills add https://github.com/Leonxlnx/taste-skill --skill "design-taste-frontend"

Usage of Claude Code and Codex

claude-code를 사용할때는 하루에 입력토큰이 많아야 2M 로 limit 에 걸릴일이 없었는데,
codex 를 사용하고 부턴 질문 몇개에 금방 5h limit 에 걸려 보니 input token 이 2M가 금방찬다.

https://github.com/ryoppippi/ccusage 는 claude-code/codex 의 사용량 현황을 알려준다.

참고로 사용자 .jsonl 의 토큰 및 캐시 사용 기록 파악한다.
~/.claude/projects/<project>/*.jsonl
~/.codex/sessions/<year>/<month>/<day>/*.jsonl

# 설치
bun install -g ccusage

# claude-code usage
ccusage
ccusage daily
ccusage weekly
ccusage monthly

# ai 제품별로 사용량 조회
ccusage codex daily
ccusage opencode daily
ccusage gemini daily

# codex usage
#bunx @ccusage/codex@latest -> deprecatd

다음과 같이 둘을 비교해보니 한달치 input token 이 claude-code 가 훨씬 적다.

Claude Code: Input 적고 > Cache Read로 대부분 처리 > 저렴
Codex: Input이 크고 > Cache Read 비율이 낮음 > 비쌈

codex reasoning(내부 추론) 과정은 캐시 키를 매번 바꿔서 캐시를 무효화시키는 경향이 있다고 한다.
fast 모드도 비용에 영향을 준다고 함.

다음 설정을 해서 줄여볼 수 있다고 하는데 여전히 input token 이 팍팍 증가한다.
# ~/.codex/config.toml
model_reasoning_effort = "low"
model_reasoning_summary = "concise"
model_verbosity = "low"
[features]
fast_mode = false # /fast 자체가 숨김 처리된다.

# web ui 로 볼수 있는 툴도 있다.
brew tap phuryn/claude-usage https://github.com/phuryn/claude-usage
brew install phuryn/claude-usage/claude-usage
claude-usage dashboard

integrate OpenCode and ClaudeCode into neovim

opencode, claudecode 를 별도의 터미널 창에서 사용하다 보면 특정 코드 block/range 를 지시할때 copy & paste 를 사용하는데 좀 불편하다.
neovim(nvim)에서 opencode, claudecode 띄우고 코드를 보면서 특정 코드영역을 바로 넘겨서 질의할 수 있는 환경을 만들 수 있다.

opencode 의 경우 다음 플러그인을 설치하자.
opencode 가 nvim window 으로 표시된다.
<leader>or 로 코드 블럭을 opencode 프롬프트로 전달

claudecode 의 경우 다음 플러그인을 설치하자.
claudecode 가 nvim snacks_terminal 로 실행된다.
<leader>as 로 코드 블럭을 opencode 프롬프트로 전달

local llm with claude code and opencode

어떤 로컬 llmfit(https://github.com/AlexsJones/llmfit) 을 사용하면 내 하드웨어에 맞는 최고의 모델이 무엇인지알 수 있다.
llmfit 버전을 설치해서 실행해야 최신 모델이 보인다.
uv tool upgrade llmfit
또는
brew upgrade llmfit

Inst 컬럼은 설치 가능 여부 표시다.
O ollama 로 다운로드 가능
L llama.cpp 로 다운로드 가능
S LM Studio 로 다운로드 가능
- 다운로드 가능한 프로바이더 찾지 못함
✓ 로컬에 설치되어 있음

내 시스템 스펙(cpu,gpu,mem) 조회
llmfit system

llmfit 에서도 perfect 라고 나와도 실제 내가 사용중인 프로그램/환경등으로 인해 리소스가 부족해 안뜰 수 있다.
MLX 모델은 ollama 에서 찾을 수 없어 qwen3-coder 로 사용해보자.
ollama pull qwen3-coder:latest
ollama ls
ollama run qwen3-coder
ollama ps

ollama는 OpenAI 호환 API (/v1/chat/completions 등)를 제공한다.    
opencode.json > provider > ollama 에 다음과 같이 설정한다.
{
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama (local)",
      "options": {
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "qwen3-coder:latest": {
          "name": "Qwen3 Coder 30.5B"
        },
        "llama3.2:latest": {
          "name": "Llama 3.2 3B"
        }
      }
    }
  }
}

opencode 에서 로컬 llm 사용 결과

claude code 에서는 openAI api 호환이 되지 않아 중간에 litellm(proxy) 서버를 둬야 한다.
litellm[proxy] 로 기본 + 프록시 실행에 필요한 추가 패키지들(backoff, uvicorn, fastapi 등)을 함께 설치해야 한다.
uv pip install 'litellm[proxy]' --system

litellm 프록시 서버 구동
litellm --model qwen-coder3 --api_base http://localhost:11434/v1 --port 8001

이제 다음 환경변수를 .local_llm_env_for_claude_code 등의 파일로 저장하자.

# 로컬 llm URL
export ANTHROPIC_BASE_URL="http://localhost:8001"

# 더미값으로 설정하면 된다.(sk:SecretKey)
export ANTHROPIC_API_KEY="sk-dummy-key"

# Claude Code의 외부 통신을 최소화하기 위해 다음 환경변수도 설정하자.
# 텔레메트리(사용 통계 수집)를 비활성화
export CLAUDE_CODE_ENABLE_TELEMETRY=0

# 핵심 API 호출 외의 불필요한 네트워크 트래픽 차단
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1

# API 요청 시 Claude Code가 보내는 attribution 헤더(어떤 클라이언트에서 요청했는지 식별하는 정보)를 비활성화
export CLAUDE_CODE_ATTRIBUTION_HEADER=0

이제 다음과 같이 실행한다.
source .local_llm_env_for_claude_code; claude --model qwen3-coder

실행 후 api key 사용을 선택

왼쪽: 기본 opus 모델을 사용한 경우
오른쪽: 로컬 llm(qwen3-coder) 사용한 경우

#####

사용해보니 ollama M1 맥북에서 느리다.
Apple Silicon 전용 머신러닝 프레임워크 MLX(https://github.com/ml-explore/mlx)를 사용하자.
위 llmfit 나온것도 MLX 모델이다.

# 모델은 huggingface 에서 다운받는다.
# 참고로 모델은 ~/.cache/huggingface/hub 에 모델이 있다.
# huggingface_hub(hf)툴 설치
uv tool install huggingface_hub

# 캐시(모델) 목록 조회(모델명이 길면 뒤가 ...로 보인다.)
hf cache list

# 모델명 전체 출력으로 조회
hf cache list --format agent

# 모델 삭제시
hf cache rm 모델ID

# 모델 다운로드
# hugging face에 올라온 대다수의 모델은 공개 상태이므로 huggingface-cli login 단계를 거치지 않고 바로 다운로드 명령어를 실행하면 된다.
hf download 모델ID

# mlx-lm 설치
pip install mlx-lm
# 또는
uv tool install mlx-lm

# mlx-lm 실행
mlx_lm.server \
    --model lmstudio-community/Qwen2.5-Coder-7B-Instruct-MLX-4bit \
    --port 8080

# 모델명을 확인한다.
http://localhost:8080/v1/models

# ~/.config/opencode/opencode.json 에 다음 모델 설정을 추가한다.
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "mlx-local": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "MLX Local",
      "options": {
        "baseURL": "http://localhost:1234/v1"
      },
      "models": {
        "mlx-community/Qwen3-8B-4bit": {
          "name": "Qwen3 8B (4bit)"
        },
        "lmstudio-community/Qwen3-Coder-30B-A3B-Instruct-MLX-4bit": {
          "name": "Qwen3-Coder-30B-A3B-Instruct-MLX-4bit"
        },
        "lmstudio-community/Qwen2.5-Coder-7B-Instruct-MLX-4bit": {
          "name": "Qwen2.5-Coder-7B-Instruct-MLX-4bit"
        }
      }
    }
  }
}

이제 opencode 를 열고 모델을 선택해 사용하면 된다.

모델 테스트 결과
Qwen3-Coder-30B-A3B-Instruct-MLX-4bit
큰 모델은 맥북 M1 MAX(32G RAM)에서 메모리 사용율이 100% 가 되면서 모자란 메모리에 대해 스왑이 발생해 CPU 100%가 되고 정작 GPU 놀고 맥북은 버벅거리는 경우가 발생했다.

Qwen2.5-Coder-7B-Instruct-MLX-4bit
tool_call(LLM 은 텍스트만 생성, 파일을 쓰거나 명령을 실행하는 건 못 하는데 그 간극을 메우는 약속)지원 안된다.

claude code with zellij

최근 버전의 claude code 에서는 AGENT_TEAMS(팀모드)를 제공한다.
~/.claude/settings.json 에 아래 환경변수를 활성화 하면된다.
  "env": {
    "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
  },

이게 기존 병렬 에이전트와 다른 점은 서브 에이전트들끼리 통신할 수 있고, tmux가 설치되어 있다면 각 에이전트들의 작업을 볼수 있어 좋다.

            팀모드 (TeamCreate + Agent)        병렬 에이전트 (Agent only)
실행 방식     별도 프로세스 (out-of-process)        인프로세스 (in-process)
tmux pane   각 teammate마다 별도 pane 생성        생성 안됨
UI 표시      각 pane에서 실시간 진행 확인 가능        메인 화면에서 결과만 반환
통신         SendMessage로 메시지 교환            결과를 직접 반환
작업 관리     TaskCreate/TaskUpdate로 추적        없음 (단발성)
teammate 간 가능 (서로 메시지 송수신)               불가 (독립 실행)
수명         idle 대기, 추가 작업 할당 가능          작업 완료 시 즉시 종료

그런데 multiplexer로는 tmux 만 공식 지원해서 zellij 에서 쓸수 없었는데
https://github.com/stanislc/zellij-claude-teams 에서 zellij 용 shim 을 제공한다.
zellij 환경의 claude code 에서 tmux 명령이 호출되면 shim이 이를 가로채 zellij pane으로 라우팅한다.

zellij 세션에서 claude code 를 실행하고 팀모드로 작업 요청을 하면 다음과 같이 zellij pane 으로 에이전트들의 작업중인 내용을 볼수 있다. 작업이 끝다면 서비스에이전트 pane 들은 자동으로 닫힌다.

[참고]
zellij 버전업이 되면서 동작 방식이 바뀌어 shim 이 동작안한다.
흠, 매번 shim 도 같이 관리가 되어야하는데 비공식으로 개인이 관리하는거라 큰 기대를 할 수 없다.
그냥 안쓰기로 함.

terminated screencapture

맥스크린 캡쳐시 저장이 안되는 경우가 발생했다. 될 때는 되고 안될때는 안되던가 수초간의 딜레이가 발생 후 저장됐다
스크린 캡쳐 관련 프로세스는 다음 2개가 있다.
screencapture: cmd+shift+3/4 로 실제로 캡처를 수행하는 프로세스
screencaptureui: cmd+shift+5 로 화면 캡처 메뉴 UI 를 보여주는 프로세스

위 2개 프로세스를 모니터링(btop 등에서 screen 이름으로 필터링) 하고
cmd+shift+4 누르면 screencapture 가 실행되고 종료되지만 캡쳐가 되지 않거나 느리게 캡쳐된다.

다음과 같은 명령으로 영역 캡쳐 테스트시 캡쳐가 안되는 경우 강제 종료가 되고 있다는것을 알았다.
screencapture -R 0,0,100,100 -t jpg z.jpg
zsh: terminated  screencapture -R 0,0,100,100 -t jpg z.jpg

cmd+shift+5 누르면 screencaptureui 가 생겼다 사라진다.(메뉴가 잠깐 보였다 사라진다)
screenshot.app 앱도 실행하면 켭쳐메뉴가 바로 종료된다.
claude-code 으로 원인 파악을 해봤다.

screencaptureui(PID: 37344) 로그를 모니터링하면
/usr/bin/log show --last 2m | grep "37344" | grep -i "exit"

launchd가 프로세스 종료 시 자동으로 기록하는 로그에 원인이 포함되어 있었다.
launchd: [gui/501/com.apple.screencaptureui.agent [37344]:] exited due to SIGTERM | sent by TouchEN_TEWeb_Agent[854], ran for 285ms

원인은 TouchEN_TEWeb_Agent(금융/보안 프로그램)이였다.
TEWebUNInstall.pkg 를 실행해서 삭제하니 잘된다.

claude-code os error 35

mac 에서 opencode, cladue-code 를 동시에 사용하고 있었는데 갑자기 터미널이 먹통이 됐다.
새로운 창도 열리지 않고, 이미 있는 다른 터미널에서 ls, ps 등의 명령을 실행하면 다음 메시지가 나오면서 실행되지 않는다.
zsh: fork failed: resource temporarily unavailable

터미널 종료 후 다시 실행하니 다음과 같은 에러가 발생하면서 실행되지 않았다.
Resource temporarily unavailable (os error 35)
⚠️  Process "/opt/homebrew/bin/zsh" in domain "local" didn't exit cleanly
Exited with code 1.
This message is shown because exit_behavior="CloseOnCleanExit"

kitty, alacritty, wezterm, iterm 터미널 에뮬레이터 모두 실행되지 않았다.
심지어 이미 실행중인 chrome 도 인터넷이 동작하지 않고, 프로세스를 상태 파악을 위한 activity monitor.app 도 실행되지 않았다.

원인 파악을 위해 opencode, claude-code 각각 먹통되기 전 질의를 다시 해보니 claude-code 에서 갑자기 pgrep 프로세스를 많이 실행하게 되면서 재현이 됐다.

이 현상은 시간이 좀 지나면 정상으로 돌아오기도 하지만 어떤 경우에는 1시간을 기다려도 정상으로 돌아오지 않아 재부팅을 해야 했다.
zellij multiplexer 때문인가 싶어 사용하지 않았는데도 발생했다.

pgrep 을 재귀적으로 계속 spawn 하는것 같고 비슷한 이슈가 버그 이슈로 등록되어 나도 커멘트를 추가했다.

위 이슈에서 해결방법을 알려줬다.
brew uninstall proctools 로 삭제하니 /opt/homebrew/bin/pgrep 도 같이 삭제된다.
which -a pgrep
/usr/bin/pgrep
이 상태에선 pgrep 무한 생성 현상이 사라졌다.

Prev