axmap-cli 1.0.1 → 1.1.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.md +12 -8
- package/README.md +3 -2
- package/app/lib/teamview.mjs +15 -2
- package/bin/axmap.mjs +500 -121
- package/mcp/README.md +3 -2
- package/mcp/server.mjs +12 -6
- package/package.json +1 -1
- package/src/invariants.mjs +103 -2
- package/src/protocol.mjs +185 -144
- package/tools/bus.mjs +421 -14
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** 가 함께
|
|
90
|
-
> `CLAUDE_CODE_SESSION_ID` 순)
|
|
91
|
-
>
|
|
92
|
-
>
|
|
93
|
-
>
|
|
89
|
+
> 이제 claim 레코드에 **세션 id** 가 함께 적히고(`--session` · `AXMAP_SESSION` ·
|
|
90
|
+
> `CLAUDE_CODE_SESSION_ID` 순), **레코드의 임자가 이름 하나가 아니라 (이름, 세션)
|
|
91
|
+
> 짝**이다. 창을 둘 띄우면 장부에 두 줄이 서고 서로 덮지 않는다.
|
|
92
|
+
> `release` 는 **그 세션이 잡은 것만** 푼다 — 다른 창이 두고 간 것까지 풀려면
|
|
93
|
+
> `release --all-sessions` 를 붙인다.
|
|
94
94
|
>
|
|
95
|
-
>
|
|
96
|
-
>
|
|
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
|
-
그러면 서로를 하나도 못 막는다. 이름이
|
|
89
|
-
|
|
88
|
+
그러면 서로를 하나도 못 막는다. 이름이 같아도 **세션마다 레코드가 따로 적히므로**
|
|
89
|
+
서로 덮지는 않고, `release` 는 그 세션이 잡은 것만 푼다 (다른 창이 두고 간 것까지
|
|
90
|
+
풀려면 `release --all-sessions`) — 자세한 것은 [docs/SPEC.md](docs/SPEC.md) 3절.
|
|
90
91
|
|
|
91
92
|
`git worktree add` 로 만든 폴더 안에서도 그대로 쓴다. 장부는 메인 체크아웃에
|
|
92
93
|
하나뿐이고, 링크된 worktree 는 그것을 본다. 거기에 장부를 또 만들지 않는다.
|
package/app/lib/teamview.mjs
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|