@milcho0604/velog-mcp 0.8.1 → 0.8.6

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/CHANGELOG.md CHANGED
@@ -4,6 +4,168 @@
4
4
  **무엇이 깨져 있었는지**를 먼저 적는다. 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/),
5
5
  버전은 [유의적 버전](https://semver.org/lang/ko/)을 따른다.
6
6
 
7
+ ## [0.8.6] — 2026-08-27
8
+
9
+ 코덱스 3차 검토(v0.8.4..HEAD) 지적 4건을 전부 반영했다. **0.8.5 에서 거짓 양성을
10
+ 고치면서 이번엔 반대로 놓치게 만든 것**이 하나 있었다.
11
+
12
+ ### 고침
13
+
14
+ - **걸친 노트를 감사에서 통째로 빼버렸다.** 0.8.5 에서 «걸친 노트는 그 구간을 덮는 게
15
+ 설계» 라고 판단해 검사를 건너뛰게 했는데, 그러면 **제 구간 밖** 참가자의 막대를
16
+ 덮어도 안 잡힌다. 이제 걸친 노트는 `lo~hi` **밖**만 본다. 막대 30겹에서 재현했다.
17
+ - **없는 막대 값을 물고 있었다.** 안 닫힌 막대는 그 참가자가 마지막으로 관여한
18
+ 지점까지만 끈다(⑥의 `lastY`). 그러니 노트 뒤에 그 참가자가 안 나오면 막대는 노트
19
+ 위에서 끝나 겹칠 일이 없다. 열린 개수만 세고 있어서, 없는 막대 때문에 노트가
20
+ 반대편으로 뒤집히거나 간격이 헛되이 벌어졌다. 참가자별 마지막 등장 지점을 보고 판단한다.
21
+
22
+ ### 검사
23
+
24
+ - **`BAR_NOTE_SAMPLE` 을 대조군에 넣었다.** 변이 표본을 대조군에 안 넣으면 원본부터
25
+ 걸리는 상태가 되어도 «변이하니 걸렸다» 는 그대로 통과한다. 그럼 아무것도 증명 못 한다.
26
+ - **S10 이 `insetL` 을 한 번도 안 밟고 있었다.** 왼쪽 이웃 막대 회피가 동작으로
27
+ 검증된 적이 없었다. 왼쪽에만 막대가 쌓이면 오른쪽으로 되돌아오는 사례를 넣었다.
28
+
29
+ ### R16 상한을 3 으로
30
+
31
+ 0.8.5 에서 4 → 2 로 조였는데 **CI Node 22.18 에서 3 이 찍혀 빨간불이 났다.**
32
+ 프로필 두 개는 순차로 만들고 순차로 지우므로, 앞판 정리 도중과 뒷판 기동이
33
+ 표본 추출 시점에 겹쳐 보인다. 3 은 여전히 «두 판(4개)» 과 구분되고, 직렬화를
34
+ 무력화하는 변이에서 6 이 찍히는 것도 확인했다.
35
+
36
+ ⚠️ 코덱스가 3차에서 «상한 2 가 간헐적으로 3 을 볼 수 있는지» 를 정확히 물었는데
37
+ **로컬 3회 통과로 넘겼다가 CI 에서 났다. 로컬 몇 회 통과는 근거가 안 된다.**
38
+
39
+ ### ⚠️ 남는 한계
40
+
41
+ 막대 30겹 이상이 쌓인 상태에서 그 구간 밖으로 걸친 노트를 두면 **감사가 거부한다.**
42
+ 배치가 그걸 피하도록 넓히지는 않는다. 조용히 망가진 그림을 올리는 것보다 낫다고 보고
43
+ 여기까지 뒀다. 실제로 30겹은 `return` 없이 호출만 서른 번 쌓아야 나온다.
44
+
45
+ ## [0.8.5] — 2026-08-27
46
+
47
+ 코덱스 2차 검토(v0.8.3..HEAD). **높음 6건, 중간 8건.** 그중 하나는 0.8.4 에서
48
+ **내가 만든 회귀**였다. 배포 직전에 잡았다.
49
+
50
+ ### 🔴 고침 — 0.8.4 의 회귀
51
+
52
+ - **두 열에 걸친 노트가 무조건 감사에 걸렸다.** 0.8.4 에서 넣은 «노트가 활성막대를
53
+ 덮는지» 검사가 **걸친 노트까지** 봤다. 걸친 노트는 그 구간을 덮는 것이 설계인데
54
+ (from~to 를 가리킨다면서 가운데만 떠 있으면 어디 얘기인지 모른다), 막대가 **1겹만**
55
+ 열려 있어도 걸렸다. 멀쩡한 그림이 거부된다. 이제 **한 열짜리 노트만** 본다.
56
+
57
+ ### 고침
58
+
59
+ - **왼쪽에 붙는 노트가 왼쪽 이웃의 막대를 안 비켰다.** 막대는 오른쪽으로만 자라므로
60
+ 왼쪽은 안전하다고 봤는데, 왼쪽으로 가면 걸리는 상대가 **왼쪽 이웃**의 막대다.
61
+ `npadL` 에 그 몫을 넣었다.
62
+ - **R16 이 렌더 두 판의 동시 실행을 통과시켰다.** 프로필 상한을 4 로 뒀는데 한 판이
63
+ 2개이므로 4는 곧 두 판이다. 그건 이 검사가 막으려던 상태다. 2 로 조였고 3회 연속 확인했다.
64
+
65
+ ### 검사
66
+
67
+ - **S4 에 «노트가 막대 몫을 안 비킨다» 변이 추가.** S11 이 «문구가 소스에 있나» 만
68
+ 보고 있어서 감사를 `if (false && ...)` 로 죽여도 통과했다(코덱스 지적). 진짜 변이로 옮겼다.
69
+ ⚠️ 표본 조건 셋을 다 갖춰야 재현된다 — 첫 열(왼쪽 회피 불가), 깊은 막대, 노트 뒤 메시지.
70
+ - **S10 이 `inset` 을 0 으로만 부르고 있었다.** 그러면 `defR` 이 실수로 `npadL` 을 써도
71
+ 두 값이 같아 전부 통과한다. 막대 몫이 붙으면 반대편을 고르는 사례를 넣었다.
72
+
73
+ ### 재보고 넣지 않은 것
74
+
75
+ - 코덱스는 «노트 연결선이 막대와 교차하는 것을 감사가 놓친다» 고 했다. 눈으로 보니
76
+ **원래 지나갈 수밖에 없다** — 노트는 제 생명선에 붙어야 하고 막대가 그 사이에 있다.
77
+ 감사에 넣으면 방금 고친 «걸친 노트» 와 같은 거짓 양성이 된다.
78
+
79
+ ## [0.8.4] — 2026-08-27
80
+
81
+ 0.8.3 의 «막대 몫» 수정이 **절반만 되어 있었다.** 배포해도 되는지 스스로 되묻고
82
+ 안 본 자리를 훑다가 둘을 더 찾았다. 둘 다 0.8.3 에 있는 결함이다.
83
+
84
+ ### 고침
85
+
86
+ - **자기호출이 막대 몫을 못 받았다.** `spans` 에만 넣었는데 자기호출은 그 경로를 안 탄다.
87
+ 깊게 쌓인 막대 위에서 고리가 오른쪽으로 밀리는데 열은 안 넓어져 라벨이 제 구간을
88
+ 넘었다(«깊은 막대 위 자기호출 + 긴 라벨» 에서 재현).
89
+ - **★ 노트가 활성 막대 위에 얹혔다.** 노트는 생명선에서 26px 만 띄우는데 막대는 깊이만큼
90
+ 오른쪽으로 밀린다. 5겹부터 노트가 막대 밑에 깔리고 연결선도 가려졌다.
91
+ 이제 오른쪽에 붙을 때만 막대 몫을 비켜준다 — 막대는 오른쪽으로만 밀리므로 왼쪽은 그대로다.
92
+
93
+ ### 감사
94
+
95
+ - **노트가 제 활성막대를 덮는지 보게 했다.** 카드, 노트끼리, 남의 생명선은 보면서
96
+ **막대만 아무도 안 보고 있었다.** 위 결함이 감사를 통과한 이유다.
97
+ 변이(상자 x 에서 막대 몫 제거)로 검출력을 확인했다.
98
+ ⚠️ 표본을 고를 때 주의 — 노트가 왼쪽으로 피하거나 막대가 노트 위에서 끝나면
99
+ 겹칠 일이 없어 변이가 무반응이다. **첫 열에 노트를 붙이고(왼쪽 회피 불가)
100
+ 노트 뒤에 그 참가자가 한 번 더 등장해야**(막대가 아래로 이어짐) 재현된다.
101
+
102
+ ### 검사
103
+
104
+ - **S11 에 3건 추가** — 자기호출 넓히기의 막대 몫, 노트의 막대 몫(오른쪽만),
105
+ 감사에 노트 대 막대 검사가 있는지.
106
+ - 상자 x 계산을 한 줄(`nOff`)로 정리했다. S4 변이 표적과 S10 배선 검사도 따라 고쳤다.
107
+ - **★ R16 이 재는 대상을 바꿨다.** 크롬 **프로세스 개수**로 직렬화를 판정하고 있었는데,
108
+ 한 판이 띄우는 헬퍼 수가 환경마다 달라 CI 에서 «바닥 0, 최고 15» 로 빨간불이 났다.
109
+ **직렬화는 멀쩡했다.** 개수로는 「한 판」과 「여러 판」을 못 가른다(이 검사가 이 이유로
110
+ 깨진 게 두 번째다). 이제 **크롬 프로필 디렉터리**를 센다 — 렌더 1회가 정확히 2개를
111
+ 만들고 `finally` 에서 지우므로 살아 있는 개수가 곧 동시 렌더 수 × 2 다.
112
+ 직렬화를 무력화하는 변이에서 정확히 **6개(3판 × 2)** 가 찍히는 것을 확인했다.
113
+
114
+ ## [0.8.3] — 2026-08-27
115
+
116
+ 코덱스 검토(0.150.1) 지적 네 건 중 셋을 반영하고, 그 과정에서 **v0.7.4 부터 있던
117
+ 결함 하나를 새로 찾아 고쳤다.** 지적 하나는 재보고 사실이 아니어서 넘겼다.
118
+
119
+ ### 고침
120
+
121
+ - **★ 열 넓히기가 활성 막대 몫을 안 빼고 있었다.** 화살표는 생명선 한가운데가 아니라
122
+ 막대 가장자리에서 끊는데, 막대가 쌓인 구간은 라벨이 쓸 가로가 그만큼 줄어든다.
123
+ `call` 만 12개 이어 붙이고 긴 라벨을 주면 «라벨이 제 구간 밖으로 나감» 으로
124
+ **감사에 걸려 업로드가 거부됐다.** 짝을 맞춰 막대를 닫으면 통과했고 번호와는
125
+ 무관했다. v0.7.4, v0.8.0, v0.8.1 전부 같은 실패라 이번 변경의 회귀가 아니다.
126
+ 막대 깊이는 y 좌표와 무관하게 메시지 순서만으로 정해지므로, 열 간격을 정하기 전에
127
+ 미리 세어 반영한다.
128
+ - **한 열짜리(노트, 자기호출) 넓히기를 `spans` 뒤로 옮겼다.** 노트를 어느 쪽에 붙일지는
129
+ 그때의 간격을 보고 정하는데, `spans` 앞에서 정하면 곧 넓어질 쪽을 모르고 골라
130
+ 반대쪽을 쓸데없이 벌린다. 실측 **859 → 720**. `spans` 는 간격을 늘리기만 하므로
131
+ 뒤에서 더 넓혀도 그 조건은 그대로 성립한다.
132
+ - `docs/tools.md` 가 아직 «노트는 그 열 오른쪽에 붙는다» 라고 적고 있었다. 0.8.1 부터
133
+ 덜 벌리는 쪽에 붙는다. 결정 규칙까지 적었다.
134
+
135
+ ### 검사
136
+
137
+ - **S11** — 막대 몫 계산(`insetOf`)과 그것을 `spans` 가 실제로 더하는지.
138
+ - **S12** — 소스에서 `spans` 가 한 열짜리 넓히기보다 앞에 오는지.
139
+ - **S9 보강** — 폭(`m.tw`)을 번호 붙인 **뒤에** 재는지. 순서를 바꿔도 기존 S9 가 전부
140
+ 통과했다(코덱스 지적). 이제 순서를 못 박고 변이로 확인했다.
141
+ - **P28 보강** — 계열 최댓값만 보면 가운데가 빠져도 통과한다(코덱스 지적).
142
+ S9 를 지워도 S10 이 남아 최댓값은 10 이다. 이제 빠진 번호를 같이 본다.
143
+
144
+ ### 재보고 넘긴 것
145
+
146
+ - 코덱스는 «번호 때문에 첫 줄이 WRAP_W 를 넘는데 열 간격이 반영을 안 한다» 고 했으나,
147
+ 소스는 이미 번호를 붙인 **뒤에** 폭을 재고 있었다. 지적이 맞았던 건 **검사 쪽**이라
148
+ 거기만 보강했다.
149
+
150
+ ## [0.8.2] — 2026-08-27
151
+
152
+ ### 문서
153
+
154
+ - **README 두 판이 낡은 검증 수치를 적고 있었다.** «테스트 276건, R1~R23, P1~P26»
155
+ 이라고 했는데 실제로는 416건이었고 `render.test.ts` 에 **S1~S10 이 통째로 더** 있었다.
156
+ 0.7.0 에서 시퀀스 검사 열 개를 넣으면서 README 를 안 고쳤다.
157
+ 이 저장소는 같은 이유로 한 번 지적받은 적이 있다(`d59d3dc`, 코덱스 9차).
158
+
159
+ ### 검사
160
+
161
+ - **P28** — README 두 판이 말하는 검사 계열 범위가 실제와 맞는지 본다. 소스에서
162
+ `A`, `R`, `S`, `P` 계열의 최댓값을 긁어 한글판(`~`)과 영문판(`–`) 표기를 대조한다.
163
+ 숫자를 손으로 맞추는 한 또 낡으므로 **계열 범위만이라도 기계가 지키게** 했다.
164
+ 양방향 변이로 확인했다 — README 를 낡게 만들어도, 검사만 늘리고 문서를 안 고쳐도 걸린다.
165
+ - 총 건수는 기계가 안 본다. 변이 루프처럼 **실행 중에 만들어지는 검사**가 있어 소스만
166
+ 읽어서는 셀 수 없다. 그래서 README 에는 «0.8.2 기준» 이라고 시점을 함께 적었다.
167
+ - ⚠️ «소스 변이 54종» 은 손으로 관리하는 수치라 이번에 손대지 않았다. 확인할 방법이 없다.
168
+
7
169
  ## [0.8.1] — 2026-08-27
8
170
 
9
171
  ### 고침
@@ -224,6 +386,11 @@
224
386
 
225
387
  - 첫 npm 공개 발행.
226
388
 
389
+ [0.8.6]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.6
390
+ [0.8.5]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.5
391
+ [0.8.4]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.4
392
+ [0.8.3]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.3
393
+ [0.8.2]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.2
227
394
  [0.8.1]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.1
228
395
  [0.8.0]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.8.0
229
396
  [0.7.4]: https://github.com/milcho0604/velog-mcp/releases/tag/v0.7.4
package/README.ko.md CHANGED
@@ -63,7 +63,7 @@ npm 에 올려뒀으니 클론할 것 없이 MCP 클라이언트가 `npx` 로
63
63
 
64
64
  ```bash
65
65
  claude mcp add velog -e VELOG_REFRESH_TOKEN=여기에_토큰 \
66
- -- npx -y @milcho0604/velog-mcp@0.8.1
66
+ -- npx -y @milcho0604/velog-mcp@0.8.6
67
67
  ```
68
68
 
69
69
  이 방식은 토큰이 클라이언트 설정 파일에 남는다. 위의 플러그인 방식은 키체인에 넣는다.
@@ -85,7 +85,7 @@ MCP 클라이언트 설정 파일(`claude_desktop_config.json`, `.mcp.json` 등)
85
85
  "mcpServers": {
86
86
  "velog": {
87
87
  "command": "npx",
88
- "args": ["-y", "@milcho0604/velog-mcp@0.8.1"],
88
+ "args": ["-y", "@milcho0604/velog-mcp@0.8.6"],
89
89
  "env": {
90
90
  "VELOG_REFRESH_TOKEN": "여기에 토큰"
91
91
  }
@@ -98,7 +98,7 @@ Claude Code CLI 라면:
98
98
 
99
99
  ```bash
100
100
  claude mcp add velog -e VELOG_REFRESH_TOKEN=여기에_토큰 \
101
- -- npx -y @milcho0604/velog-mcp@0.8.1
101
+ -- npx -y @milcho0604/velog-mcp@0.8.6
102
102
  ```
103
103
 
104
104
  로컬 체크아웃으로 돌리려면 command 를
@@ -393,8 +393,9 @@ npm run build # tsconfig.build.json (dist 에 테스트 미포함)
393
393
  npm run schema:dump # 현재 벨로그 GraphQL 스키마 덤프
394
394
  ```
395
395
 
396
- 테스트 276건. `safety.test.ts` 가 보안 불변식(A1~A11)을, `render.test.ts` 가
397
- 그림 쪽 불변식(R1~R23)을, `plugin.test.ts` 가 포장 불변식(P1~P26) 고정한다.
396
+ 테스트 427건(0.8.6 기준). `safety.test.ts` 가 보안 불변식(A1~A11)을,
397
+ `render.test.ts` 가 구성도 불변식(R1~R23) 시퀀스 불변식(S1~S12)을,
398
+ `plugin.test.ts` 가 포장 불변식(P1~P28)을 고정한다.
398
399
  깨지면 우회하지 말고 왜 깨졌는지부터 볼 것.
399
400
 
400
401
  여기 있는 방어는 전부 **일부러 망가뜨려** 확인했다. 소스 변이 54종 + 발행 관문
package/README.md CHANGED
@@ -68,7 +68,7 @@ Published on npm, so nothing to clone — your MCP client runs it via `npx`. See
68
68
 
69
69
  ```bash
70
70
  claude mcp add velog -e VELOG_REFRESH_TOKEN=your_refresh_token \
71
- -- npx -y @milcho0604/velog-mcp@0.8.1
71
+ -- npx -y @milcho0604/velog-mcp@0.8.6
72
72
  ```
73
73
 
74
74
  The token stays in your client's config file here. The plugin route above puts it in
@@ -91,7 +91,7 @@ Add this to your MCP client config (`claude_desktop_config.json`, `.mcp.json`,
91
91
  "mcpServers": {
92
92
  "velog": {
93
93
  "command": "npx",
94
- "args": ["-y", "@milcho0604/velog-mcp@0.8.1"],
94
+ "args": ["-y", "@milcho0604/velog-mcp@0.8.6"],
95
95
  "env": {
96
96
  "VELOG_REFRESH_TOKEN": "your_refresh_token"
97
97
  }
@@ -104,7 +104,7 @@ With the Claude Code CLI:
104
104
 
105
105
  ```bash
106
106
  claude mcp add velog -e VELOG_REFRESH_TOKEN=your_refresh_token \
107
- -- npx -y @milcho0604/velog-mcp@0.8.1
107
+ -- npx -y @milcho0604/velog-mcp@0.8.6
108
108
  ```
109
109
 
110
110
  To run a local checkout instead, swap the command for
@@ -406,9 +406,10 @@ npm run build # tsconfig.build.json (tests excluded from dist)
406
406
  npm run schema:dump # dump Velog's current GraphQL schema
407
407
  ```
408
408
 
409
- 276 tests. `src/__tests__/safety.test.ts` pins the security invariants (A1–A11),
410
- `render.test.ts` pins the drawing ones (R1–R23), and `plugin.test.ts` pins the
411
- packaging ones (P1P26) — if any fails, find out why instead of working around it.
409
+ 427 tests (as of 0.8.6). `src/__tests__/safety.test.ts` pins the security
410
+ invariants (A1–A11), `render.test.ts` pins the diagram ones (R1–R23) and the
411
+ sequence ones (S1S12), and `plugin.test.ts` pins the packaging ones (P1–P28)
412
+ if any fails, find out why instead of working around it.
412
413
 
413
414
  Every guard here was checked by **breaking it on purpose**: 54 mutations against the
414
415
  source, plus 12 against the publish gate itself (`scripts/gate-mutation.sh`), each of
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
10
  import { type Capabilities } from './capabilities.ts';
11
11
  import { VelogClient } from './client.ts';
12
12
  export declare const SERVER_NAME = "velog-mcp";
13
- export declare const SERVER_VERSION = "0.8.1";
13
+ export declare const SERVER_VERSION = "0.8.6";
14
14
  export declare function createServer(client: VelogClient, capabilities?: Capabilities): McpServer;
15
15
  /**
16
16
  * 크롬이 있어야만 되는 도구들.
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ import { registerImageTools } from "./tools/images.js";
28
28
  export const SERVER_NAME = 'velog-mcp';
29
29
  // ⚠️ 이 값은 네 곳이 함께 움직인다 — package.json / plugin.json / .mcp.json 의
30
30
  // npx 핀 / 여기. 어긋나면 P8 테스트가 잡는다. 손으로 맞추지 말고 테스트를 믿을 것.
31
- export const SERVER_VERSION = '0.8.1';
31
+ export const SERVER_VERSION = '0.8.6';
32
32
  export function createServer(client, capabilities = { publicPublish: false, editProfile: false }) {
33
33
  const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, {
34
34
  instructions: [
@@ -400,6 +400,54 @@ for (var mi = 0; mi < M.length; mi++) {
400
400
  m.th = m.lines.length * m.lh;
401
401
  }
402
402
 
403
+ // ── ②-b 활성 막대가 잡아먹을 폭을 미리 센다 ──
404
+ // ★ 화살표는 생명선 한가운데가 아니라 **막대 가장자리**에서 끊는다(barEdge).
405
+ // 그래서 막대가 쌓인 구간에서는 라벨이 쓸 수 있는 가로가 그만큼 줄어든다.
406
+ // 그런데 열 넓히기는 그 몫을 안 빼고 있었다 — call 만 12개 이어져 막대가
407
+ // 깊게 쌓이면 라벨이 제 구간을 넘어 **감사에 걸려 업로드가 거부됐다**(실측).
408
+ // ★ 막대 깊이는 y 좌표와 무관하게 **메시지 순서만으로** 정해진다(⑥의 stack 길이).
409
+ // 그래서 좌표를 잡기 전인 여기서 미리 셀 수 있다. 여기 계산이 ⑥과 어긋나면
410
+ // 다시 좁아지므로, 둘은 같은 규칙을 따라야 한다.
411
+ var preOpen = [];
412
+ for (i = 0; i < P.length; i++) preOpen.push(0);
413
+ // ★ 안 닫힌 막대는 그 참가자가 **마지막으로 관여한 지점**까지만 끈다(⑥의 lastY).
414
+ // 그러니 노트 뒤에 그 참가자가 안 나오면 막대는 노트 위에서 끝나 겹칠 일이 없다.
415
+ // 그걸 안 보고 열린 개수만 세면 **없는 막대 값을 물어** 노트를 반대편으로 뒤집거나
416
+ // 간격을 헛되이 벌린다(코덱스 3차 지적).
417
+ var lastIdx = [];
418
+ for (i = 0; i < P.length; i++) lastIdx.push(-1);
419
+ for (mi = 0; mi < M.length; mi++) {
420
+ var ml0 = M[mi];
421
+ if (ml0.note) continue;
422
+ lastIdx[ml0.a] = mi;
423
+ lastIdx[ml0.b] = mi;
424
+ }
425
+ function insetOf(depth){ return depth > 0 ? (depth - 1) * BAR_STEP + BAR_W / 2 : 0; }
426
+ for (mi = 0; mi < M.length; mi++) {
427
+ var mb = M[mi];
428
+ mb.inset = 0;
429
+ if (!S.activations) continue;
430
+ // 노트는 스택을 바꾸지 않지만, 붙는 자리는 막대 바깥이어야 한다.
431
+ // 오른쪽에 붙으면 제 막대를, 왼쪽에 붙으면 **왼쪽 이웃**의 막대를 비켜야 한다.
432
+ // 막대는 오른쪽으로만 자라므로 방향에 따라 걸리는 상대가 다르다(코덱스 2차 지적).
433
+ if (mb.note) {
434
+ if (mb.a === mb.b) {
435
+ // 그 참가자가 이 노트 **뒤에** 다시 나와야 막대가 노트 행까지 이어진다.
436
+ mb.inset = lastIdx[mb.a] > mi ? insetOf(preOpen[mb.a]) : 0;
437
+ mb.insetL = (mb.a > 0 && lastIdx[mb.a - 1] > mi) ? insetOf(preOpen[mb.a - 1]) : 0;
438
+ }
439
+ continue;
440
+ }
441
+ if (mb.self) { mb.inset = insetOf(preOpen[mb.a]); continue; }
442
+ if (mb.kind === 'return') {
443
+ if (preOpen[mb.a] > 0) preOpen[mb.a]--;
444
+ mb.inset = insetOf(preOpen[mb.a] + 1) + insetOf(preOpen[mb.b]);
445
+ } else {
446
+ preOpen[mb.b]++;
447
+ mb.inset = insetOf(preOpen[mb.a]) + insetOf(preOpen[mb.b]);
448
+ }
449
+ }
450
+
403
451
  // ── ③ 열 간격: 라벨이 들어갈 만큼 넓힌다 ──
404
452
  var gaps = [];
405
453
  for (i = 0; i < P.length - 1; i++) {
@@ -407,6 +455,23 @@ for (i = 0; i < P.length - 1; i++) {
407
455
  }
408
456
  function widenOne(i, need){ if (i >= 0 && i < gaps.length && gaps[i] < need) gaps[i] = need; }
409
457
 
458
+ // 여러 열에 걸친 것은 짧은 것부터 처리한다. 긴 것은 앞서 벌어진 폭을 물려받는다.
459
+ var spans = [];
460
+ for (mi = 0; mi < M.length; mi++) {
461
+ var ms = M[mi];
462
+ if (ms.a === ms.b) continue;
463
+ spans.push({lo:Math.min(ms.a, ms.b), hi:Math.max(ms.a, ms.b), need:ms.tw + (ms.note ? 34 : 30) + (ms.inset || 0)});
464
+ }
465
+ spans.sort(function(x, y){ return (x.hi - x.lo) - (y.hi - y.lo); });
466
+ for (var si = 0; si < spans.length; si++) {
467
+ var sp = spans[si];
468
+ var cur = 0;
469
+ for (i = sp.lo; i < sp.hi; i++) cur += gaps[i];
470
+ if (cur < sp.need) {
471
+ var add = (sp.need - cur) / (sp.hi - sp.lo);
472
+ for (i = sp.lo; i < sp.hi; i++) gaps[i] += add;
473
+ }
474
+ }
410
475
  for (mi = 0; mi < M.length; mi++) {
411
476
  var mm = M[mi];
412
477
  if (mm.note && mm.a === mm.b) {
@@ -415,40 +480,30 @@ for (mi = 0; mi < M.length; mi++) {
415
480
  // 설명인지 모르게 되므로 생명선에서 상자까지 짧은 연결선을 긋는다.
416
481
  // ★ 어느 쪽에 붙일지는 **덜 벌리는 쪽**으로 고른다. 늘 오른쪽에만 붙이면
417
482
  // 왼쪽에 자리가 남아도 안 쓰고 오른쪽 열을 밀어 그림이 옆으로 길어진다.
418
- var npad = NOTE_OFF + mm.tw + 28 + 16;
483
+ // 활성 막대는 깊이만큼 **오른쪽으로만** 밀린다(rect x = cx + depth*BAR_STEP - BAR_W/2).
484
+ // 그래서 오른쪽에 붙일 때만 그 몫을 비켜준다. 안 그러면 노트가 막대 위에 얹힌다.
485
+ var npadR = NOTE_OFF + (mm.inset || 0) + mm.tw + 28 + 16;
486
+ var npadL = NOTE_OFF + (mm.insetL || 0) + mm.tw + 28 + 16;
419
487
  var defR = mm.a < P.length - 1
420
- ? Math.max(0, npad + P[mm.a+1].w / 2 - gaps[mm.a])
421
- : npad; // 마지막 열이면 흡수할 간격이 없어 캔버스가 그만큼 늘어난다
488
+ ? Math.max(0, npadR + P[mm.a+1].w / 2 - gaps[mm.a])
489
+ : npadR; // 마지막 열이면 흡수할 간격이 없어 캔버스가 그만큼 늘어난다
422
490
  var defL = mm.a > 0
423
- ? Math.max(0, npad + P[mm.a-1].w / 2 - gaps[mm.a-1])
491
+ ? Math.max(0, npadL + P[mm.a-1].w / 2 - gaps[mm.a-1])
424
492
  : Infinity; // 첫 열은 왼쪽에 열이 없다
425
493
  mm.left = defL < defR; // 같으면 오른쪽 — 읽는 방향과 같다
426
- if (mm.left) widenOne(mm.a - 1, npad + P[mm.a-1].w / 2);
427
- else if (mm.a < P.length - 1) widenOne(mm.a, npad + P[mm.a+1].w / 2);
494
+ if (mm.left) widenOne(mm.a - 1, npadL + P[mm.a-1].w / 2);
495
+ else if (mm.a < P.length - 1) widenOne(mm.a, npadR + P[mm.a+1].w / 2);
428
496
  } else if (mm.self) {
429
497
  // 자기호출은 고리와 라벨이 오른쪽으로 나간다. 마지막 열이면 캔버스가 늘어난다.
498
+ // ★ 고리도 생명선이 아니라 **막대 가장자리**에서 시작한다(barEdge). 막대가 쌓인
499
+ // 구간이면 그만큼 오른쪽으로 밀리므로 그 몫을 같이 넣는다. spans 를 안 타는
500
+ // 경로라 ②-b 에서 센 값을 여기서 직접 써야 한다.
430
501
  if (mm.a < P.length - 1) {
431
- widenOne(mm.a, SELF_W + 10 + mm.tw + 16 + P[mm.a+1].w / 2);
502
+ widenOne(mm.a, (mm.inset || 0) + SELF_W + 10 + mm.tw + 16 + P[mm.a+1].w / 2);
432
503
  }
433
504
  }
434
505
  }
435
- // 여러 열에 걸친 것은 짧은 것부터 처리한다. 긴 것은 앞서 벌어진 폭을 물려받는다.
436
- var spans = [];
437
- for (mi = 0; mi < M.length; mi++) {
438
- var ms = M[mi];
439
- if (ms.a === ms.b) continue;
440
- spans.push({lo:Math.min(ms.a, ms.b), hi:Math.max(ms.a, ms.b), need:ms.tw + (ms.note ? 34 : 30)});
441
- }
442
- spans.sort(function(x, y){ return (x.hi - x.lo) - (y.hi - y.lo); });
443
- for (var si = 0; si < spans.length; si++) {
444
- var sp = spans[si];
445
- var cur = 0;
446
- for (i = sp.lo; i < sp.hi; i++) cur += gaps[i];
447
- if (cur < sp.need) {
448
- var add = (sp.need - cur) / (sp.hi - sp.lo);
449
- for (i = sp.lo; i < sp.hi; i++) gaps[i] += add;
450
- }
451
- }
506
+
452
507
  var CX = [0];
453
508
  for (i = 0; i < gaps.length; i++) CX.push(CX[i] + gaps[i]);
454
509
  for (i = 0; i < P.length; i++) {
@@ -541,8 +596,9 @@ for (mi = 0; mi < M.length; mi++) {
541
596
  if (mx.note) {
542
597
  var bw0 = mx.tw + 28;
543
598
  if (mx.a === mx.b) {
544
- mx.box = {x:(mx.left ? P[mx.a].cx - NOTE_OFF - bw0 : P[mx.a].cx + NOTE_OFF),
545
- y:mx.boxY, w:bw0, h:mx.h};
599
+ // 오른쪽에 붙을 때만 막대 몫을 비켜준다 막대는 깊이만큼 오른쪽으로만 밀린다.
600
+ var nOff = mx.left ? -(NOTE_OFF + bw0) : NOTE_OFF + (mx.inset || 0);
601
+ mx.box = {x:P[mx.a].cx + nOff, y:mx.boxY, w:bw0, h:mx.h};
546
602
  mx.lo = mx.left ? mx.box.x : P[mx.a].cx - BAR_W;
547
603
  mx.hi = mx.left ? P[mx.a].cx + BAR_W : mx.box.x + bw0;
548
604
  } else {
@@ -827,6 +883,26 @@ for (var nb1 = 0; nb1 < noteBoxes.length; nb1++) {
827
883
  for (var nb2 = nb1 + 1; nb2 < noteBoxes.length; nb2++) {
828
884
  if (rectsOverlap(noteBoxes[nb1][0], noteBoxes[nb2][0])) collide.push('노트끼리 겹침');
829
885
  }
886
+ // ★ 노트가 **활성 막대**를 덮는지. 카드, 노트, 생명선은 보면서 막대는 아무도 안 봤다.
887
+ // 막대는 깊이만큼 오른쪽으로 밀리므로 NOTE_OFF(26) 만 띄우면 5겹부터 밑에 깔린다(실측).
888
+ // ⚠️ **한 열짜리 노트만 본다.** 두 열에 걸친 노트는 그 구간을 덮는 것이 설계다
889
+ // (from~to 를 가리킨다고 해놓고 가운데만 떠 있으면 어디 얘기인지 모른다).
890
+ // 그걸 안 가리고 다 보면 걸친 노트 + 열린 막대가 **1겹부터 무조건** 걸려서
891
+ // 멀쩡한 그림이 거부된다(코덱스 2차 지적, 실측으로 재현).
892
+ var nOwn = noteBoxes[nb1][2];
893
+ var spanning = (nOwn.lo !== nOwn.hi);
894
+ for (i = 0; i < P.length; i++) {
895
+ // 걸친 노트는 **제 구간 안**을 덮는 것이 설계다. 그 밖은 덮으면 안 된다.
896
+ // 한 열짜리는 생명선 옆에 매달리는 것이라 제 막대도 덮으면 안 된다.
897
+ if (spanning && i >= nOwn.lo && i <= nOwn.hi) continue;
898
+ for (var ab2 = 0; ab2 < ACT[i].length; ab2++) {
899
+ var bb = ACT[i][ab2];
900
+ if (rectsOverlap(noteBoxes[nb1][0], {x:P[i].cx + bb.depth * BAR_STEP - BAR_W / 2,
901
+ y:bb.y1, w:BAR_W, h:Math.max(20, bb.y2 - bb.y1)})) {
902
+ collide.push('노트가 ' + P[i].name + ' 의 활성막대를 덮음 (막대 몫만큼 더 비켜야 한다)');
903
+ }
904
+ }
905
+ }
830
906
  var own = noteBoxes[nb1][2];
831
907
  for (i = 0; i < P.length; i++) {
832
908
  if (i >= own.lo && i <= own.hi) continue;
@@ -1 +1 @@
1
- {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/render/sequence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/render/sequence.ts"],"names":[],"mappings":"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"}
package/docs/tools.md CHANGED
@@ -385,7 +385,10 @@ terminal network mail search retry bolt
385
385
  | `note` | 노란 상자 | 선이 아니라 설명. 순서 안에 끼워 넣는다 |
386
386
 
387
387
  `from` 과 `to` 가 같으면 자기호출이 되어 오른쪽으로 고리를 그린다.
388
- `note` 는 `to` 를 생략하면 그 열 오른쪽에 붙고, 주면 두 열 사이에 걸친다.
388
+ `note` 는 `to` 를 생략하면 그 열 **옆**에 붙고, 주면 두 열 사이에 걸친다.
389
+ 한 열짜리 노트가 왼쪽에 붙을지 오른쪽에 붙을지는 **덜 벌리는 쪽**으로 렌더러가 정한다 —
390
+ 양쪽이 같으면 오른쪽이다. 첫 열은 왼쪽에 열이 없어 오른쪽, 마지막 열은 흡수할 간격이
391
+ 없어 왼쪽이 유리하다. 어느 쪽에 붙든 생명선까지 짧은 연결선을 긋는다.
389
392
 
390
393
  #### 깔끔하게 나오게 쓰는 법
391
394
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@milcho0604/velog-mcp",
3
- "version": "0.8.1",
3
+ "version": "0.8.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@milcho0604/velog-mcp",
9
- "version": "0.8.1",
9
+ "version": "0.8.6",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@modelcontextprotocol/sdk": "^1.30.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milcho0604/velog-mcp",
3
- "version": "0.8.1",
3
+ "version": "0.8.6",
4
4
  "mcpName": "io.github.milcho0604/velog",
5
5
  "description": "벨로그(velog.io) MCP 서버 — 조회·검색·통계는 인증 없이 동작하고, 쓰기는 초안과 비공개 발행이 기본이다. 공개 발행은 VELOG_ALLOW_PUBLIC=1 로 사용자만 켤 수 있다. 문서 없는 벨로그 GraphQL 동작을 실측해 정리했다. 런타임 의존성 2개, Node 22.18+",
6
6
  "type": "module",