axmap-cli 1.0.3 → 1.1.1

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.
@@ -0,0 +1,32 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(sed -i 's|/\\\\*\\\\* 궤도 모드에서 허용하는 yaw 한계 \\(약 35°\\). cos 이 0.82 아래로 내려가지 않는다. \\\\*/\\\\nconst YAW_LIMIT = 0.62|X|' app/web/graph.js)",
5
+ "Bash(sed -i 's|const YAW_LIMIT = 0.62|const TILT_LIMIT = 0.62|; s|허용하는 yaw 한계|허용하는 기울기 한계 \\(yaw · pitch 공통\\)|' app/web/graph.js)",
6
+ "Bash(sed -i 's|인코딩은 인코딩이 아니다. cos\\(TILT_LIMIT\\)=0.82 이면 고리의 화면 반지름이\\\\n \\\\* \\\\[0.82R, R\\\\] 안에 머물러 이웃 단계와 절대 겹치지 않는다.|X|' app/web/graph.js)",
7
+ "Bash(sed -n '/인코딩은 인코딩이 아니다/,+2p' app/web/graph.js)",
8
+ "Bash(sed -i 's|import { applyEdits, draft, editRecord } from|import { applyEdits, draft } from|' app/server.mjs)",
9
+ "Bash(sed -i 's|\"test\": \"node --test test/protocol.test.mjs test/model.test.mjs test/analyze.test.mjs\"|\"test\": \"node --test test/protocol.test.mjs test/model.test.mjs test/analyze.test.mjs test/features.test.mjs\"|' package.json)",
10
+ "Bash(npm test *)",
11
+ "Bash(sed -i 's| .filter\\(\\(\\\\[t\\\\]\\) => t !== name \\\\&\\\\& !taken.has\\(t\\)\\)| .filter\\(\\([t]\\) => t !== name \\\\&\\\\& !taken.has\\(t\\) \\\\&\\\\& !tooCommon\\(t\\)\\)|' app/lib/features.mjs)",
12
+ "Bash(node -e ' *)",
13
+ "Bash(npm run *)",
14
+ "Bash(export AXMAP_AGENT=claude-fix GIT_AUTHOR_NAME=claude-fix GIT_AUTHOR_EMAIL=claude-fix@local GIT_COMMITTER_NAME=claude-fix GIT_COMMITTER_EMAIL=claude-fix@local)",
15
+ "Bash(node bin/axmap.mjs claim app/web/app.js app/web/graph.js app/web/style.css --task fix-click-color --intent \"이름 클릭=강조/더블클릭=이름변경, 단계 없을 때 색 회귀 수정\" --actor agent)",
16
+ "Bash(sed 's/\\\\$$//')",
17
+ "Bash(python -)",
18
+ "Bash(sed -n '/import 를 뽑을 수 있는 언어 이름/,/^\\\\]\\)/p' app/lib/analyze.mjs)",
19
+ "Bash(export AXMAP_AGENT=janghyojoon)",
20
+ "Bash(node bin/axmap.mjs release)",
21
+ "Bash(echo \"// 테스트\")",
22
+ "Bash(git add *)",
23
+ "Bash(git commit *)",
24
+ "Bash(git reset *)",
25
+ "Bash(git checkout *)"
26
+ ]
27
+ },
28
+ "enabledMcpjsonServers": [
29
+ "axmap"
30
+ ],
31
+ "enableAllProjectMcpServers": true
32
+ }
package/CLAUDE.md CHANGED
@@ -86,15 +86,19 @@ axmap claim <경로...> --task <작업ID> --intent "<한 줄 설명>"
86
86
  > 뒤에 온 claim 이 그냥 통과했고 — 레코드는 이름당 파일 하나다 — 앞 세션의
87
87
  > 작업·의도가 덮여 `status` 에 1건만 남았다. 두 세션이 같은 파일을 동시에 밀었다.
88
88
  >
89
- > 이제 claim 레코드에 **세션 id** 가 함께 적힌다(`--session` · `AXMAP_SESSION` ·
90
- > `CLAUDE_CODE_SESSION_ID` 순). 같은 이름인데 세션이 다르면 `claim` `release` 를
91
- > **거부한다**(종료 코드 2). 레코드는 손대지 않으므로 세션의 것이 사라지지 않는다.
92
- > 양쪽 하나라도 세션을 모르면 막지 않고 **알리기만 한다** 모르는 것과 다른 것은
93
- > 다르고, 모른다고 막으면 세션 개념이 없는 셸에서 아무것도 못 하게 된다.
89
+ > 이제 claim 레코드에 **세션 id** 가 함께 적히고(`--session` · `AXMAP_SESSION` ·
90
+ > `CLAUDE_CODE_SESSION_ID` 순), **레코드의 임자가 이름 하나가 아니라 (이름, 세션)
91
+ > 짝**이다. 창을 띄우면 장부에 줄이 서고 서로 덮지 않는다.
92
+ > `release` **그 세션이 잡은 것만** 푼다 다른 창이 두고 것까지 풀려면
93
+ > `release --all-sessions` 붙인다.
94
94
  >
