kitech-repository


Namekitech-repository JSON
Version 0.1.12 PyPI version JSON
download
home_pageNone
SummaryKITECH Manufacturing Data Repository CLI and Library
upload_time2025-10-24 06:05:26
maintainerNone
docs_urlNone
authorNone
requires_python<3.14,>=3.10
licenseNone
keywords cli data file-manager kitech manufacturing repository tui
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # KITECH Manufacturing Data Repository CLI

KITECH 제조 데이터 리포지토리를 위한 Python CLI 도구 및 라이브러리입니다.

## 기능

- 🖥️ **대화형 파일 관리자 (TUI)** - Textual 프레임워크 기반 현대적인 TUI
  - 리포지토리 선택 화면 (페이지네이션 지원)
  - 듀얼 패널 파일 관리자 (로컬 ↔ 원격)
  - 향상된 포커스 관리 (시각적 표시기)
  - 실시간 진행률 추적 (업로드/다운로드)
  - 배치 작업 지원 (여러 파일 동시 처리)
- 🔐 API Token 기반 인증 (시스템 키링에 안전 저장)
- ⬇️ 파일/폴더 다운로드 (SHA-256 무결성 검증)
- ⬆️ 파일/폴더 업로드 (MD5 무결성 검증)
- 📊 실시간 진행률 표시 (배치 작업 지원)
- 🐍 Python Library API (프로그래밍 방식 사용 가능)

## 요구 사항

- Python 3.10 ~ 3.13
- pip 또는 pipx

## 설치

### 권장 방법: pipx (CLI 도구용)

```bash
# pipx 설치 (한 번만)
brew install pipx
pipx ensurepath

# kitech-repository 설치
pipx install kitech-repository
```

### 대안: pip (라이브러리로 사용 시)

```bash
# 가상환경에서 설치
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
pip install kitech-repository

# 또는 사용자 설치 (--user)
pip install --user kitech-repository
```

## 사용법

### 1. 초기 설정 (간단 버전)

단 한 번의 명령으로 서버 설정 + 로그인을 완료할 수 있습니다:

```bash
# 대화형으로 설정 (서버 URL과 Token을 순서대로 입력)
kitech login

# 또는 직접 지정
kitech login https://your-server.com
```

이 명령은 서버 주소를 설정하고 API Token 로그인까지 한 번에 처리합니다.

### 2. 파일 관리자 시작 

```bash
kitech start
```

실행하면 리포지토리 선택 화면이 먼저 나타납니다:

**1단계: \
리포지토리 선택 화면**
- 모든 접근 가능한 리포지토리 목록 표시 (페이지네이션 지원)
- `↑/↓` 키로 리포지토리 선택
- `Enter` 키를 눌러 해당 리포지토리의 파일 관리자로 진입

**2단계: 듀얼 패널 파일 관리자**
- **왼쪽 패널 (원격)**: 선택한 리포지토리의 파일
- **오른쪽 패널 (로컬)**: 로컬 파일 시스템
- **하단 패널**: 파일 전송 진행률 표시

### 기본 사용 흐름

1. **파일 탐색**
   - `↑/↓` 키로 파일/폴더 선택
   - `Enter` 키로 폴더 열기 또는 파일 다운로드
   - `..` 항목을 선택하고 `Enter`를 눌러 상위 디렉토리로 이동
   - `Tab` 키로 왼쪽/오른쪽 패널 전환

2. **다운로드** (원격 → 로컬)
   - 왼쪽 패널(원격)에서 다운로드할 파일/폴더 선택
   - `Enter` 키 또는 `F2` 키로 선택한 파일 다운로드
   - `F1` 키로 현재 디렉토리의 모든 파일 다운로드
   - `~/Downloads` 폴더에 다운로드됨
   - 실시간 진행률이 하단에 표시됨

3. **업로드** (로컬 → 원격)
   - 오른쪽 패널(로컬)에서 업로드할 파일/폴더 선택
   - `F4` 키로 선택한 파일 업로드
   - `F3` 키로 현재 디렉토리의 모든 파일 업로드
   - 왼쪽 패널의 현재 경로에 업로드됨
   - 실시간 진행률이 하단에 표시됨

4. **종료**
   - `Ctrl+C` 또는 `Ctrl+Q` 키로 프로그램 종료
   - 터미널에서 `kitech logout`으로 로그아웃

### 키보드 단축키

#### 전역 단축키

| 키 | 기능 |
|---|---|
| `Tab` | 왼쪽/오른쪽 패널 전환 |
| `Ctrl+C` / `Ctrl+Q` | 프로그램 종료 |

#### 원격 패널 (왼쪽)

| 키 | 기능 |
|---|---|
| `↑/↓` | 파일/폴더 선택 |
| `Enter` | 폴더 열기 또는 파일 다운로드 |
| `F1` | 현재 디렉토리의 모든 파일 다운로드 |
| `F2` | 선택한 파일 다운로드 |
| `F5` | 파일 목록 새로고침 |
| `Backspace` | 상위 디렉토리로 이동 |

#### 로컬 패널 (오른쪽)

| 키 | 기능 |
|---|---|
| `↑/↓` | 파일/폴더 선택 |
| `Enter` | 폴더 열기 |
| `F3` | 현재 디렉토리의 모든 파일 업로드 |
| `F4` | 선택한 파일 업로드 |
| `F5` | 파일 목록 새로고침 |
| `Backspace` | 상위 디렉토리로 이동 |

