aic
간체 중국어: README.zh-CN.md
aic는 사용자가 이미 가지고 있는 AI를 활용하여 지저분한 작업 트리를 일련의 깨끗하고 원자적인(atomic) 커밋으로 변환합니다.
🌐 웹사이트: https://caicoleung.github.io/aic-web/
CI Release License: MIT Changelog
aic splits one file's changes into atomic commits
스테이징된 것이 없고, git add -p를 할 필요도 없습니다. 파일 하나에 있는 세 개의 관련 없는 수정 사항은 세 개의 깨끗한 커밋으로 변환됩니다.
빠른 시작 (Quick Start)
curl --proto '=https' --tlsv1.2 -sSfL \
https://github.com/CaicoLeung/aic/releases/latest/download/aic-installer.sh | sh
...
💡 API 키가 없나요? 제공자 설정은 건너뛰고, 대신 [Claude Code, Codex, pi, opencode 등]의 7개 이상의 CLI 에이전트를 사용하세요. aic는 해당 에이전트의 인증을 재사용합니다.
Windows (PowerShell): irm https://github.com/CaicoLeung/aic/releases/latest/download/aic-installer.ps1 | iex
✨ 파일 단위가 아닌, 덩어리(Hunk) 단위의 커밋
hunk는 파일 내의 하나의 연속적인 변경 사항을 의미합니다. aic는 각 논리적 변경 사항을 개별적으로 커밋하므로, 한 파일에 있는 세 개의 수정 사항이 세 개의 깨끗한 커밋으로 변환됩니다. 다른 도구들은 전체 파일을 커밋하지만, aic는 더 이상 혼합된 "update auth.rs"를 작성하지 않으며 수동 git add -p가 필요 없습니다.
src/auth.rs — 하나의 파일, 세 개의 변경 사항
├─ hunk 1 → fix(auth): 토큰 만료 확인 수정
...
스테이징된 것이 아무것도 없을 때 aic를 실행하면, 모든 스테이징되지 않은 hunk를 자동으로 감지하고, 관심사별로 그룹화하여 각 그룹을 개별적으로 커밋합니다. 모델의 추론 과정은 분할 계획을 세우는 동안 실시간으로 스트리밍됩니다. 손실되거나 중복 커밋되는 것은 없습니다. 모든 hunk는 정확히 하나의 커밋에 포함되며, 그렇지 않으면 계획이 거부됩니다.
🔑 API 키가 없나요? 사용 중인 AI 에이전트를 활용하세요
이미 Claude Code, OpenAI Codex, pi, 또는 opencode가 설치 및 인증되어 있습니까? aic은 **헤드리스 모드(headless mode)**로 구동되며 기존 인증 정보를 재사용하므로 API 키가 필요하지 않습니다. 또한 다음 도구도 지원됩니다: oh-my-pi (omp), Gemini (gemini), Cursor (cursor-agent), Windsurf (devin — Windsurf는 Devin Desktop으로 이름이 변경됨), GitHub Copilot (copilot), Trae (traecli), 그리고 Qwen Code (qwen).
aic setup을 실행하고, **CLI 에이전트(CLI agent)**를 선택한 후 원하는 도구를 고르면 끝입니다. aic은 하나의 프롬프트를 전송하고 답변을 읽어옵니다. 따라서 에이전트를 도구 사용 모드(tool-use mode)로 실행하지 않기 때문에 주입된 지침이 작업 트리를 건드릴 수 없습니다. 모든 프리셋의 정확한 플래그와 바로 붙여넣을 수 있는 TOML 형식은 CLI 에이전트 프리셋에서 확인할 수 있습니다.
기능 (Features)
- 원자적, 덩어리(hunk)-레벨 커밋: 하나의 파일에 세 가지 관련 없는 변경 사항이 있습니까? 세 개의 커밋으로 분리해야 하며, 'update auth.rs'와 같은 혼합된 단일 커밋은 안 됩니다. 모델의 추론 과정이 실시간 스트리밍되며 완전히 비대화형(non-interactive)입니다.
- API 키 불필요: 이미 로그인된 상태로 로컬 머신에서 CLI 에이전트를 구동할 수 있습니다 (Claude Code, Codex, pi, opencode 및 7개 이상). 또는 12개의 API 제공업체 중 아무거나 선택할 수 있습니다.
- 관례적 커밋(Conventional Commits): 모든 메시지는 v1.0.0 사양을 따르며, 설명하는 논리적 변경 사항에 범위가 지정됩니다.
- 병합 충돌 해결(Merge conflict resolution):
aic resolve는 파일별로 검토할 수 있는 해결책을 제안하고, 이후 병합을 최종 확정합니다.
- 원클릭 되돌리기(One-command undo):
aic undo는 마지막 실행(Run)의 커밋들을 초기화하고 모든 변경 사항을 스테이징되지 않은 상태로 작업 트리에 반환합니다.
- 편집 제한 게이트(Redaction gate): diff에 포함된 비밀 형태의 콘텐츠는 LLM으로 아무것도 전송되기 전에 해당 실행을 거부하며,
--no-redact를 사용하면 이를 인지하고 진행합니다.
설치 (Installation)
사용법 (Usage)
| 명령어 | 설명 |
|---|
aic | 스테이징된 내용을 커밋합니다. 또는, 스테이징된 내용이 없을 경우, 모든 unstaged 변경 사항을 깨끗한 원자적 커밋(atomic commits)으로 분할하여 커밋합니다. |
| ... | |
Redaction Gate, --no-redact, 그리고 나머지 명령어 (aic list, aic update, aic completion): 다른 명령어. | |
설정 (Configuration)
설정 파일은 ~/.config/aic/config.toml에 위치하며, 이는 유일한 진실의 원천(single source of truth)입니다 (환경 변수는 읽지 않습니다). backend_kind에 의해 토글되는 두 가지 백엔드가 있습니다: HTTP를 통한 LLM API 제공자 또는 로컬 코딩 에이전트 CLI. 두 필드 세트는 파일 내에서 공존할 수 있으며, backend_kind가 활성화된 하나를 선택합니다.
전체 참고 자료: 지원되는 제공자 · CLI 에이전트 프리셋 · 설정 필드 · 다른 명령어.
병합 충돌 해결 (Resolving merge conflicts)
aic resolve proposes resolutions and finalizes the merge
병합 도중, aic resolve는 충돌이 발생한 파일별로 마커가 없는 방식으로 해결책을 제안합니다. 사용자는 diff를 검토하고 각각 승인하며, 그러면 병합이 최종적으로 완료됩니다.
병합 도중의 저장소에서 aic resolve를 실행하면: 각 충돌 파일을 읽고, 해결책을 제안하며, diff를 보여주고, 파일별로 apply?를 요청한 후 — 더 이상 병합되지 않은 것이 없을 경우 — 자동으로 병합의 --continue를 실행합니다. 일반적인 aic는 충돌이 발생한 저장소에서 이를 감지하고 수동으로 작업을 넘겨받을지 제안합니다.
기여 (Contributing)
CONTRIBUTING.md를 참조하세요 — 브랜치 규칙, 커밋 스타일, 검토 기대 사항. (간체 중국어: CONTRIBUTING.zh-CN.md)
라이선스 (License)
MIT
<details>
<summary><b style="cursor: pointer;">📋 전체 설정 참고 자료</b></b></summary>
지원되는 제공자 (Supported providers)
| Provider | Default model | API key | Base URL |
|---|
| OpenAI | gpt-5-mini | required | built-in |
| ... | | | |
OpenRouter 및 OpenAI 호환 제공업체는 기본 모델이 없습니다. 설정에서 model을 지정하십시오. OpenAI 호환 제공업체는 base_url을 필요로 하며 OpenAI 클라이언트(LM Studio, vLLM, 게이트웨이)를 통해 라우팅됩니다. | | | |
CLI 에이전트 프리셋 (CLI-agent presets)
디코더가 가능한 stdout 엔벨로프(claude, codex, pi, opencode, omp)를 가진 프리셋은 디코더를 얻습니다. omp는 pi의 포크인 만큼 pi를 재사용하므로 aic이 추론 과정을 스트리밍하고 CLI에서 이를 노출하여 답변을 깔끔하게 추출합니다. 나머지 프리셋들은 일반 인쇄 모드(plain print mode)를 사용하며, stdout 자체가 답변입니다.
backend_kind = "cli"
command = "claude"
...
backend_kind = "cli"
command = "codex"
...
backend_kind = "cli"
command = "pi"
...
backend_kind = "cli"
command = "opencode"
...
추가 프리셋 — 모두 단발성 인쇄 모드(-p)이며, stdout에 답변이 출력됩니다:
| preset | command | notes |
|---|
omp | omp --mode json {prompt} | pi 포크; pi 형태의 NDJSON, 추론 피드 |
| ... | | |
| CLI는 이미 설치되어 있고 로그인되어 있어야 합니다. aic은 이를 설치하거나 인증하지 않습니다. | | |
백엔드 설계에 대한 내용은 ADR 0010를, backend_kind 디스크리미네이터에 대한 내용은 ADR 0011를 참조하십시오.
설정 필드 (Config fields)
| Field | Purpose | Default |
|---|
backend_kind | "api" 또는 "cli" | "api" |
| ... | | |
기타 명령어 (Other commands)
| Command | Description |
|---|
aic --no-redact | aic와 동일하지만, Redaction Gate(검열 게이트)를 건너뜁니다: 기본적으로 diff에 비밀 형태의 내용(클라우드 키, 토큰, 개인 키 블록 등)을 포함하는 실행(Run)은 어떤 것이든 LLM으로 전송되기 전에 거부되며, 위반 파일과 패턴 유형을 명시합니다. 이 플래그는 해당 실행(Run)에 한해서만 diff를 원본 그대로 전송합니다. (충돌하는 저장소인가요? aic resolve는 자체의 --no-redact 플래그를 사용합니다.) |
| ... | |