95
- > 제대로 해법은 여전히 줄이다. **세션마다 `AXMAP_AGENT` 를 다르게 준다.**
96
- > 그래야 장부에서 둘로 갈라지고 겹침 검사가 실제로 돈다. `--takeover` "저 세션이
97
- > 확실히 나 자신" 일 때만 쓰는 문이고, 붙여도 잡혀 있던 경로는 안 없어진다.
95
+ > 처음에는 세션이 다르면 아예 **거부**했다(1.0.3). 증상은 멎었지만 같은 사람이
96
+ > 개로 겹치지도 않는 다른 일을 하는 것까지 막혀서, 1.0.4 에서 자리를 나누는
97
+ > 쪽으로 바꿨다.
98
+ >
99
+ > 그래도 제대로 된 해법은 여전히 위 한 줄이다. **세션마다 `AXMAP_AGENT` 를 다르게
100
+ > 준다.** 겹침 검사는 자기 이름의 claim 을 겹침으로 보지 않으므로, 이름이 같으면
101
+ > 두 창이 **같은 파일을 함께 잡을 수 있다** (그때 claim 이 겹친다고 찍어준다).
98
102
 
99
103
  > 🔴 **링크된 worktree**(`git worktree add` 로 옆에 펼친 폴더)**에서도 그대로 돈다.**
100
104
  > 장부는 메인 체크아웃에 **하나뿐**이고 링크된 worktree 는 그것을 본다
package/README.md CHANGED
@@ -85,8 +85,9 @@ node bin/axmap.mjs release # 끝나면 즉시
85
85
 
86
86
  이름은 **세션마다 다르게** 준다. 같은 PC 에서 AI 도구 세션을 둘 띄우고 둘 다
87
87
  이름을 안 주면 `git config user.name` 으로 떨어져 장부에서 한 사람이 된다.
88
- 그러면 서로를 하나도 못 막는다. 이름이 같은데 세션이 다르면 `claim`·`release`
89
- 거부되고(종료 코드 2) 세션의 레코드는 그대로 남는다 자세한 것은 [docs/SPEC.md](docs/SPEC.md) 3절.
88
+ 그러면 서로를 하나도 못 막는다. 이름이 같아도 **세션마다 레코드가 따로 적히므로**
89
+ 서로 덮지는 않고, `release` 세션이 잡은 것만 푼다 (다른 창이 두고 간 것까지
90
+ 풀려면 `release --all-sessions`) — 자세한 것은 [docs/SPEC.md](docs/SPEC.md) 3절.
90
91
 
91
92
  `git worktree add` 로 만든 폴더 안에서도 그대로 쓴다. 장부는 메인 체크아웃에
92
93
  하나뿐이고, 링크된 worktree 는 그것을 본다. 거기에 장부를 또 만들지 않는다.
@@ -625,6 +625,16 @@ export function collisionRisk(claims, coEdges = [], freq = null, now = null, {
625
625
  for (let j = i + 1; j < owned.length; j++) {
626
626
  const A = owned[i]
627
627
  const B = owned[j]
628
+ /**
629
+ * 🔴 **한 사람의 두 줄은 쌍이 아니다.**
630
+ *
631
+ * 장부의 레코드는 (이름, 세션) 짝마다 하나라, 같은 사람이 창을 둘 띄우면
632
+ * 같은 이름이 두 줄로 선다(protocol.mjs 의 `isSameSubject`). 이 화면이
633
+ * 말하려는 것은 **누구와 누가 부딪히는가**인데, 여기서 자기 자신과의 쌍을
634
+ * 만들면 "같은 경로를 덮는다 — 장부가 갈라졌다" 는 **없는 사고**를 띄운다.
635
+ * 그 경고는 claim 이 이미 그 자리에서 하고 있다.
636
+ */
637
+ if (A.claim.agent === B.claim.agent) continue
628
638
  const reasons = []
629
639
 
630
640
  // ── 확실 — 같은 경로 ─────────────────────────────────────────────────
@@ -743,8 +753,11 @@ export function collisionRisk(claims, coEdges = [], freq = null, now = null, {
743
753
  }
744
754
 
745
755
  /**
746
- * 쌍의 키. 에이전트 이름을 쓴다 — 장부는 에이전트마다 레코드가 하나이므로
747
- * (protocol.mjs 의 `upsert`) 이름이 곧 식별자다.
756
+ * 쌍의 키. 에이전트 이름을 쓴다 — 화면이 묻는 것은 **누구와 누가** 부딪히는가다.
757
+ *
758
+ * 장부의 레코드는 (이름, 세션) 짝마다 하나라 같은 이름이 두 줄일 수 있지만
759
+ * (protocol.mjs 의 `isSameSubject`), 자기 자신과의 쌍은 위에서 걸러내므로
760
+ * 이 키가 가리키는 것은 언제나 서로 다른 두 사람이다.
748
761
  */
749
762
  const agentKey = (a, b) => (String(a) < String(b) ? `${a}${SEP}${b}` : `${b}${SEP}${a}`)
750
763