axmap-cli 1.2.5 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/ax-start.md +2 -1
- package/CLAUDE.md +20 -73
- package/README.ko.md +124 -0
- package/README.md +81 -174
- package/app/lib/ssot.mjs +1 -1
- package/bin/axmap.mjs +61 -32
- package/governance/GOVERNANCE.md +7 -668
- package/governance/policy.example.json +31 -0
- package/mcp/README.md +13 -48
- package/mcp/SETUP-FOR-AI.md +14 -175
- package/mcp/server.mjs +123 -100
- package/package.json +6 -2
- package/src/overlap.mjs +1 -1
- package/src/repolock.mjs +31 -0
- package/src/repotarget.mjs +3 -0
- package/tools/smoke.mjs +9 -1
|
@@ -11,5 +11,6 @@ description: axMap — 이 저장소에서 일을 시작한다 (브리핑 →
|
|
|
11
11
|
그 일에 필요한 경로를 **좁게** 골라 `ax_claim` 한다.
|
|
12
12
|
`intent` 에는 사람이 읽을 한 문장을 적는다 — 팀원이 화면에서 그걸 본다.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
장부는 조회·선점 때 자동으로 준비한다. 별도 `ax_init` 호출은 필요 없다.
|
|
15
|
+
작업 repo가 다르거나 여러 repo가 열려 있다면 도구의 `cwd`에 현재 작업 폴더 절대 경로를 전달한다.
|
|
15
16
|
claim 이 거부되면(겹침) 재시도하지 말고 겹치지 않는 다른 작업을 제안한다.
|
package/CLAUDE.md
CHANGED
|
@@ -1,83 +1,30 @@
|
|
|
1
|
-
# axMap 작업 규칙
|
|
1
|
+
# axMap 작업 규칙
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
규칙 본문은 **[`rule/`](rule/) 폴더**에 갈래별로 나뉘어 있다. **필요할 때 그 파일을 연다.**
|
|
3
|
+
axMap은 여러 AI 에이전트의 작업 경로를 선점하고 충돌을 예방하는 CLI 도구다. 현재 개발 범위는 CLI와 MCP를 통한 협업 기능이다. 코드 분석·지도·코퍼스 기준 도구로의 확장은 보류한다. 범위 결정은 `docs/DECISIONS.md`의 D21을 따른다. 산문은 `axMap`, 식별자와 명령은 `axmap`, npm 패키지는 `axmap-cli`를 쓴다.
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
> Claude Code 는 **세션을 켤 때마다 그걸 통째로 읽는다.** 한 번도 안 쓰는 규칙까지
|
|
8
|
-
> 매번 값을 치렀다. 지금은 이 색인만 항상 읽히고, 본문은 **찾아갈 때만** 읽는다.
|
|
9
|
-
> 내용은 지우지 않았다 — 자리만 옮겼다.
|
|
5
|
+
개발 기준은 `main`이다. 이 저장소의 소스 확인에는 `node bin/axmap.mjs`를 사용한다. PATH의 `axmap`은 npm 설치본일 수 있다.
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
기준으로 `CLAUDE.md` 를 읽는다. 팀 저장소 폴더에서 켜고 axMap 파일만 고치면, 읽히는 것은
|
|
13
|
-
팀 규칙이지 이 문서가 아니다.
|
|
7
|
+
## 작업 절차
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
axMap 은 **AI Experience(ax) 의 지도**다 — 에이전트가 코드베이스에서 길을 찾고 서로를
|
|
21
|
-
피해 가는 경험을 만든다. 팀에서는 여행 서비스를 만드는 **도구**로 쓰인다.
|
|
22
|
-
|
|
23
|
-
> **산문에서는 `axMap`, 식별자·명령·경로·패키지 이름에서는 `axmap`.**
|
|
24
|
-
> 다만 **MCP 도구 이름만 `ax_` 접두사**를 쓴다 (`ax_claim`, `ax_status` …).
|
|
25
|
-
> 환경변수 접두사는 `AXMAP_`, 장부 브랜치는 `axmap/claims` 다.
|
|
26
|
-
|
|
27
|
-
> 🔴 **팀 규칙은 여기 없다.** axMap 은 독립 저장소이고 팀은 npm 꾸러미 `axmap-cli` 로
|
|
28
|
-
> 받아 쓴다. 팀 규칙은 그 저장소의 `CONTRIBUTING.md` 에 있다 —
|
|
29
|
-
> `https://lab.ssafy.com/s15-bigdata-dist-sub1/S15P21E201`.
|
|
30
|
-
> 상대경로(`../CLAUDE.md`)로 걸지 않는다. 폴더가 옮겨지면 조용히 거짓말이 된다.
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## 시작하기 전에 세 줄
|
|
9
|
+
1. `docs/DECISIONS.md`, `docs/THREADS.md`, `docs/SPEC.md`, `docs/INVARIANTS.md`에서 관련 결정과 규격을 읽는다.
|
|
10
|
+
2. 세션마다 고유한 `AXMAP_AGENT`와 `AXMAP_SESSION`을 정한다. 변경 전에 `node bin/axmap.mjs claim <경로> --task <작업> --intent "목적"`으로 선점한다.
|
|
11
|
+
3. 선점이 겹치면 다른 영역으로 옮긴다. 필요한 경로만 잡고, 끝나면 `node bin/axmap.mjs release`로 반납한다.
|
|
12
|
+
4. 선점 없는 커밋을 만들거나 `git commit --no-verify`로 훅을 우회하지 않는다. push 대상 원격과 브랜치를 확인한다.
|
|
35
13
|
|
|
36
|
-
|
|
37
|
-
|---|---|
|
|
38
|
-
| **개발선** | `team-sync` 다. `main` 이 아니다 → [rule/01](rule/01-이-저장소의-함정.md) |
|
|
39
|
-
| **고치기 전에** | `node bin/axmap.mjs claim <경로> --task … --intent …` → [rule/02](rule/02-선점-작업-반납.md) |
|
|
40
|
-
| **고친 코드를 돌리려면** | `node bin/axmap.mjs …`. 그냥 `axmap` 은 **다른 판**이 돈다 → [rule/01](rule/01-이-저장소의-함정.md) |
|
|
41
|
-
| **싸게 물어볼 일** | `agy --model gemini-3.8-flash-low -p='…'`. 🔴 `-p=` 는 **등호로 붙여** 쓴다 → [rule/08](rule/08-agy-외부-모델.md) |
|
|
14
|
+
## 구현 기준
|
|
42
15
|
|
|
43
|
-
|
|
16
|
+
루트 CLI는 Node 20+와 git만으로 동작한다. 새 의존성은 추가 전에 사용자와 논의한다. 데스크톱 셸의 기존 의존성은 `desktop/package.json`을 따른다.
|
|
44
17
|
|
|
45
|
-
|
|
18
|
+
없는 데이터와 읽지 못한 데이터를 구별한다. 판정을 못 하면 통과시키지 않는다. 주석에는 구현 이유를 쓰고, 수치에는 측정 조건과 근거를 붙인다. 테스트 개수나 미측정 성능을 문서에 쓰지 않는다.
|
|
46
19
|
|
|
47
|
-
|
|
20
|
+
## 검증
|
|
48
21
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
| 실측 안 한 숫자 적기 | 확실하지 않으면 **"확인 못 함"** 이라고 쓴다 |
|
|
57
|
-
| 낡은 실측 지우기 | 정정한 날짜와 함께 **둘 다** 남긴다 |
|
|
58
|
-
| 선점이 방금 풀린 자리에 바로 들어가기 | 선점은 "지금" 만 막는다. 남은 결과물은 안 막는다 |
|
|
59
|
-
| 새 의존성 추가 | 추가하기 전에 **사람에게 묻는다** |
|
|
60
|
-
| 세기·고르기를 모델에게 시키기 | 스크립트가 토큰 0으로 **더 정확히** 한다 → [rule/08](rule/08-agy-외부-모델.md) |
|
|
61
|
-
| `setx` 로 PATH 고치기 | 1024자에서 **자른다.** 잘린 줄은 경고 없이 사라진다 → [rule/08](rule/08-agy-외부-모델.md) |
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## 규칙 본문 — 이럴 때 이 파일을 연다
|
|
66
|
-
|
|
67
|
-
문서 안에서 **"2절"** 이라고 하면 **`rule/02-…`** 를 말한다. 번호는 그대로 남겼다.
|
|
68
|
-
|
|
69
|
-
| 파일 | 언제 여나 |
|
|
70
|
-
|---|---|
|
|
71
|
-
| [00 — 백그라운드 에이전트](rule/00-백그라운드-에이전트.md) | 일을 대화에서 직접 할지 넘길지 가를 때. 프롬프트에 무엇을 박아야 하나 |
|
|
72
|
-
| [01 — 이 저장소의 함정](rule/01-이-저장소의-함정.md) | git 이 이상하게 굴 때. remote 이름·개발선·무관한 역사·`partOf()`·어느 `axmap` 이 도나 |
|
|
73
|
-
| [02 — 선점 → 작업 → 반납](rule/02-선점-작업-반납.md) | 파일을 고치기 전. 거부당했을 때. 커밋 훅이 막을 때. 쪽지 주고받기 |
|
|
74
|
-
| [03 — 검증](rule/03-검증.md) | 끝내기 전. 무엇을 돌려야 끝난 것인가. 화면 코드를 건드렸을 때 |
|
|
75
|
-
| [04 — 코드 규칙](rule/04-코드-규칙.md) | 코드를 쓸 때. 의존성·순수 로직·fail-closed·SPEC·불변식·버전 |
|
|
76
|
-
| [05 — 코드를 쓰기 전에](rule/05-코드를-쓰기-전에.md) | 무엇을 만들지 아직 안 정했을 때. 단순함·외과적 변경·선택지로 확인받기 |
|
|
77
|
-
| [06 — 답변과 문서](rule/06-답변과-문서.md) | 사람에게 답할 때. 터미널에 전부·두 가지까지·기호로만 부르지 않기·용어 풀기 |
|
|
78
|
-
| [07 — NotebookLM 자료 폴더](rule/07-notebooklm-자료폴더.md) | *"LM 에 넣게 자료 만들어줘"* 라는 말을 들었을 때 |
|
|
79
|
-
| [08 — `agy` 로 바깥 모델 부르기](rule/08-agy-외부-모델.md) | 토큰을 아끼고 싶을 때. **부르기 전에 "모델이 정말 필요한가" 부터** |
|
|
80
|
-
| [09 — 거버넌스와 권한](rule/09-거버넌스와-권한.md) | 머지 권한·봇·장부 브랜치를 건드릴 때. **왜 사람이 아니라 봇이 누르는가** |
|
|
22
|
+
```bash
|
|
23
|
+
npm test
|
|
24
|
+
npm run demo
|
|
25
|
+
npm run demo:compare
|
|
26
|
+
npm run demo:chaos
|
|
27
|
+
npm run smoke
|
|
28
|
+
```
|
|
81
29
|
|
|
82
|
-
|
|
83
|
-
두 벌이 되는 순간 어느 쪽이 진짜인지 아무도 모르게 된다.
|
|
30
|
+
프로토콜 변경은 회귀 테스트와 경합 데모로 검증하고, 화면 변경은 브라우저 스모크를 돌린다. 데스크톱 변경은 설치된 Electron으로 `npm run desktop:smoke`를 추가한다. 성공 여부는 종료 코드로 판단한다. 필요한 실행 환경이 없으면 검증 제한을 보고한다.
|
package/README.ko.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# axMap
|
|
2
|
+
|
|
3
|
+
[](https://github.com/rl2aderjoon/axmap/blob/main/README.md) [](https://github.com/rl2aderjoon/axmap/blob/main/README.ko.md)
|
|
4
|
+
|
|
5
|
+
**여러 AI 에이전트가 같은 git 저장소에서 작업할 때, 수정할 경로를 먼저 선점해 충돌을 예방하는 CLI 도구.**
|
|
6
|
+
|
|
7
|
+
누가 어디를 고치는지 장부에 기록하고, 겹치는 경로의 선점을 거부한다.
|
|
8
|
+
커밋 훅으로 선점 범위를 확인하고, 작업이 끝나면 반납한다.
|
|
9
|
+
AI 도구에서는 MCP로 같은 기능을 사용할 수 있다.
|
|
10
|
+
|
|
11
|
+
Node 20+와 git이 필요하다. CLI의 런타임 의존성은 없다.
|
|
12
|
+
npm 패키지 이름은 `axmap-cli`, 실행 명령은 `axmap`이다.
|
|
13
|
+
|
|
14
|
+
## 설치
|
|
15
|
+
|
|
16
|
+
사용할 git 저장소에서 실행한다.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g axmap-cli@latest
|
|
20
|
+
cd <프로젝트-저장소>
|
|
21
|
+
axmap setup
|
|
22
|
+
axmap doctor
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`setup`은 저장소의 선점 장부와 커밋 훅을 준비하고, AI 도구의 사용자 설정에 MCP를 등록한다.
|
|
26
|
+
MCP를 사용하려면 설정 후 AI 도구를 다시 시작한다.
|
|
27
|
+
함께 작업하는 사람과 에이전트는 같은 원격 장부를 사용해야 서로의 선점을 볼 수 있다.
|
|
28
|
+
|
|
29
|
+
자세한 설치·설정은 [docs/INSTALL.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INSTALL.md)를 참고한다.
|
|
30
|
+
|
|
31
|
+
## 1.3.0: repo를 옮겨도 init 없이 사용
|
|
32
|
+
|
|
33
|
+
axMap을 한 번 설정하면 다른 Git 저장소에서도 Codex 등 AI CLI를 열어 바로 사용할 수 있다. 세션의 작업 repo를 자동으로 선택하고, 첫 조회·선점 때 장부를 준비하므로 매번 `axmap init`을 실행하지 않아도 된다.
|
|
34
|
+
|
|
35
|
+
기존 원격 장부가 있으면 이어 쓰고, 같은 repo의 worktree는 장부 하나를 공유한다. 서로 다른 repo의 동시 세션은 독립적으로 동작한다. 원격 접근 실패를 장부 없음으로 판단해 별도 장부를 만들지 않는다.
|
|
36
|
+
|
|
37
|
+
MCP는 클라이언트가 알려주는 작업 폴더(roots)를 따라간다. 미지원 클라이언트는 시작 폴더를 사용하며, 도중에 폴더를 바꾸면 도구의 `cwd`에 작업 폴더 절대 경로를 전달한다. 커밋 훅을 적용할 새 repo에서는 `axmap hook install`을 실행한다.
|
|
38
|
+
|
|
39
|
+
기존 설치를 업그레이드할 때는 작업 repo에서 아래 명령을 한 번 실행하고 AI CLI를 다시 시작한다.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install -g axmap-cli@latest
|
|
43
|
+
axmap setup
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`setup`은 MCP와 훅이 사용하는 설치 사본 및 등록을 갱신한다. 이후 repo를 옮길 때는 setup이나 init을 반복하지 않는다.
|
|
47
|
+
|
|
48
|
+
## 작업 흐름
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 지금 누가 무엇을 잡고 있는지 확인
|
|
52
|
+
axmap status
|
|
53
|
+
|
|
54
|
+
# 수정 전에 경로와 목적을 선언
|
|
55
|
+
axmap claim src/auth --agent my-agent --session my-session --task T-12 --intent "토큰 만료 처리"
|
|
56
|
+
|
|
57
|
+
# 파일을 수정한 뒤 커밋할 변경을 준비하고 선점 범위를 확인
|
|
58
|
+
git add src/auth
|
|
59
|
+
axmap verify --agent my-agent --session my-session
|
|
60
|
+
|
|
61
|
+
# 작업이 끝나면 반납
|
|
62
|
+
axmap release --agent my-agent --session my-session
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
에이전트 이름과 세션은 각 작업 세션마다 고유하게 정하고, 선점부터 반납까지 같은 값을 쓴다.
|
|
66
|
+
커밋 훅에서도 같은 식별자를 사용하도록 `AXMAP_AGENT`와 `AXMAP_SESSION` 환경변수를 설정한다.
|
|
67
|
+
선점이 거절되면 메시지의 점유자·작업·남은 시간을 확인하고 겹치지 않는 영역을 선택한다.
|
|
68
|
+
필요한 경로만 잡고, 작업이 길어지면 `axmap renew`에 같은 agent와 session을 지정해 갱신한다.
|
|
69
|
+
|
|
70
|
+
`git worktree`로 나눈 작업 폴더도 같은 장부를 사용한다.
|
|
71
|
+
`release`는 현재 세션이 잡은 경로를 반납한다.
|
|
72
|
+
|
|
73
|
+
## 동작 방식
|
|
74
|
+
|
|
75
|
+
git은 변경을 합칠 때 텍스트 충돌을 발견한다.
|
|
76
|
+
axMap은 수정 전에 경로를 선점해, 여러 에이전트가 같은 영역을 동시에 고치는 상황을 먼저 막는다.
|
|
77
|
+
|
|
78
|
+
선점 장부는 전용 git 브랜치에 저장한다. 원격의 최신 장부를 확인하고,
|
|
79
|
+
git ref의 원자적 갱신과 경로 겹침 판정으로 선점한다.
|
|
80
|
+
커밋 훅은 실제 수정 경로와 선점 범위를 대조한다.
|
|
81
|
+
`axmap audit`은 장부 이력을 재생해 규칙 위반을 검사한다.
|
|
82
|
+
|
|
83
|
+
상태를 읽지 못하면 그 이유를 알리고, 판정할 수 없는 상태를 성공으로 처리하지 않는다.
|
|
84
|
+
프로토콜은 [docs/SPEC.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/SPEC.md), 지켜야 할 성질은 [docs/INVARIANTS.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INVARIANTS.md)에 있다.
|
|
85
|
+
|
|
86
|
+
## AI 도구에서 사용
|
|
87
|
+
|
|
88
|
+
MCP를 연결하면 `ax_claim`, `ax_status`, `ax_release` 등의 도구를 AI가 호출할 수 있다.
|
|
89
|
+
에이전트에게 다음 작업 규칙을 전달한다.
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
파일을 수정하기 전에 ax_claim으로 경로와 목적을 선언한다.
|
|
93
|
+
선점이 거절되면 점유자를 확인하고 겹치지 않는 다른 작업을 선택한다.
|
|
94
|
+
작업이 끝나면 ax_release로 반납한다.
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
연결 방법과 도구 목록은 [mcp/README.md](https://github.com/rl2aderjoon/axmap/blob/main/mcp/README.md)를 참고한다.
|
|
98
|
+
|
|
99
|
+
## 개발과 검증
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git clone https://github.com/rl2aderjoon/axmap.git
|
|
103
|
+
cd axmap
|
|
104
|
+
node bin/axmap.mjs --version
|
|
105
|
+
npm test
|
|
106
|
+
npm run demo
|
|
107
|
+
npm run demo:compare
|
|
108
|
+
npm run demo:chaos
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
루트 CLI를 실행하기 위한 `npm install`은 필요 없다. 데모는 bash 환경에서 실행한다.
|
|
112
|
+
소스 확인에는 `node bin/axmap.mjs`를 사용한다.
|
|
113
|
+
|
|
114
|
+
| 문서 | 내용 |
|
|
115
|
+
|---|---|
|
|
116
|
+
| [CLAUDE.md](https://github.com/rl2aderjoon/axmap/blob/main/CLAUDE.md) | 소스 작업 규칙 |
|
|
117
|
+
| [docs/INSTALL.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INSTALL.md) | 설치와 사용 |
|
|
118
|
+
| [docs/SPEC.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/SPEC.md) | 명령과 선점 프로토콜 |
|
|
119
|
+
| [docs/INVARIANTS.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INVARIANTS.md) | 불변식과 검증 기준 |
|
|
120
|
+
| [docs/DECISIONS.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/DECISIONS.md) | 제품 범위와 설계 결정 |
|
|
121
|
+
|
|
122
|
+
## 라이선스
|
|
123
|
+
|
|
124
|
+
[MIT](https://github.com/rl2aderjoon/axmap/blob/main/LICENSE)
|
package/README.md
CHANGED
|
@@ -1,219 +1,126 @@
|
|
|
1
1
|
# axMap
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
사람이 그 작업을 이해하고 통제할 수 있게 하는 도구.**
|
|
3
|
+
[](https://github.com/rl2aderjoon/axmap/blob/main/README.md) [](https://github.com/rl2aderjoon/axmap/blob/main/README.ko.md)
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
서로를 피해 가는 경험을 만들고, 동시에 개발 환경의 **AI Transformation**,
|
|
8
|
-
즉 사람 혼자 쓰던 저장소를 여러 에이전트가 함께 쓰는 곳으로 바꾸는 일을 함의한다.
|
|
5
|
+
**A CLI tool that helps AI agents avoid conflicting edits by claiming paths before working in the same Git repository.**
|
|
9
6
|
|
|
10
|
-
|
|
7
|
+
axMap records who is editing which paths and rejects overlapping claims.
|
|
8
|
+
Commit hooks check changes against claimed paths, and agents release their claims when work is done.
|
|
9
|
+
AI tools can use the same workflow through MCP.
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
Requires Node.js 20+ and Git. The CLI has no npm runtime dependencies.
|
|
12
|
+
The npm package is `axmap-cli`; the command is `axmap`.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
## Installation
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
AI 에게 코드를 시키면 두 가지가 동시에 어려워진다.
|
|
19
|
-
|
|
20
|
-
| | 공포 | 언제 |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| **F1** | 내가 이해 못 하는 코드가 계속 쌓인다 | 작업 **전** |
|
|
23
|
-
| **F2** | AI 가 뭘 망가뜨렸는지 모른다 | 작업 **후** |
|
|
24
|
-
| **F3** | 내가 잘 하고 있는지 모른다 | 계속 |
|
|
25
|
-
|
|
26
|
-
axMap 은 셋에 각각 답한다 — 처음 보는 코드베이스를 따라갈 **순서**,
|
|
27
|
-
변경이 어디까지 번졌는지 보는 **PR 화면**, 그리고 수천 개 저장소에서 학습한 **기준**.
|
|
28
|
-
|
|
29
|
-
그리고 그 밑에, 여러 에이전트가 같은 코드를 동시에 고치지 않게 하는
|
|
30
|
-
**git 위의 선점 프로토콜**이 있다.
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## 5분 안에 써보기
|
|
16
|
+
Run these commands in the Git repository you want to work on.
|
|
35
17
|
|
|
36
18
|
```bash
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
npm install -g axmap-cli@latest
|
|
20
|
+
cd <your-project-repository>
|
|
21
|
+
axmap setup
|
|
22
|
+
axmap doctor
|
|
41
23
|
```
|
|
42
24
|
|
|
43
|
-
`
|
|
25
|
+
`setup` prepares the repository's claim ledger and commit hooks, and registers MCP in your AI tool's user settings.
|
|
26
|
+
Restart your AI tool after setup to use MCP.
|
|
27
|
+
People and agents working together must share the same remote ledger to see each other's claims.
|
|
44
28
|
|
|
45
|
-
|
|
46
|
-
① 이 저장소는 무엇을 하는 물건인가
|
|
47
|
-
② 실행은 어디서 시작하나
|
|
48
|
-
③ 그 다음에 무엇이 불리나
|
|
49
|
-
④ 어디가 활발하고 위험한가
|
|
50
|
-
⑤ 이제 당신 차례
|
|
51
|
-
```
|
|
29
|
+
See [docs/INSTALL.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INSTALL.md) for installation and configuration details (Korean).
|
|
52
30
|
|
|
53
|
-
|
|
31
|
+
## Automatic repository setup in 1.3.0
|
|
54
32
|
|
|
55
|
-
|
|
33
|
+
Set up axMap once, then open Codex or another AI CLI in any Git repository. axMap selects that session's repository and prepares its ledger on the first status or claim request. There is no per-repository `axmap init` step.
|
|
56
34
|
|
|
57
|
-
|
|
35
|
+
Existing remote ledgers are reused. Linked worktrees share one ledger, and simultaneous sessions in different repositories keep independent targets. Remote access failures stop the request instead of creating a separate ledger.
|
|
58
36
|
|
|
59
|
-
|
|
37
|
+
MCP follows workspace roots supplied by the client. When roots are unsupported, it uses the launch directory; pass the absolute working directory through the tool's `cwd` argument for later directory changes. Run `axmap hook install` in each repository where you want commit enforcement.
|
|
60
38
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
정적 `import` 그래프와 **git 공변경**(함께 바뀐 이력)을 겹쳐 본다.
|
|
64
|
-
겹치지 않는 부분이 사고가 나는 자리다.
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
둘 다 import 있고 함께 바뀜 예상대로
|
|
68
|
-
숨은 결합 import 없는데 함께 바뀜 🔴 코드를 읽어서는 못 찾는다
|
|
69
|
-
안정된 경계 import 하지만 따로 바뀜
|
|
70
|
-
판정 보류 히스토리가 부족하다
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
**엣지마다 출처가 붙는다.** 어떻게 알아냈는지 모르는 선은 긋지 않는다.
|
|
74
|
-
|
|
75
|
-
### 2. 장부 — 지금 누가 어디를 잡고 있나
|
|
39
|
+
To upgrade an existing installation, run this once from a working repository, then restart your AI CLI:
|
|
76
40
|
|
|
77
41
|
```bash
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
node bin/axmap.mjs claim src/auth --task T-12 --intent "토큰 만료 처리"
|
|
82
|
-
node bin/axmap.mjs status # 누가 무엇을
|
|
83
|
-
node bin/axmap.mjs release # 끝나면 즉시
|
|
42
|
+
npm install -g axmap-cli@latest
|
|
43
|
+
axmap setup
|
|
84
44
|
```
|
|
85
45
|
|
|
86
|
-
|
|
87
|
-
이름을 안 주면 `git config user.name` 으로 떨어져 장부에서 한 사람이 된다.
|
|
88
|
-
그러면 서로를 하나도 못 막는다. 이름이 같아도 **세션마다 레코드가 따로 적히므로**
|
|
89
|
-
서로 덮지는 않고, `release` 는 그 세션이 잡은 것만 푼다 (다른 창이 두고 간 것까지
|
|
90
|
-
풀려면 `release --all-sessions`) — 자세한 것은 [docs/SPEC.md](docs/SPEC.md) 3절.
|
|
91
|
-
|
|
92
|
-
`git worktree add` 로 만든 폴더 안에서도 그대로 쓴다. 장부는 메인 체크아웃에
|
|
93
|
-
하나뿐이고, 링크된 worktree 는 그것을 본다. 거기에 장부를 또 만들지 않는다.
|
|
46
|
+
`setup` refreshes the installed MCP and hook copy as well as its registration. Subsequent repository changes do not require another setup or init.
|
|
94
47
|
|
|
95
|
-
|
|
96
|
-
같은 기능을 앞에서부터·뒤에서부터 만드는 두 사람이다 — 경로가 안 겹쳐도 어긋난다.
|
|
97
|
-
장부는 그것을 코드를 쓰기 **전에** 터뜨린다.
|
|
48
|
+
## Workflow
|
|
98
49
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## 🔴 이 저장소가 지키는 규칙
|
|
106
|
-
|
|
107
|
-
이게 이 프로젝트의 성격을 가장 잘 말한다.
|
|
108
|
-
|
|
109
|
-
### 없는 것과 못 읽은 것을 같은 값으로 말하지 않는다
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
claims: [] ← "아무도 안 잡고 있다" 로 읽힌다
|
|
113
|
-
claims: null ← "모른다" 다
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
맥락 없는 신입 에이전트에게 도구만 주고 저장소를 이해시키는 실험을 반복하는데,
|
|
117
|
-
**발견된 버그가 거의 전부 이 한 가지 모양이었다.** 코드는 대개 맞았고
|
|
118
|
-
*말하지 않은 것*이 문제였다. 한 신입은 `[]` 를 읽고 "부딪힐 사람 없음" 이라고
|
|
119
|
-
확신 있게 틀렸다.
|
|
120
|
-
|
|
121
|
-
### 애매하면 거부한다 (fail-closed)
|
|
50
|
+
```bash
|
|
51
|
+
# Check who has claimed which paths
|
|
52
|
+
axmap status
|
|
122
53
|
|
|
123
|
-
|
|
124
|
-
|
|
54
|
+
# Declare your paths and purpose before editing
|
|
55
|
+
axmap claim src/auth --agent my-agent --session my-session --task T-12 --intent "Handle token expiration"
|
|
125
56
|
|
|
126
|
-
|
|
57
|
+
# After editing, stage your changes and check their claimed scope
|
|
58
|
+
git add src/auth
|
|
59
|
+
axmap verify --agent my-agent --session my-session
|
|
127
60
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
✅ 커밋 1,500~6,000 · Python 저장소 34개에서 관찰 (스냅샷 v418)
|
|
61
|
+
# Release your claims when work is done
|
|
62
|
+
axmap release --agent my-agent --session my-session
|
|
131
63
|
```
|
|
132
64
|
|
|
133
|
-
|
|
65
|
+
Use a unique agent name and session for each work session, and keep them consistent from claim to release.
|
|
66
|
+
Set the `AXMAP_AGENT` and `AXMAP_SESSION` environment variables so commit hooks use the same identity.
|
|
67
|
+
If a claim is rejected, check its owner, purpose, and remaining time, then choose a different area.
|
|
68
|
+
Claim only the paths you need. For longer tasks, run `axmap renew` with the same agent and session.
|
|
134
69
|
|
|
135
|
-
|
|
70
|
+
Work folders created with `git worktree` share the same ledger.
|
|
71
|
+
`release` releases paths claimed by the current session.
|
|
136
72
|
|
|
137
|
-
|
|
138
|
-
실제로 무엇이 깨졌는지**를 적고 있다.
|
|
73
|
+
## How it works
|
|
139
74
|
|
|
140
|
-
|
|
75
|
+
Git detects text conflicts when changes are merged.
|
|
76
|
+
axMap claims paths before edits to prevent agents from working on the same area at the same time.
|
|
141
77
|
|
|
142
|
-
|
|
78
|
+
The claim ledger lives on a dedicated Git branch. axMap checks the latest remote ledger,
|
|
79
|
+
then uses atomic Git ref updates and path overlap checks to acquire claims.
|
|
80
|
+
Commit hooks compare staged changes with claimed paths.
|
|
81
|
+
`axmap audit` replays the ledger history to check for rule violations.
|
|
143
82
|
|
|
144
|
-
|
|
145
|
-
|
|
83
|
+
axMap reports unreadable state and refuses operations it cannot safely evaluate.
|
|
84
|
+
The protocol is documented in [docs/SPEC.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/SPEC.md), and its invariants in [docs/INVARIANTS.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INVARIANTS.md) (Korean).
|
|
146
85
|
|
|
147
|
-
|
|
148
|
-
저장소 7,107개로 실제로 확인했다 —
|
|
149
|
-
|
|
150
|
-
| 별 | 재수정률 |
|
|
151
|
-
|---|---|
|
|
152
|
-
| 0~2,000 | 0.081 |
|
|
153
|
-
| 2,000~6,000 | 0.150 |
|
|
154
|
-
| 6,000~20,000 | 0.103 |
|
|
155
|
-
| 20,000~ | 0.149 |
|
|
86
|
+
## Using AI tools
|
|
156
87
|
|
|
157
|
-
|
|
158
|
-
|
|
88
|
+
With MCP connected, AI agents can call tools such as `ax_claim`, `ax_status`, and `ax_release`.
|
|
89
|
+
Give your agents these working rules.
|
|
159
90
|
|
|
160
|
-
|
|
91
|
+
```text
|
|
92
|
+
Before editing files, declare the paths and purpose with ax_claim.
|
|
93
|
+
If a claim is rejected, check its owner and choose another task with no overlapping paths.
|
|
94
|
+
Release your claims with ax_release when work is done.
|
|
95
|
+
```
|
|
161
96
|
|
|
162
|
-
|
|
97
|
+
See [mcp/README.md](https://github.com/rl2aderjoon/axmap/blob/main/mcp/README.md) for connection instructions and the tool list (Korean).
|
|
163
98
|
|
|
164
|
-
##
|
|
99
|
+
## Development and verification
|
|
165
100
|
|
|
166
101
|
```bash
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
npm
|
|
171
|
-
npm run
|
|
102
|
+
git clone https://github.com/rl2aderjoon/axmap.git
|
|
103
|
+
cd axmap
|
|
104
|
+
node bin/axmap.mjs --version
|
|
105
|
+
npm test
|
|
106
|
+
npm run demo
|
|
107
|
+
npm run demo:compare
|
|
108
|
+
npm run demo:chaos
|
|
172
109
|
```
|
|
173
110
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
**되는 길만 보면 안 되는 길은 영원히 안 보인다.**
|
|
177
|
-
|
|
178
|
-
---
|
|
111
|
+
The root CLI runs without `npm install`. The demos require Bash.
|
|
112
|
+
Use `node bin/axmap.mjs` to run the source version.
|
|
179
113
|
|
|
180
|
-
|
|
114
|
+
The following supporting documents are currently in Korean.
|
|
181
115
|
|
|
182
|
-
| | |
|
|
116
|
+
| Document | Contents |
|
|
183
117
|
|---|---|
|
|
184
|
-
| [CLAUDE.md](CLAUDE.md) |
|
|
185
|
-
| [docs/INSTALL.md](docs/INSTALL.md) |
|
|
186
|
-
| [docs/
|
|
187
|
-
| [docs/
|
|
188
|
-
| [docs/
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
---
|
|
194
|
-
|
|
195
|
-
## 아직 안 된 것 (숨기지 않는다)
|
|
196
|
-
|
|
197
|
-
- **시각화 형식이 미정이다.** 두 번의 벤치마크가 "지금 그래프는 값을 못 한다" 로
|
|
198
|
-
나왔다 — 신입들이 그림이 아니라 옆에 적힌 글을 읽고 답했다. 2차원 트리·활동 지도
|
|
199
|
-
같은 후보를 같은 방식으로 재서 정할 것이다.
|
|
200
|
-
- **파서가 14개 언어를 읽는다** — 5개에서 늘렸다. 어느 언어를 먼저 할지는
|
|
201
|
-
코퍼스가 정했다(커버리지 4~12% 인 것부터). 마지막이 swift 였고, 그것이
|
|
202
|
-
새 구멍을 하나 드러냈다 — **모듈이 상한보다 크면 선을 안 그린다.**
|
|
203
|
-
안 그리는 것은 맞지만 안 그렸다고 **말하지 않으면** 화면이 "결합 없음" 으로
|
|
204
|
-
읽힌다. 지금은 말한다. 같은 구멍이 다른 언어에도 있는지는 아직 안 봤다.
|
|
205
|
-
- **기준을 떼어놓고 검증(held-out)** 한 적이 없다. 그게 있어야 "관찰" 이
|
|
206
|
-
"검증된 지침" 이 된다.
|
|
207
|
-
- **상관이지 인과가 아니다.** *"긴 파일이 버그를 만든다"* 가 아니라
|
|
208
|
-
*"긴 파일이 더 자주 고쳐졌다"* 다.
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## 라이선스
|
|
213
|
-
|
|
214
|
-
MIT. 마음대로 쓰고 고치고 팔아도 된다 — 저작권 표시만 남기면 된다.
|
|
215
|
-
[LICENSE](LICENSE)
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
<sub>SSAFY 프로젝트로 시작했다. 한국어로 쓰고 한국어로 생각한다.</sub>
|
|
118
|
+
| [CLAUDE.md](https://github.com/rl2aderjoon/axmap/blob/main/CLAUDE.md) | Rules for working on the source |
|
|
119
|
+
| [docs/INSTALL.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INSTALL.md) | Installation and usage |
|
|
120
|
+
| [docs/SPEC.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/SPEC.md) | Commands and the claim protocol |
|
|
121
|
+
| [docs/INVARIANTS.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/INVARIANTS.md) | Invariants and verification criteria |
|
|
122
|
+
| [docs/DECISIONS.md](https://github.com/rl2aderjoon/axmap/blob/main/docs/DECISIONS.md) | Product scope and design decisions |
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
[MIT](https://github.com/rl2aderjoon/axmap/blob/main/LICENSE)
|
package/app/lib/ssot.mjs
CHANGED
|
@@ -178,7 +178,7 @@ const LANG_BY_EXT = {
|
|
|
178
178
|
// 받아오기 — 여기서부터는 부수효과다
|
|
179
179
|
// ---------------------------------------------------------------------------
|
|
180
180
|
|
|
181
|
-
export const SSOT_URL = process.env.AXMAP_SSOT_URL ?? '
|
|
181
|
+
export const SSOT_URL = process.env.AXMAP_SSOT_URL ?? 'http://127.0.0.1:7902/baseline'
|
|
182
182
|
|
|
183
183
|
/** 저장소를 더럽히지 않게 OS 임시 디렉터리에 둔다. 지워져도 다시 받으면 그만이다. */
|
|
184
184
|
export const CACHE_PATH = path.join(os.tmpdir(), 'axmap-ssot-baseline.json')
|