Skip to content

feat: PyPI 배포 전환 (tako-shell) — 원라인 설치 + 슬래시 커맨드 동봉 - #56

Merged
nonasking merged 4 commits into
developfrom
feat/pypi-distribution
Aug 8, 2026
Merged

feat: PyPI 배포 전환 (tako-shell) — 원라인 설치 + 슬래시 커맨드 동봉#56
nonasking merged 4 commits into
developfrom
feat/pypi-distribution

Conversation

@nonasking

Copy link
Copy Markdown
Owner

받는 사람이 깔아야 하는 별도 프로그램을 최소화하는 것이 목표. 기능은 그대로 유지한다.

설치의 실제 병목은 Python 런타임이었다. macOS 기본 python 은 3.9.6 이라
requires-python >=3.10 에 걸려 pip install -e . 가 바로 실패하고, 그 뒤로
PEP 668 · PATH 문제가 줄줄이 따라온다. uv 가 이걸 통째로 흡수한다.

설치 방식만 바꾸면 슬래시 커맨드가 도달 불가능해진다는 문제가 딸려 나왔다 —
install.sh 는 저장소의 commands/*.md 를 심볼릭 링크하는데, PyPI 설치자는
저장소가 없다. 같이 고쳤다.

무엇

배포 채널

  • 배포명 tako-shell (PyPI 의 tako 는 선점됨). 실행 명령어는 tako 그대로
  • get-tako.sh — uv 탐지·설치 → PyPI 설치 → PATH 확인. curl | bash 를 꺼리는 쪽을 위해 PyPI/pipx 경로 병기
  • ci.yml — macOS·Linux × Python 3.10·3.13 테스트 + 설치 스크립트 shellcheck
  • release.yml — 태그 푸시 → 태그/버전 일치 검증 → 테스트 → 빌드 → PyPI Trusted Publishing (토큰 저장 없음)

슬래시 커맨드

  • commands/tako/commands/ 이동, package-data 포함
  • tako slash install [--force] / list / path 신설 — 동봉 사본을 ~/.claude/commands/ 로 복사
  • 링크가 아니라 복사인 이유: 설치본 원본이 도구 환경 안에 있어 업그레이드·제거로 링크가 끊긴다
  • 저장소에서 커맨드를 편집 하는 개발 흐름은 install.sh 의 링크 방식이 계속 담당

첫 실행

  • 설정 없을 때 TTY 면 그 자리에서 init 제안. 비TTY(슬래시 커맨드·CI)는 종전대로 안내 후 exit 2 — 자동화가 입력을 기다리며 멈추지 않게 하고 테스트로 고정
  • tako init 이 토큰 발급 페이지를 브라우저로 열어줌 (browser.py)
  • 🐛 안내문이 cp config.example.yaml 을 시켰다 — PyPI 설치자에겐 없는 파일. 최소 YAML 을 본문에 직접 넣음
  • 🐛 --credentials 커스텀 경로에서 자동 init 이 돌면 인증 파일만 기본 경로에 생기던 문제

검증

  • 테스트 143개 통과 (+18: test_first_run.py, test_slash.py)
  • 커밋 4개 각각 독립적으로 테스트 통과 확인
  • 실제 휠을 깨끗한 venv 에 설치해 저장소 밖에서 검증 — 슬래시 설치·첫 실행 종료코드 기대대로

머지 후 필요한 것

  1. PyPI → Publishing → Add a new pending publisher
    project: tako-shell / owner: nonasking / repo: tako / workflow: release.yml / environment: pypi
  2. GitHub Settings → Environments → pypi 생성
  3. git tag v0.1.0 && git push origin v0.1.0

get-tako.sh 의 raw URL 이 develop 을 가리키므로 머지 전에는 원라인 설치가 동작하지 않는다.

보류한 것

  • Claude Code 플러그인 전환 — 기존 /tako 사용자에게 커맨드명이 깨지는 변경이라 설치 문제와 분리
  • Homebrew 개인 tap, Windows 지원
  • README 는 영어인데 CLI 출력·슬래시 커맨드는 한국어인 불일치

판단 근거와 재평가 트리거는 docs/distribution-review.md 에 남겼다. 특히 공개 배포에서는 단일 바이너리가 오히려 불리하다(브라우저 다운로드 경로에서만 Gatekeeper 가 작동) 는 점이 언어 재작성을 하지 않기로 한 축이었다.

⚠️ 기존 사용자 영향

commands/ 를 옮겼으므로 예전에 install.sh 로 링크해 쓰던 사람은 링크가 끊긴다.
./install.sh 재실행 또는 tako slash install --force 로 복구된다.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FR3Lm3SnJ329MQV4SwTsut

nonasking and others added 4 commits August 7, 2026 00:41
설정이 없을 때 안내문이 `cp config.example.yaml` 을 시켰다. 저장소를 받지 않고
설치한 사용자에게는 없는 파일이라 그대로 막힌다. 최소 YAML 을 안내문 본문에
직접 넣어 설치 방식과 무관하게 따라갈 수 있게 했다.

첫 실행에서 안내만 하고 끝내지 않고, TTY 면 그 자리에서 init 을 제안한다.
비TTY(슬래시 커맨드·CI·파이프)는 종전대로 안내 후 exit 2 — 자동화가 입력을
기다리며 멈추면 안 되기 때문이고, 이 계약을 테스트로 고정했다.

토큰 발급은 브라우저를 거쳐야 하는 유일한 단계라 여기서 길을 잃는 사람이
많다. browser.py 를 추가해 init 이 발급 페이지를 열어준다 (clipboard.py 와
같은 베스트-에포트 규약 — 실패해도 흐름은 진행).

--credentials 로 커스텀 경로를 준 상태에서 자동 init 이 돌면 인증 파일만
기본 경로에 생겨 바로 뒤 creds 로드가 엇갈리던 문제도 함께 고쳤다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FR3Lm3SnJ329MQV4SwTsut
install.sh 는 저장소의 commands/*.md 를 심볼릭 링크한다. 저장소 없이 설치한
사용자에게는 슬래시 커맨드가 통째로 도달 불가능하다는 뜻이라, 배포 방식을
바꾸면 기능이 하나 사라진다.

commands/ 를 tako/commands/ 로 옮겨 패키지가 자기 슬래시 커맨드를 소유하게
하고, `tako slash install` 이 동봉 사본을 ~/.claude/commands/ 로 복사한다.

링크가 아니라 복사인 이유: 설치본의 원본은 도구 환경 안에 있어 패키지를
올리거나 지우면 링크가 끊긴다. 업그레이드 후 갱신은 --force.
이미 있는 파일은 손대지 않는다 — 사용자가 고쳤을 수 있다.

저장소를 받아 커맨드 자체를 편집하는 개발 흐름은 install.sh 의 링크 방식이
계속 담당한다. 새 경로를 보도록 고치고 두 방식의 역할을 헤더에 명시했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FR3Lm3SnJ329MQV4SwTsut
설치의 실제 병목은 Python 런타임이었다. macOS 기본 python 은 3.9.6 이라
requires-python >=3.10 에 걸려 `pip install -e .` 가 바로 실패하고, 그 뒤로
PEP 668 · PATH 문제가 줄줄이 따라온다.

uv 가 이걸 통째로 흡수한다. get-tako.sh 는 uv 를 탐지·설치한 뒤 PyPI 에서
설치하고 PATH 를 확인한다. 사용자는 Python·git·pip 를 인지할 필요가 없다.
curl | bash 를 꺼리는 사람을 위해 스크립트 헤더에 동등한 PyPI/pipx 경로를
병기했다.

배포명은 tako-shell — PyPI 의 tako 는 선점돼 있다. 실행 명령어는 project.scripts
가 패키지명과 독립이라 tako 그대로다. 이름이 기능을 말해주지 않는 대가는
keywords 로 갚는다.

릴리스는 태그 푸시 하나로 끝난다. API 토큰을 저장하지 않고 Trusted Publishing
(OIDC) 으로 인증하며, 태그와 pyproject 버전이 어긋나면 발행을 거부한다.
ci.yml 은 macOS·Linux × Python 3.10·3.13 로 테스트하고 설치 스크립트를
shellcheck 한다.

tests/__init__.py 는 unittest discover 가 tests/ 를 훑기 위한 것 —
없으면 CI 가 테스트를 한 건도 수집하지 못한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FR3Lm3SnJ329MQV4SwTsut
README 의 설치 절이 개발자용 clone → pip install -e . 기준이라 받는 사람
기준으로 다시 썼다. 원라인을 앞에 두고 PyPI/pipx 를 나란히, 소스 설치는
접어서 뒤로 보냈다. 슬래시 커맨드 절을 새로 두어 tako slash install 과
install.sh 의 쓰임을 구분했고, 릴리스 절차와 Trusted Publishing 최초 설정을
남겼다.

docs/distribution-review.md 는 왜 이 방식인지에 대한 기록이다. 특히 언어
재작성을 하지 않기로 한 근거와 재평가 트리거를 남겼다 — 공개 배포에서는
단일 바이너리가 오히려 불리하다(브라우저 다운로드 경로에서만 Gatekeeper 가
작동한다)는 점이 판단의 축이었다.

보류한 것도 함께 적었다: Claude Code 플러그인 전환(커맨드명이 깨지는 변경),
Homebrew tap, Windows, 그리고 README 는 영어인데 CLI 출력은 한국어인 불일치.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FR3Lm3SnJ329MQV4SwTsut
@nonasking nonasking closed this Aug 6, 2026
@nonasking nonasking reopened this Aug 6, 2026
@nonasking
nonasking merged commit 5a203ce into develop Aug 8, 2026
10 checks passed
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.

1 participant