Skip to content

Commit a189f6b

Browse files
sangmin7648claude
andcommitted
refactor: convert Korean-specific prompts and docs to language-neutral English
- Rewrite README.md and CLAUDE.md in English - Update singleSystemPrompt and batchSystemPrompt in claude.go to use English categories and language-matched output (title/summary follow input language) - Translate buildPrompt, buildBatchPrompt, writeCategories labels to English - Sanitize Korean category strings (잡담 → chat, 일상 → daily) in sanitizeResult - Add EnsureModelFromURL to pkg/model to fix pre-existing build error in pkg/vision - Update tacit.knowledge and tacit.memorize skill docs to be language-neutral - Fix integration test expectCategory values from Korean to English equivalents Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 3a13670 commit a189f6b

7 files changed

Lines changed: 98 additions & 91 deletions

File tree

CLAUDE.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@ make clean # Clean build artifacts
3434

3535
## Build Verification
3636

37-
- `go build ./...` 로 빌드 검증하지 말 것 `pkg/stt`가 CGo로 whisper.h를 참조하므로 `make build` 전에는 항상 실패한다
38-
- 빌드 검증은 반드시 `make build` 또는 `make e2e-test` 사용
39-
- CGo와 무관한 순수 Go 패키지(예: `./skills/`)`go build ./skills/` 로 개별 확인 가능
37+
- Do NOT verify builds with `go build ./...``pkg/stt` references `whisper.h` via CGo and will always fail before `make build`
38+
- Always use `make build` or `make e2e-test` to verify builds
39+
- Pure Go packages unrelated to CGo (e.g. `./skills/`) can be individually verified with `go build ./skills/`
4040

4141
## Build Principles
4242

43-
- AI agent(Claude Code CLI)를 제외한 모든 의존성(whisper.cpp, ten-vad, miniaudio, AudioToolbox 등)은 바이너리에 정적 링크/번들되어야 한다. 빌드 결과물은 반드시 포터블 바이너리여야 하며, 런타임에 외부 라이브러리 설치를 요구해서는 안 된다.
43+
- All dependencies (whisper.cpp, ten-vad, miniaudio, AudioToolbox, etc.) except the AI agent (Claude Code CLI) must be statically linked/bundled into the binary. The build output must be a portable binary that requires no external library installation at runtime.
4444

4545
## Workflow
4646

47-
- 코드 수정 후 반드시 `make e2e-test`를 실행하여 파이프라인 동작을 확인할 것
47+
- After modifying code, always run `make e2e-test` to verify pipeline behavior
4848

4949
## Code Style
5050

README.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# tacit
22

3-
말한 것들이 AI 지식이 된다. 백그라운드에서 대화를 캡처하고, AI가 꺼내 쓸 수 있도록 자동으로 정리한다.
3+
What you say becomes AI knowledge. Captures conversations in the background, automatically organizes them so your AI can retrieve them.
44

55
## Install
66

@@ -14,24 +14,24 @@ curl -fsSL https://raw.githubusercontent.com/sangmin7648/tacit/main/install.sh |
1414
tacit setup
1515
```
1616

17-
## 사용법
17+
## Usage
1818

19-
### 항상 켜두기
19+
### Keep it running
2020

2121
```bash
22-
tacit listen # 캡처 시작
22+
tacit listen # start capturing
2323
```
2424

25-
켜두면 된다. 말이 감지될 때마다 자동으로 텍스트 변환 → 분류저장한다.
25+
Leave it on. Whenever speech is detected, it automatically transcribes → classifiesstores.
2626

27-
## AI에서 사용하기
27+
## Use with AI
2828

29-
`tacit setup` 이후 AI agent에서 SKILL로 구두 대화를 바로 검색할 수 있다.
29+
After `tacit setup`, you can search your spoken conversations directly from any AI agent using the SKILL:
3030

3131
```
32-
/tacit.knowledge 방금 논의에서 검색 랭킹 관련 논의 결과를 정리해줘
33-
"저번 주 회의에서 논의한 API 설계 찾아줘"
34-
"지난달 아이디어 중 프로젝트 관련된 것 있어?"
32+
/tacit.knowledge summarize the search ranking discussion from earlier
33+
"find the API design we talked about last week"
34+
"any project-related ideas from last month?"
3535
```
3636

3737
## Requirements
@@ -42,18 +42,18 @@ tacit listen # 캡처 시작
4242
---
4343

4444
<details>
45-
<summary>소스 빌드</summary>
45+
<summary>Build from source</summary>
4646

47-
**요구사항:** Go 1.23+, CMake, macOS
47+
**Requirements:** Go 1.23+, CMake, macOS
4848

4949
```bash
5050
git clone --recursive https://github.com/sangmin7648/tacit.git
5151
cd tacit
5252
make build
53-
make install # ~/.local/bin/tacit에 설치
53+
make install # installs to ~/.local/bin/tacit
5454
```
5555

56-
> `~/.local/bin``PATH`에 없다면:
56+
> If `~/.local/bin` is not in your `PATH`:
5757
> ```bash
5858
> export PATH="$HOME/.local/bin:$PATH"
5959
> ```
@@ -63,7 +63,7 @@ make install # ~/.local/bin/tacit에 설치
6363
<details>
6464
<summary>Configuration</summary>
6565
66-
`~/.tacit/config.yaml` (모든 필드 optional):
66+
`~/.tacit/config.yaml` (all fields optional):
6767
6868
```yaml
6969
whisper_model: base # tiny, base, small, medium, large
@@ -93,20 +93,20 @@ graph LR
9393
CLS --> KB[Knowledge Base<br/>~/.tacit/]
9494
```
9595

96-
저장 포맷: YAML frontmatter가 포함된 마크다운 파일
96+
Storage format: Markdown files with YAML frontmatter
9797

9898
```markdown
9999
---
100-
title: "제목"
101-
category: "카테고리/서브카테고리"
100+
title: "Title"
101+
category: "category"
102102
created_at: "2026-03-29T15:30:45+09:00"
103103
---
104104

