라이브와 헤드리스
서버는 호출마다 확장이 ~/.erd-editor/ide/에 남기는 잠금 파일을 통해 문서를 담고 있는 VS Code 창을 찾습니다.
무엇을 찾느냐에 따라 편집이 적용되는 곳이 정해집니다.
| 찾은 것 | 편집의 동작 |
|---|---|
| 워크스페이스에 문서가 포함되어 있거나 문서를 열어 둔 창 | 라이브. 필요하면 문서를 ERD Editor에서 열고, 편집 세션에 참여해 그곳에 변경을 적용합니다. 편집은 곧바로 나타나며, 에이전트가 erd_save를 호출하거나 사용자가 저장할 때까지 저장되지 않은 상태로 남습니다. |
| 창 없음 | 헤드리스. 파일을 불러와 변경을 적용하고, 파일을 교체합니다. erd_save는 할 일이 없습니다. |
| 허브가 꺼진 창 | 거부. 읽기는 디스크에서 그대로 동작합니다. 열린 에디터 아래에서 파일에 쓴 변경은 그 에디터의 다음 저장이 덮어쓰므로, 서버는 아무것도 쓰지 않습니다. |
편집 결과에는 실행된 모드 live 또는 headless가 표시되며, 거부된 편집은 그 이유를 알려 줍니다.
탐색은 호출마다 다시 실행되므로, 창을 열거나 닫으면 다음 호출도 그에 따라 옮겨 갑니다.
한 문서에 대한 호출은 서버에 도착한 순서대로 하나씩 실행됩니다. 서로 다른 문서에 대한 호출은 나란히 실행됩니다.
라이브
에이전트는 참여자 한 명이 더 들어오듯 에디터에 합류합니다. 에이전트의 편집은 그 문서를 연 모든 에디터에 곧바로 전달되고, 참여자의 포커스와 마찬가지로 에이전트가 편집 중인 테이블과 셀에 에이전트의 포커스가 그려집니다. focusTracker 문서를 참고하세요.
읽기는 에디터를 열지 않습니다. 편집은 문서가 아직 열려 있지 않으면 ERD Editor에서 엽니다.
저장
에이전트의 편집은 사용자의 편집처럼 탭을 저장되지 않은 상태로 표시하며, 문서가 저장될 때에만 디스크에 반영됩니다.
erd_save는 VS Code 자체의 저장 명령과 마찬가지로 VS Code를 통해 문서를 저장합니다. 사용자가 대신 Ctrl + S (Windows/Linux) or ⌘ + S (Mac)로 저장해도 됩니다.
erd_save는 모든 편집이 도착했음을 에디터가 확인하지 못했을 때, 또는 디스크의 파일이 바뀌는 등의 이유로 VS Code가 탭을 저장되지 않은 상태로 유지했을 때 notSaved로 거부됩니다.
저장되지 않은 에이전트 편집이 있는 에디터를 닫으면, 다른 저장되지 않은 변경과 마찬가지로 저장할지 묻습니다. 그러면 에이전트의 다음 호출에는, 에디터가 닫히기 전에 저장된 경우에만 에이전트의 편집이 파일에 들어 있다는 안내가 함께 전달됩니다.
Undo
erd_undo는 에이전트가 마지막으로 한 편집을 되돌리며 사용자의 편집은 절대 되돌리지 않고, erd_redo는 그 편집을 다시 적용합니다.
에디터 자체의 Undo는 반대로 동작합니다. 다른 에디터에서 도착한 변경은 사용자의 히스토리에 기록되지 않으므로, 사용자의 편집을 되돌리고 에이전트의 편집은 절대 되돌리지 않습니다.
일부 편집은 에디터에 Undo 항목을 만들지 않습니다. erd_set_show를 제외한 설정 도구와 erd_resize_memo입니다. 문서가 이미 가진 값으로 설정하는 편집은 아무것도 바꾸지 않으므로 역시 Undo 항목을 만들지 않습니다.
erd_undo는 이런 편집을 건너뛰고 결과에 그 이름을 알려 줍니다.
에이전트의 Undo 히스토리는 다음과 같은 경우 결과에 안내를 남기고 끊깁니다.
- 예를 들어 에디터가 문서에서 에이전트를 내보낸 뒤처럼, 에이전트가 문서에 다시 참여할 때.
- 창이 종료되고 에이전트가 디스크의 파일을 이어서 편집할 때.
- 에이전트가 디스크에서 편집하던 문서를 창이 넘겨받을 때.
서버는 에이전트가 30분 동안 호출하지 않은 문서도 닫으며, 이때 Undo 히스토리도 안내 없이 함께 사라집니다.
창이 사라졌을 때
창이 문서를 담고 있는 동안 서버는 스스로 파일 편집으로 넘어가지 않습니다. 연결이 끊기면 다시 연결합니다. 창이 종료된 경우에만 파일을 편집하며, 결과에 그 사실을 알립니다.
아직 실행 중이지만 잠금 파일이 사라진 창은 편집을 hubGone으로 거부합니다. 그 창을 다시 로드하거나, 창을 닫아 에이전트가 파일을 직접 편집하게 하세요.
창에 닿지 못한 읽기는 대신 디스크의 파일을 읽으며, 에디터에서 아직 저장하지 않은 편집은 빠져 있다는 안내를 남깁니다.
헤드리스
문서를 담고 있는 창이 없으면, 각 편집은 파일을 불러와 변경을 적용하고 파일에 다시 씁니다.
쓰기는 문서 옆의 .<name>.<id>.tmp라는 임시 파일로 먼저 가고 그 파일이 문서를 교체하므로, 문서가 반쯤 쓰인 채로 남는 일은 없습니다.
마지막 단계 전에 서버는 호출 중에 디스크의 파일이 바뀌었는지 확인합니다.
바뀌었다면 아무것도 쓰지 않고 파일을 다시 불러오며, 호출은 conflict로 거부됩니다. 에이전트가 다시 호출합니다.
두 호출 사이에 바뀐 파일은 그냥 다시 불러오며, 그 전까지의 에이전트 Undo 히스토리는 버려집니다.
에이전트가 디스크에서 편집하는 동안 VS Code 창이 그 문서를 맡기 시작하면, 그 편집 하나는 hubAppeared로 거부되고 아무것도 쓰이지 않습니다. 다음 호출은 창을 통해 편집합니다.
거부
창은 허브가 꺼져 있어도 잠금 파일을 유지합니다. dineug.erd-editor.agentHub.enabled가 꺼져 있을 때, 워크스페이스를 신뢰하지 않을 때, 허브가 시작하지 못했을 때입니다.
이런 문서에 대한 편집은 blocked로 거부됩니다. 파일에 쓴 변경을 열린 에디터가 다음 저장 때 덮어쓰기 때문입니다.
읽기는 디스크의 파일에서 그대로 동작합니다.
에이전트가 편집할 수 있게 하려면 워크스페이스를 신뢰하고 설정을 켜거나, 창을 다시 로드하세요.
문서
문서는 절대 경로 또는 서버의 작업 디렉터리 기준 상대 경로인 path로 지정합니다.
- 새 문서는
.erd.json입니다.erd_open_document에create를 주면 파일을 만들며, 확장자가 없는 이름에는.erd.json을 붙입니다. - 기존
.erd,.vuerd,.vuerd.json파일도 열립니다. 그 밖의 확장자를 가진 경로는invalidPath로 거부됩니다. - 병합 충돌 표시가 남은 파일처럼 에디터가 읽을 수 없는 파일은
invalidDocument로 거부되고 그대로 남습니다. 빈 다이어그램으로 불러와 다시 쓰는 일은 절대 없습니다.
에이전트는 도구로만 문서를 바꾸며, 파일을 직접 쓰지 말라는 지시를 받습니다.
erd_list_documents는 문서를 path, open, active, dirty, readonly와 함께 나열합니다.
작업 디렉터리를 담당하는 VS Code 창이 있으면 그 창의 문서를, 없으면 작업 디렉터리 아래의 ERD 파일을 나열합니다.