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.
- package/.claude/settings.local.json +32 -0
- package/CLAUDE.md +12 -8
- package/README.md +3 -2
- package/app/lib/teamview.mjs +15 -2
- package/bin/axmap.mjs +401 -96
- package/mcp/README.md +3 -2
- package/mcp/server.mjs +6 -4
- package/package.json +1 -1
- package/src/invariants.mjs +103 -2
- package/src/protocol.mjs +185 -144
- package/tools/bus.mjs +65 -2
|
@@ -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** 가 함께
|
|
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
|
|