105-
AI가 생성한 요약
105+
AI-generated summary
106106

107107
---
108108

109-
원본 STT 텍스트
109+
Raw STT transcript
110110
```
111111

112112
</details>

pkg/model/download.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,20 @@ import (
1111
const baseURL = "https://huggingface.co/ggerganov/whisper.cpp/resolve/main"
1212

1313
// EnsureModel checks if the model file exists at modelPath.
14-
// If not, it downloads the model from HuggingFace.
14+
// If not, it downloads the model from HuggingFace (whisper.cpp base URL).
1515
func EnsureModel(modelPath string) error {
16+
modelFile := filepath.Base(modelPath)
17+
return EnsureModelFromURL(modelPath, baseURL+"/"+modelFile)
18+
}
19+
20+
// EnsureModelFromURL checks if the model file exists at modelPath.
21+
// If not, it downloads from the given URL.
22+
func EnsureModelFromURL(modelPath, url string) error {
1623
if _, err := os.Stat(modelPath); err == nil {
1724
return nil // already exists
1825
}
1926

2027
modelFile := filepath.Base(modelPath)
21-
url := baseURL + "/" + modelFile
2228

2329
// Create parent directory
2430
if err := os.MkdirAll(filepath.Dir(modelPath), 0o755); err != nil {

pkg/process/classifier_integration_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,36 @@ var singleTestCases = []classifierTestCase{
2020
name: "일상_점심",
2121
text: "오늘 점심 뭐 먹지? 김치찌개 먹을까 아니면 그냥 편의점 갈까",
2222
expectSkip: false,
23-
expectCategory: "잡담",
23+
expectCategory: "daily",
2424
},
2525
{
2626
name: "개발_goroutine",
2727
text: "Go에서 goroutine leak 방지하려면 context로 cancel 전파해야 해. " +
2828
"defer cancel() 꼭 넣어야 되고 done 채널 닫는 패턴도 같이 써야 안전함",
2929
expectSkip: false,
30-
expectCategory: "개발",
30+
expectCategory: "dev",
3131
},
3232
{
3333
name: "회의_스프린트",
3434
text: "다음 주 스프린트 목표는 결제 모듈 완성이야. " +
3535
"API 설계는 내가 담당하고 프론트엔드 연동은 김대리한테 부탁하기로 했어. " +
3636
"목요일까지 PR 올려야 됨",
3737
expectSkip: false,
38-
expectCategory: "업무",
38+
expectCategory: "work",
3939
},
4040
{
4141
name: "건강_운동",
4242
text: "오늘 헬스장에서 스쿼트 5세트 했는데 허벅지가 터질 것 같아. 내일 못 걸을 듯",
4343
expectSkip: false,
44-
expectCategory: "건강",
44+
expectCategory: "health",
4545
},
4646
{
4747
name: "요리_레시피",
4848
text: "제육볶음 만들 때 돼지고기 앞다리살 써야 맛있어. " +
4949
"고추장이랑 간장 비율이 2대1이고 설탕 약간 넣으면 됨. " +
5050
"마늘은 많이 넣을수록 좋고 참기름은 마지막에",
5151
expectSkip: false,
52-
expectCategory: "생활",
52+
expectCategory: "lifestyle",
5353
},
5454
{
5555
name: "알고리즘_공부",
@@ -58,7 +58,7 @@ var singleTestCases = []classifierTestCase{
5858
"BFS랑 다르게 가중치 있는 그래프에서 최단경로 찾을 때 씀. " +
5959
"음수 가중치는 벨만-포드 써야 하고, 다익스트라는 음수 있으면 틀림",
6060
expectSkip: false,
61-
expectCategory: "학습",
61+
expectCategory: "learning",
6262
},
6363
{
6464
name: "감정_일기",

0 commit comments

Comments
 (0)