## 명령어 참조

### 주요 명령어

```bash
# 로그인 (서버 설정 + 인증 한번에)
kitech login [SERVER_URL]

# 파일 관리자 시작
kitech start [REPO_ID]

# 연결 상태 확인
kitech status

# 로그아웃
kitech logout

# 버전 확인
kitech version
```

### 고급 명령어

```bash
# 서버 URL 변경
kitech server [NEW_URL]

# 현재 설정 확인
kitech config

# 설정 초기화
kitech config reset
```

### 저장 위치

- **설정 파일**: `~/.kitech/config.json` - 서버 URL, 청크 크기
- **인증 메타데이터**: `~/.kitech/auth_metadata.json` - 사용자 정보, 만료일
- **API 키**: 시스템 키링에 안전하게 암호화되어 저장 (macOS Keychain, Windows Credential Manager 등)

### 환경 변수 (선택사항)

명령어 대신 환경 변수로도 설정할 수 있습니다:

```bash
# 환경 변수로 설정
export KITECH_API_BASE_URL=https://your-api-server.com

# 또는 .env 파일에 작성
echo "KITECH_API_BASE_URL=https://your-api-server.com" > .env
```

**주의**: 베이스 URL만 입력하세요. API 버전(`/v1`)은 클라이언트가 런타임에 자동으로 추가합니다.

---

## 개발자를 위한 Library API

Python 프로그램에서 직접 사용할 수 있습니다:

### 기본 사용법

```python
from kitech_repository import KitechClient

# 기본 사용 (v1 API)
client = KitechClient(token="kt_xxx")

# 리포지토리 목록
repos = client.list_repositories()
for repo in repos:
    print(f"{repo.id}: {repo.name}")

# 파일 목록
files = client.list_files(repository_id=123)

# 파일 다운로드
client.download_file(
    repository_id=123,
    path="/data/file.csv",
    output_dir="./downloads"
)

# 파일 업로드
client.upload_file(
    repository_id=123,
    file_path="local.csv",
    remote_path="/data/uploaded.csv"
)

# Context manager 사용 (권장)
with KitechClient(token="kt_xxx") as client:
    repos = client.list_repositories()
```

### 배치 작업

```python
# 여러 파일 동시 다운로드 (비동기)
import asyncio
from kitech_repository import KitechClient

async def download_multiple():
    async with KitechClient(token="kt_xxx") as client:
        result = await client.download_batch(
            repository_id=123,
            paths=["/data/file1.csv", "/data/file2.csv"],
            output_dir="./downloads"
        )
        print(f"Success: {len(result.successful)}")
        print(f"Failed: {len(result.failed)}")

asyncio.run(download_multiple())
```

### 편의 함수

```python
from kitech_repository import download, upload, list_repositories

# 간단한 다운로드
download(repository_id=123, path="/data/file.csv")

# 간단한 업로드
upload(repository_id=123, file_path="local.csv", remote_path="/data/")

# 리포지토리 목록
repos = list_repositories(app_key="kt_xxx")
```

### API 버전 관리

```python
# 다른 API 버전 사용
client_v2 = KitechClient(token="kt_xxx", api_version="v2")

# API 버전 없이 사용
client_no_version = KitechClient(token="kt_xxx", api_version="")

# 기본값은 "v1"
client_default = KitechClient(token="kt_xxx")  # api_version="v1"
```

**중요**:
- Config 파일에는 베이스 URL만 저장되며, API 버전은 클라이언트 생성 시 지정합니다
- 이를 통해 동일한 애플리케이션에서 여러 API 버전을 동시에 사용할 수 있습니다

### 인증 관리

```python
from kitech_repository import AuthManager

# 인증 관리자 사용
auth = AuthManager()

# 로그인 정보 저장
auth.login(
    app_key="kt_xxx",
    user_id="user@example.com",
    expires_at="2026-01-01T00:00:00"
)

# 인증 확인
if auth.is_authenticated():
    print(f"Logged in as: {auth.get_metadata()['user_id']}")

# API 헤더 가져오기
headers = auth.headers  # {"X-App-Key": "kt_xxx"}

# 로그아웃
auth.logout()
```

### 설정 관리

```python
from kitech_repository import Config

# 설정 로드
config = Config.load()
print(f"API URL: {config.api_base_url}")
print(f"Chunk Size: {config.chunk_size}")

# 설정 변경 및 저장
config.api_base_url = "https://new-server.com"
config.save()

# 환경 변수로 설정
# KITECH_API_BASE_URL=https://server.com python script.py
```

## 개발

### 개발 환경 설정

```bash
# 저장소 클론
git clone https://github.com/WIM-Corporation/kitech-repository-CLI.git
cd kitech-repository-CLI

# uv로 설치 (권장)
uv venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
uv pip install -e ".[dev]"

# 또는 pip로 설치
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
```

### 코드 품질

```bash
# 포맷팅
ruff format .

# 린트
ruff check .

# 자동 수정
ruff check . --fix
```

### 테스트

```bash
# 전체 테스트 실행
pytest

# 커버리지 포함
pytest --cov

# 특정 테스트 파일
pytest tests/unit/test_auth.py

# 특정 테스트 함수
pytest tests/unit/test_auth.py::test_function_name
```

### TUI 개발

```bash
# 개발 모드로 TUI 실행 (라이브 리로드)
textual run --dev kitech_repository.tui.app:KitechTUI

# Textual 콘솔로 디버깅 (별도 터미널에서)
textual console

# Textual 내장 도구
textual borders  # 테두리 스타일 미리보기
textual colors   # 색상 팔레트 미리보기
textual keys     # 키 바인딩 참조
```

## 아키텍처

### 프로젝트 구조

```
kitech_repository/
├── cli/              # CLI 명령어 구현 (Typer)
│   ├── main.py      # 진입점
│   └── commands/    # 개별 명령어 모듈
├── core/            # 핵심 기능
│   ├── client.py    # HTTP 클라이언트
│   ├── auth.py      # 인증 관리
│   ├── config.py    # 설정 관리
│   └── exceptions.py # 예외 계층
├── models/          # 데이터 모델 (Pydantic)
│   ├── repository.py
│   ├── file.py
│   └── batch.py
├── tui/             # TUI 애플리케이션 (Textual)
│   ├── app.py       # 메인 앱
│   ├── screens/     # 화면 컴포넌트
│   ├── widgets/     # 위젯 컴포넌트
│   └── messages.py  # 커스텀 메시지
└── __init__.py      # 공개 API
```

### 핵심 설계 원칙

1. **이중 인터페이스 아키텍처**
   - CLI: 사용자 친화적인 명령어 인터페이스
   - Library: 프로그래밍 방식의 Python API

2. **보안**
   - 시스템 키링을 통한 안전한 자격증명 저장
   - 민감하지 않은 메타데이터만 파일에 저장
   - Presigned URL을 통한 직접 S3 액세스

3. **성능**
   - 비동기 배치 작업 (5-10개 동시 처리)
   - 청크 스트리밍 (기본 8KB)
   - 병렬 다운로드/업로드

4. **사용성**
   - 직관적인 TUI (Textual)
   - 명확한 진행률 표시
   - 도움말 메시지 및 오류 안내

## 라이센스

MIT License

## 기여

이슈 및 풀 리퀘스트를 환영합니다!

## 링크

- **PyPI**: https://pypi.org/project/kitech-repository/
- **GitHub**: https://github.com/WIM-Corporation/kitech-repository-CLI
- **Issues**: https://github.com/WIM-Corporation/kitech-repository-CLI/issues

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "kitech-repository",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.14,>=3.10",
    "maintainer_email": null,
    "keywords": "cli, data, file-manager, kitech, manufacturing, repository, tui",
    "author": null,
    "author_email": "KITECH <kitech@kitech.re.kr>",
    "download_url": "https://files.pythonhosted.org/packages/ab/e2/065e5da2b0107ddb6a2d668c514b4b56cd8a50e59573ed79da397988a3c0/kitech_repository-0.1.12.tar.gz",
    "platform": null,
    "description": "# KITECH Manufacturing Data Repository CLI\n\nKITECH \uc81c\uc870 \ub370\uc774\ud130 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc704\ud55c Python CLI \ub3c4\uad6c \ubc0f \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4.\n\n## \uae30\ub2a5\n\n- \ud83d\udda5\ufe0f **\ub300\ud654\ud615 \ud30c\uc77c \uad00\ub9ac\uc790 (TUI)** - Textual \ud504\ub808\uc784\uc6cc\ud06c \uae30\ubc18 \ud604\ub300\uc801\uc778 TUI\n  - \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc120\ud0dd \ud654\uba74 (\ud398\uc774\uc9c0\ub124\uc774\uc158 \uc9c0\uc6d0)\n  - \ub4c0\uc5bc \ud328\ub110 \ud30c\uc77c \uad00\ub9ac\uc790 (\ub85c\uceec \u2194 \uc6d0\uaca9)\n  - \ud5a5\uc0c1\ub41c \ud3ec\ucee4\uc2a4 \uad00\ub9ac (\uc2dc\uac01\uc801 \ud45c\uc2dc\uae30)\n  - \uc2e4\uc2dc\uac04 \uc9c4\ud589\ub960 \ucd94\uc801 (\uc5c5\ub85c\ub4dc/\ub2e4\uc6b4\ub85c\ub4dc)\n  - \ubc30\uce58 \uc791\uc5c5 \uc9c0\uc6d0 (\uc5ec\ub7ec \ud30c\uc77c \ub3d9\uc2dc \ucc98\ub9ac)\n- \ud83d\udd10 API Token \uae30\ubc18 \uc778\uc99d (\uc2dc\uc2a4\ud15c \ud0a4\ub9c1\uc5d0 \uc548\uc804 \uc800\uc7a5)\n- \u2b07\ufe0f \ud30c\uc77c/\ud3f4\ub354 \ub2e4\uc6b4\ub85c\ub4dc (SHA-256 \ubb34\uacb0\uc131 \uac80\uc99d)\n- \u2b06\ufe0f \ud30c\uc77c/\ud3f4\ub354 \uc5c5\ub85c\ub4dc (MD5 \ubb34\uacb0\uc131 \uac80\uc99d)\n- \ud83d\udcca \uc2e4\uc2dc\uac04 \uc9c4\ud589\ub960 \ud45c\uc2dc (\ubc30\uce58 \uc791\uc5c5 \uc9c0\uc6d0)\n- \ud83d\udc0d Python Library API (\ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd \uc0ac\uc6a9 \uac00\ub2a5)\n\n## \uc694\uad6c \uc0ac\ud56d\n\n- Python 3.10 ~ 3.13\n- pip \ub610\ub294 pipx\n\n## \uc124\uce58\n\n### \uad8c\uc7a5 \ubc29\ubc95: pipx (CLI \ub3c4\uad6c\uc6a9)\n\n```bash\n# pipx \uc124\uce58 (\ud55c \ubc88\ub9cc)\nbrew install pipx\npipx ensurepath\n\n# kitech-repository \uc124\uce58\npipx install kitech-repository\n```\n\n### \ub300\uc548: pip (\ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \uc0ac\uc6a9 \uc2dc)\n\n```bash\n# \uac00\uc0c1\ud658\uacbd\uc5d0\uc11c \uc124\uce58\npython -m venv .venv\nsource .venv/bin/activate  # Windows: .venv\\Scripts\\activate\npip install kitech-repository\n\n# \ub610\ub294 \uc0ac\uc6a9\uc790 \uc124\uce58 (--user)\npip install --user kitech-repository\n```\n\n## \uc0ac\uc6a9\ubc95\n\n### 1. \ucd08\uae30 \uc124\uc815 (\uac04\ub2e8 \ubc84\uc804)\n\n\ub2e8 \ud55c \ubc88\uc758 \uba85\ub839\uc73c\ub85c \uc11c\ubc84 \uc124\uc815 + \ub85c\uadf8\uc778\uc744 \uc644\ub8cc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\n\n```bash\n# \ub300\ud654\ud615\uc73c\ub85c \uc124\uc815 (\uc11c\ubc84 URL\uacfc Token\uc744 \uc21c\uc11c\ub300\ub85c \uc785\ub825)\nkitech login\n\n# \ub610\ub294 \uc9c1\uc811 \uc9c0\uc815\nkitech login https://your-server.com\n```\n\n\uc774 \uba85\ub839\uc740 \uc11c\ubc84 \uc8fc\uc18c\ub97c \uc124\uc815\ud558\uace0 API Token \ub85c\uadf8\uc778\uae4c\uc9c0 \ud55c \ubc88\uc5d0 \ucc98\ub9ac\ud569\ub2c8\ub2e4.\n\n### 2. \ud30c\uc77c \uad00\ub9ac\uc790 \uc2dc\uc791 \n\n```bash\nkitech start\n```\n\n\uc2e4\ud589\ud558\uba74 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc120\ud0dd \ud654\uba74\uc774 \uba3c\uc800 \ub098\ud0c0\ub0a9\ub2c8\ub2e4:\n\n**1\ub2e8\uacc4: \\\n\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc120\ud0dd \ud654\uba74**\n- \ubaa8\ub4e0 \uc811\uadfc \uac00\ub2a5\ud55c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ubaa9\ub85d \ud45c\uc2dc (\ud398\uc774\uc9c0\ub124\uc774\uc158 \uc9c0\uc6d0)\n- `\u2191/\u2193` \ud0a4\ub85c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc120\ud0dd\n- `Enter` \ud0a4\ub97c \ub20c\ub7ec \ud574\ub2f9 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc758 \ud30c\uc77c \uad00\ub9ac\uc790\ub85c \uc9c4\uc785\n\n**2\ub2e8\uacc4: \ub4c0\uc5bc \ud328\ub110 \ud30c\uc77c \uad00\ub9ac\uc790**\n- **\uc67c\ucabd \ud328\ub110 (\uc6d0\uaca9)**: \uc120\ud0dd\ud55c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc758 \ud30c\uc77c\n- **\uc624\ub978\ucabd \ud328\ub110 (\ub85c\uceec)**: \ub85c\uceec \ud30c\uc77c \uc2dc\uc2a4\ud15c\n- **\ud558\ub2e8 \ud328\ub110**: \ud30c\uc77c \uc804\uc1a1 \uc9c4\ud589\ub960 \ud45c\uc2dc\n\n### \uae30\ubcf8 \uc0ac\uc6a9 \ud750\ub984\n\n1. **\ud30c\uc77c \ud0d0\uc0c9**\n   - `\u2191/\u2193` \ud0a4\ub85c \ud30c\uc77c/\ud3f4\ub354 \uc120\ud0dd\n   - `Enter` \ud0a4\ub85c \ud3f4\ub354 \uc5f4\uae30 \ub610\ub294 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc\n   - `..` \ud56d\ubaa9\uc744 \uc120\ud0dd\ud558\uace0 `Enter`\ub97c \ub20c\ub7ec \uc0c1\uc704 \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9\n   - `Tab` \ud0a4\ub85c \uc67c\ucabd/\uc624\ub978\ucabd \ud328\ub110 \uc804\ud658\n\n2. **\ub2e4\uc6b4\ub85c\ub4dc** (\uc6d0\uaca9 \u2192 \ub85c\uceec)\n   - \uc67c\ucabd \ud328\ub110(\uc6d0\uaca9)\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc\ud560 \ud30c\uc77c/\ud3f4\ub354 \uc120\ud0dd\n   - `Enter` \ud0a4 \ub610\ub294 `F2` \ud0a4\ub85c \uc120\ud0dd\ud55c \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc\n   - `F1` \ud0a4\ub85c \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubaa8\ub4e0 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc\n   - `~/Downloads` \ud3f4\ub354\uc5d0 \ub2e4\uc6b4\ub85c\ub4dc\ub428\n   - \uc2e4\uc2dc\uac04 \uc9c4\ud589\ub960\uc774 \ud558\ub2e8\uc5d0 \ud45c\uc2dc\ub428\n\n3. **\uc5c5\ub85c\ub4dc** (\ub85c\uceec \u2192 \uc6d0\uaca9)\n   - \uc624\ub978\ucabd \ud328\ub110(\ub85c\uceec)\uc5d0\uc11c \uc5c5\ub85c\ub4dc\ud560 \ud30c\uc77c/\ud3f4\ub354 \uc120\ud0dd\n   - `F4` \ud0a4\ub85c \uc120\ud0dd\ud55c \ud30c\uc77c \uc5c5\ub85c\ub4dc\n   - `F3` \ud0a4\ub85c \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubaa8\ub4e0 \ud30c\uc77c \uc5c5\ub85c\ub4dc\n   - \uc67c\ucabd \ud328\ub110\uc758 \ud604\uc7ac \uacbd\ub85c\uc5d0 \uc5c5\ub85c\ub4dc\ub428\n   - \uc2e4\uc2dc\uac04 \uc9c4\ud589\ub960\uc774 \ud558\ub2e8\uc5d0 \ud45c\uc2dc\ub428\n\n4. **\uc885\ub8cc**\n   - `Ctrl+C` \ub610\ub294 `Ctrl+Q` \ud0a4\ub85c \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\n   - \ud130\ubbf8\ub110\uc5d0\uc11c `kitech logout`\uc73c\ub85c \ub85c\uadf8\uc544\uc6c3\n\n### \ud0a4\ubcf4\ub4dc \ub2e8\ucd95\ud0a4\n\n#### \uc804\uc5ed \ub2e8\ucd95\ud0a4\n\n| \ud0a4 | \uae30\ub2a5 |\n|---|---|\n| `Tab` | \uc67c\ucabd/\uc624\ub978\ucabd \ud328\ub110 \uc804\ud658 |\n| `Ctrl+C` / `Ctrl+Q` | \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc |\n\n#### \uc6d0\uaca9 \ud328\ub110 (\uc67c\ucabd)\n\n| \ud0a4 | \uae30\ub2a5 |\n|---|---|\n| `\u2191/\u2193` | \ud30c\uc77c/\ud3f4\ub354 \uc120\ud0dd |\n| `Enter` | \ud3f4\ub354 \uc5f4\uae30 \ub610\ub294 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc |\n| `F1` | \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubaa8\ub4e0 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc |\n| `F2` | \uc120\ud0dd\ud55c \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc |\n| `F5` | \ud30c\uc77c \ubaa9\ub85d \uc0c8\ub85c\uace0\uce68 |\n| `Backspace` | \uc0c1\uc704 \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9 |\n\n#### \ub85c\uceec \ud328\ub110 (\uc624\ub978\ucabd)\n\n| \ud0a4 | \uae30\ub2a5 |\n|---|---|\n| `\u2191/\u2193` | \ud30c\uc77c/\ud3f4\ub354 \uc120\ud0dd |\n| `Enter` | \ud3f4\ub354 \uc5f4\uae30 |\n| `F3` | \ud604\uc7ac \ub514\ub809\ud1a0\ub9ac\uc758 \ubaa8\ub4e0 \ud30c\uc77c \uc5c5\ub85c\ub4dc |\n| `F4` | \uc120\ud0dd\ud55c \ud30c\uc77c \uc5c5\ub85c\ub4dc |\n| `F5` | \ud30c\uc77c \ubaa9\ub85d \uc0c8\ub85c\uace0\uce68 |\n| `Backspace` | \uc0c1\uc704 \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9 |\n\n## \uba85\ub839\uc5b4 \ucc38\uc870\n\n### \uc8fc\uc694 \uba85\ub839\uc5b4\n\n```bash\n# \ub85c\uadf8\uc778 (\uc11c\ubc84 \uc124\uc815 + \uc778\uc99d \ud55c\ubc88\uc5d0)\nkitech login [SERVER_URL]\n\n# \ud30c\uc77c \uad00\ub9ac\uc790 \uc2dc\uc791\nkitech start [REPO_ID]\n\n# \uc5f0\uacb0 \uc0c1\ud0dc \ud655\uc778\nkitech status\n\n# \ub85c\uadf8\uc544\uc6c3\nkitech logout\n\n# \ubc84\uc804 \ud655\uc778\nkitech version\n```\n\n### \uace0\uae09 \uba85\ub839\uc5b4\n\n```bash\n# \uc11c\ubc84 URL \ubcc0\uacbd\nkitech server [NEW_URL]\n\n# \ud604\uc7ac \uc124\uc815 \ud655\uc778\nkitech config\n\n# \uc124\uc815 \ucd08\uae30\ud654\nkitech config reset\n```\n\n### \uc800\uc7a5 \uc704\uce58\n\n- **\uc124\uc815 \ud30c\uc77c**: `~/.kitech/config.json` - \uc11c\ubc84 URL, \uccad\ud06c \ud06c\uae30\n- **\uc778\uc99d \uba54\ud0c0\ub370\uc774\ud130**: `~/.kitech/auth_metadata.json` - \uc0ac\uc6a9\uc790 \uc815\ubcf4, \ub9cc\ub8cc\uc77c\n- **API \ud0a4**: \uc2dc\uc2a4\ud15c \ud0a4\ub9c1\uc5d0 \uc548\uc804\ud558\uac8c \uc554\ud638\ud654\ub418\uc5b4 \uc800\uc7a5 (macOS Keychain, Windows Credential Manager \ub4f1)\n\n### \ud658\uacbd \ubcc0\uc218 (\uc120\ud0dd\uc0ac\ud56d)\n\n\uba85\ub839\uc5b4 \ub300\uc2e0 \ud658\uacbd \ubcc0\uc218\ub85c\ub3c4 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\n\n```bash\n# \ud658\uacbd \ubcc0\uc218\ub85c \uc124\uc815\nexport KITECH_API_BASE_URL=https://your-api-server.com\n\n# \ub610\ub294 .env \ud30c\uc77c\uc5d0 \uc791\uc131\necho \"KITECH_API_BASE_URL=https://your-api-server.com\" > .env\n```\n\n**\uc8fc\uc758**: \ubca0\uc774\uc2a4 URL\ub9cc \uc785\ub825\ud558\uc138\uc694. API \ubc84\uc804(`/v1`)\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub7f0\ud0c0\uc784\uc5d0 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ud569\ub2c8\ub2e4.\n\n---\n\n## \uac1c\ubc1c\uc790\ub97c \uc704\ud55c Library API\n\nPython \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c \uc9c1\uc811 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\n\n### \uae30\ubcf8 \uc0ac\uc6a9\ubc95\n\n```python\nfrom kitech_repository import KitechClient\n\n# \uae30\ubcf8 \uc0ac\uc6a9 (v1 API)\nclient = KitechClient(token=\"kt_xxx\")\n\n# \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ubaa9\ub85d\nrepos = client.list_repositories()\nfor repo in repos:\n    print(f\"{repo.id}: {repo.name}\")\n\n# \ud30c\uc77c \ubaa9\ub85d\nfiles = client.list_files(repository_id=123)\n\n# \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc\nclient.download_file(\n    repository_id=123,\n    path=\"/data/file.csv\",\n    output_dir=\"./downloads\"\n)\n\n# \ud30c\uc77c \uc5c5\ub85c\ub4dc\nclient.upload_file(\n    repository_id=123,\n    file_path=\"local.csv\",\n    remote_path=\"/data/uploaded.csv\"\n)\n\n# Context manager \uc0ac\uc6a9 (\uad8c\uc7a5)\nwith KitechClient(token=\"kt_xxx\") as client:\n    repos = client.list_repositories()\n```\n\n### \ubc30\uce58 \uc791\uc5c5\n\n```python\n# \uc5ec\ub7ec \ud30c\uc77c \ub3d9\uc2dc \ub2e4\uc6b4\ub85c\ub4dc (\ube44\ub3d9\uae30)\nimport asyncio\nfrom kitech_repository import KitechClient\n\nasync def download_multiple():\n    async with KitechClient(token=\"kt_xxx\") as client:\n        result = await client.download_batch(\n            repository_id=123,\n            paths=[\"/data/file1.csv\", \"/data/file2.csv\"],\n            output_dir=\"./downloads\"\n        )\n        print(f\"Success: {len(result.successful)}\")\n        print(f\"Failed: {len(result.failed)}\")\n\nasyncio.run(download_multiple())\n```\n\n### \ud3b8\uc758 \ud568\uc218\n\n```python\nfrom kitech_repository import download, upload, list_repositories\n\n# \uac04\ub2e8\ud55c \ub2e4\uc6b4\ub85c\ub4dc\ndownload(repository_id=123, path=\"/data/file.csv\")\n\n# \uac04\ub2e8\ud55c \uc5c5\ub85c\ub4dc\nupload(repository_id=123, file_path=\"local.csv\", remote_path=\"/data/\")\n\n# \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ubaa9\ub85d\nrepos = list_repositories(app_key=\"kt_xxx\")\n```\n\n### API \ubc84\uc804 \uad00\ub9ac\n\n```python\n# \ub2e4\ub978 API \ubc84\uc804 \uc0ac\uc6a9\nclient_v2 = KitechClient(token=\"kt_xxx\", api_version=\"v2\")\n\n# API \ubc84\uc804 \uc5c6\uc774 \uc0ac\uc6a9\nclient_no_version = KitechClient(token=\"kt_xxx\", api_version=\"\")\n\n# \uae30\ubcf8\uac12\uc740 \"v1\"\nclient_default = KitechClient(token=\"kt_xxx\")  # api_version=\"v1\"\n```\n\n**\uc911\uc694**:\n- Config \ud30c\uc77c\uc5d0\ub294 \ubca0\uc774\uc2a4 URL\ub9cc \uc800\uc7a5\ub418\uba70, API \ubc84\uc804\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc0dd\uc131 \uc2dc \uc9c0\uc815\ud569\ub2c8\ub2e4\n- \uc774\ub97c \ud1b5\ud574 \ub3d9\uc77c\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc5ec\ub7ec API \ubc84\uc804\uc744 \ub3d9\uc2dc\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n\n### \uc778\uc99d \uad00\ub9ac\n\n```python\nfrom kitech_repository import AuthManager\n\n# \uc778\uc99d \uad00\ub9ac\uc790 \uc0ac\uc6a9\nauth = AuthManager()\n\n# \ub85c\uadf8\uc778 \uc815\ubcf4 \uc800\uc7a5\nauth.login(\n    app_key=\"kt_xxx\",\n    user_id=\"user@example.com\",\n    expires_at=\"2026-01-01T00:00:00\"\n)\n\n# \uc778\uc99d \ud655\uc778\nif auth.is_authenticated():\n    print(f\"Logged in as: {auth.get_metadata()['user_id']}\")\n\n# API \ud5e4\ub354 \uac00\uc838\uc624\uae30\nheaders = auth.headers  # {\"X-App-Key\": \"kt_xxx\"}\n\n# \ub85c\uadf8\uc544\uc6c3\nauth.logout()\n```\n\n### \uc124\uc815 \uad00\ub9ac\n\n```python\nfrom kitech_repository import Config\n\n# \uc124\uc815 \ub85c\ub4dc\nconfig = Config.load()\nprint(f\"API URL: {config.api_base_url}\")\nprint(f\"Chunk Size: {config.chunk_size}\")\n\n# \uc124\uc815 \ubcc0\uacbd \ubc0f \uc800\uc7a5\nconfig.api_base_url = \"https://new-server.com\"\nconfig.save()\n\n# \ud658\uacbd \ubcc0\uc218\ub85c \uc124\uc815\n# KITECH_API_BASE_URL=https://server.com python script.py\n```\n\n## \uac1c\ubc1c\n\n### \uac1c\ubc1c \ud658\uacbd \uc124\uc815\n\n```bash\n# \uc800\uc7a5\uc18c \ud074\ub860\ngit clone https://github.com/WIM-Corporation/kitech-repository-CLI.git\ncd kitech-repository-CLI\n\n# uv\ub85c \uc124\uce58 (\uad8c\uc7a5)\nuv venv\nsource .venv/bin/activate  # Windows: .venv\\Scripts\\activate\nuv pip install -e \".[dev]\"\n\n# \ub610\ub294 pip\ub85c \uc124\uce58\npython -m venv .venv\nsource .venv/bin/activate\npip install -e \".[dev]\"\n```\n\n### \ucf54\ub4dc \ud488\uc9c8\n\n```bash\n# \ud3ec\ub9f7\ud305\nruff format .\n\n# \ub9b0\ud2b8\nruff check .\n\n# \uc790\ub3d9 \uc218\uc815\nruff check . --fix\n```\n\n### \ud14c\uc2a4\ud2b8\n\n```bash\n# \uc804\uccb4 \ud14c\uc2a4\ud2b8 \uc2e4\ud589\npytest\n\n# \ucee4\ubc84\ub9ac\uc9c0 \ud3ec\ud568\npytest --cov\n\n# \ud2b9\uc815 \ud14c\uc2a4\ud2b8 \ud30c\uc77c\npytest tests/unit/test_auth.py\n\n# \ud2b9\uc815 \ud14c\uc2a4\ud2b8 \ud568\uc218\npytest tests/unit/test_auth.py::test_function_name\n```\n\n### TUI \uac1c\ubc1c\n\n```bash\n# \uac1c\ubc1c \ubaa8\ub4dc\ub85c TUI \uc2e4\ud589 (\ub77c\uc774\ube0c \ub9ac\ub85c\ub4dc)\ntextual run --dev kitech_repository.tui.app:KitechTUI\n\n# Textual \ucf58\uc194\ub85c \ub514\ubc84\uae45 (\ubcc4\ub3c4 \ud130\ubbf8\ub110\uc5d0\uc11c)\ntextual console\n\n# Textual \ub0b4\uc7a5 \ub3c4\uad6c\ntextual borders  # \ud14c\ub450\ub9ac \uc2a4\ud0c0\uc77c \ubbf8\ub9ac\ubcf4\uae30\ntextual colors   # \uc0c9\uc0c1 \ud314\ub808\ud2b8 \ubbf8\ub9ac\ubcf4\uae30\ntextual keys     # \ud0a4 \ubc14\uc778\ub529 \ucc38\uc870\n```\n\n## \uc544\ud0a4\ud14d\ucc98\n\n### \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870\n\n```\nkitech_repository/\n\u251c\u2500\u2500 cli/              # CLI \uba85\ub839\uc5b4 \uad6c\ud604 (Typer)\n\u2502   \u251c\u2500\u2500 main.py      # \uc9c4\uc785\uc810\n\u2502   \u2514\u2500\u2500 commands/    # \uac1c\ubcc4 \uba85\ub839\uc5b4 \ubaa8\ub4c8\n\u251c\u2500\u2500 core/            # \ud575\uc2ec \uae30\ub2a5\n\u2502   \u251c\u2500\u2500 client.py    # HTTP \ud074\ub77c\uc774\uc5b8\ud2b8\n\u2502   \u251c\u2500\u2500 auth.py      # \uc778\uc99d \uad00\ub9ac\n\u2502   \u251c\u2500\u2500 config.py    # \uc124\uc815 \uad00\ub9ac\n\u2502   \u2514\u2500\u2500 exceptions.py # \uc608\uc678 \uacc4\uce35\n\u251c\u2500\u2500 models/          # \ub370\uc774\ud130 \ubaa8\ub378 (Pydantic)\n\u2502   \u251c\u2500\u2500 repository.py\n\u2502   \u251c\u2500\u2500 file.py\n\u2502   \u2514\u2500\u2500 batch.py\n\u251c\u2500\u2500 tui/             # TUI \uc560\ud50c\ub9ac\ucf00\uc774\uc158 (Textual)\n\u2502   \u251c\u2500\u2500 app.py       # \uba54\uc778 \uc571\n\u2502   \u251c\u2500\u2500 screens/     # \ud654\uba74 \ucef4\ud3ec\ub10c\ud2b8\n\u2502   \u251c\u2500\u2500 widgets/     # \uc704\uc82f \ucef4\ud3ec\ub10c\ud2b8\n\u2502   \u2514\u2500\u2500 messages.py  # \ucee4\uc2a4\ud140 \uba54\uc2dc\uc9c0\n\u2514\u2500\u2500 __init__.py      # \uacf5\uac1c API\n```\n\n### \ud575\uc2ec \uc124\uacc4 \uc6d0\uce59\n\n1. **\uc774\uc911 \uc778\ud130\ud398\uc774\uc2a4 \uc544\ud0a4\ud14d\ucc98**\n   - CLI: \uc0ac\uc6a9\uc790 \uce5c\ud654\uc801\uc778 \uba85\ub839\uc5b4 \uc778\ud130\ud398\uc774\uc2a4\n   - Library: \ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc758 Python API\n\n2. **\ubcf4\uc548**\n   - \uc2dc\uc2a4\ud15c \ud0a4\ub9c1\uc744 \ud1b5\ud55c \uc548\uc804\ud55c \uc790\uaca9\uc99d\uba85 \uc800\uc7a5\n   - \ubbfc\uac10\ud558\uc9c0 \uc54a\uc740 \uba54\ud0c0\ub370\uc774\ud130\ub9cc \ud30c\uc77c\uc5d0 \uc800\uc7a5\n   - Presigned URL\uc744 \ud1b5\ud55c \uc9c1\uc811 S3 \uc561\uc138\uc2a4\n\n3. **\uc131\ub2a5**\n   - \ube44\ub3d9\uae30 \ubc30\uce58 \uc791\uc5c5 (5-10\uac1c \ub3d9\uc2dc \ucc98\ub9ac)\n   - \uccad\ud06c \uc2a4\ud2b8\ub9ac\ubc0d (\uae30\ubcf8 8KB)\n   - \ubcd1\ub82c \ub2e4\uc6b4\ub85c\ub4dc/\uc5c5\ub85c\ub4dc\n\n4. **\uc0ac\uc6a9\uc131**\n   - \uc9c1\uad00\uc801\uc778 TUI (Textual)\n   - \uba85\ud655\ud55c \uc9c4\ud589\ub960 \ud45c\uc2dc\n   - \ub3c4\uc6c0\ub9d0 \uba54\uc2dc\uc9c0 \ubc0f \uc624\ub958 \uc548\ub0b4\n\n## \ub77c\uc774\uc13c\uc2a4\n\nMIT License\n\n## \uae30\uc5ec\n\n\uc774\uc288 \ubc0f \ud480 \ub9ac\ud018\uc2a4\ud2b8\ub97c \ud658\uc601\ud569\ub2c8\ub2e4!\n\n## \ub9c1\ud06c\n\n- **PyPI**: https://pypi.org/project/kitech-repository/\n- **GitHub**: https://github.com/WIM-Corporation/kitech-repository-CLI\n- **Issues**: https://github.com/WIM-Corporation/kitech-repository-CLI/issues\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "KITECH Manufacturing Data Repository CLI and Library",
    "version": "0.1.12",
    "project_urls": {
        "Documentation": "https://github.com/kitech/kitech-repository#readme",
        "Homepage": "https://github.com/kitech/kitech-repository",
        "Issues": "https://github.com/kitech/kitech-repository/issues",
        "Repository": "https://github.com/kitech/kitech-repository.git"
    },
    "split_keywords": [
        "cli",
        " data",
        " file-manager",
        " kitech",
        " manufacturing",
        " repository",
        " tui"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b2525d98f1af2708854fa291a241d2ca2cfa0f82b186f21fe6de486fc030dfc4",
                "md5": "12f2adc0c3ed2899b2e141393b18291a",
                "sha256": "3450cbed674441630c840b8be3acefd45eeb6a66c9250f389b23e227e5d4b453"
            },
            "downloads": -1,
            "filename": "kitech_repository-0.1.12-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "12f2adc0c3ed2899b2e141393b18291a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.14,>=3.10",
            "size": 73556,
            "upload_time": "2025-10-24T06:05:25",
            "upload_time_iso_8601": "2025-10-24T06:05:25.043448Z",
            "url": "https://files.pythonhosted.org/packages/b2/52/5d98f1af2708854fa291a241d2ca2cfa0f82b186f21fe6de486fc030dfc4/kitech_repository-0.1.12-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "abe2065e5da2b0107ddb6a2d668c514b4b56cd8a50e59573ed79da397988a3c0",
                "md5": "0b60e48440878a62f43ad4b8e4ce2954",
                "sha256": "a53e97bd64ff0c9caffa8e971ecf4bed043b55f1c22f90f0a4b9ae713bcc17d0"
            },
            "downloads": -1,
            "filename": "kitech_repository-0.1.12.tar.gz",
            "has_sig": false,
            "md5_digest": "0b60e48440878a62f43ad4b8e4ce2954",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.14,>=3.10",
            "size": 51156,
            "upload_time": "2025-10-24T06:05:26",
            "upload_time_iso_8601": "2025-10-24T06:05:26.378120Z",
            "url": "https://files.pythonhosted.org/packages/ab/e2/065e5da2b0107ddb6a2d668c514b4b56cd8a50e59573ed79da397988a3c0/kitech_repository-0.1.12.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-24 06:05:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "kitech",
    "github_project": "kitech-repository#readme",
    "github_not_found": true,
    "lcname": "kitech-repository"
}
        
Elapsed time: 3.47138s