README file from
Github작성일: 2026-06-05 수정일: 2026-06-05T12:45
MyWorld Task Manager
파편화된 할 일과 스케줄 관리를 중앙 집중화하고, 일일 루틴과 프로젝트를 완벽하게 연동하는 옵시디언 플러그인
이 플러그인은 템플레이터의 복잡한 스크립트 대신, 단 한 번의 클릭으로 스마트한 지식 관리 체계를 구축합니다.
[!IMPORTANT]
사용자의 지식 관리 시스템(PARA)과 결합하여 강력한 데일리 플래너와 스케줄링 환경을 제공합니다.
- 문서 하단의 접힌 내용들을 열어보시면 플러그인의 핵심 아키텍처와 상세 기능들을 확인하실 수 있습니다.
- 자세한 설치 및 통합 사용 설명서 보러가기
- 🖥️ 플랫폼: Obsidian Desktop (Windows/Mac)
- 🛠️ 기술 스택 (Tech Stack):
- Language:
TypeScript - Environment:
Node.js 18+,Obsidian API 1.5.0+ - Bundler:
esbuild - Styling:
CSS3
- Language:
🎯 1. 프로젝트 목표
본 프로젝트의 궁극적인 목표는 사용자가 옵시디언을 **제2의 두뇌(Second Brain)**로 구축하는 과정에서 겪는 시행착오를 최소화하는 것입니다.
- 제2의 두뇌 원클릭 셋업: PARA 및 제텔카스텐(Zettelkasten) 기반의 지식 관리 시스템에 처음 입문하는 사용자들을 위해, 복잡한 초기 폴더 구조 세팅과 템플릿 사용법을 **버튼 한 번 클릭(One-click)**으로 완벽하게 해결합니다.
- 양방향 동기화 스케줄링: 옵시디언 내에서 할 일(Task)들이 파편화되는 고질적인 문제를 해결하고자, 메인 스케줄 노트와 개별 프로젝트 노트들이 서로 완벽하게 **양방향 동기화(Bi-directional Sync)**되는 스케줄링 환경을 제공합니다.
기존 스케줄 관리 방식의 한계와 플러그인 도입 당위성은 👉 **옵시디언 스케줄 시스템 분석 보고서**를 참고해 주세요.
💡 2. 기획 방향성 설계 (Core Strategy)
- 결합형 지식 생태계: 단순한 '할 일 관리'를 넘어, 장기적인 프로젝트(Project)와 일일 루틴(Daily Schedule)이 상호 작용하며 함께 성장하는 지식 생태계 구축
- 마찰력(Friction) 제로: 사용자가 설정과 스크립트 오류 해결에 시간을 낭비하지 않고, 즉시 본연의 '기록과 사고'에 집중할 수 있도록 완벽히 캡슐화된 자동화 기능 제공
📊 3. 시스템 아키텍처 및 플러그인 설계 명세
- 데이터 동기화 (Synchronizer): 옵시디언 File I/O 및 메타데이터 캐시 API를 활용하여, 스케줄 노트와 프로젝트 노트 간의 할 일 데이터 불일치를 감지하고 완벽하게 동기화합니다.
- 구조 생성기 (TemplateHelper): 정규표현식을 통해 일관된 서식을 유지하며, PARA 구조와 제텔카스텐 폴더 체계를 자동으로 생성합니다.
- 초기화 엔진 (ResetManager): 매일 자정을 기점으로 과거 데이터를 통계 노트로 아카이빙하고 새로운 스케줄 뷰를 렌더링합니다.
- 🔗 상세한 클래스 구조와 데이터 흐름도는 👉 **플러그인 설계 및 구현 명세서**에서 확인하실 수 있습니다.
flowchart TD
User([사용자]) --> |할 일 등록 및 수정| DailyNote(데일리 스케줄 노트)
User --> |빠른 캡처 핫키| Modal(Quick Capture 모달)
Modal --> |내용 주입| DailyNote
DailyNote <--> |동기화 버튼 클릭| Synchronizer{Synchronizer Engine<br>정규식 In-place 스왑}
Synchronizer <--> |양방향 데이터 스왑| ProjectNote(프로젝트 노트 1)
Synchronizer <--> |양방향 데이터 스왑| ProjectNoteN(프로젝트 노트 N)
Clock([자정 트리거]) -.-> ResetManager{Reset Manager}
ResetManager --> |전날 할 일 통계 스캐닝| DailyNote
ResetManager --> |월간 백업| Archive(월간 통계 아카이브 노트)
💡 4. 사용자 메뉴얼 및 가이드
- 초기 셋업: 플러그인 설정 탭에서
[PARA 구조 생성]및[스케줄 관리 노트 생성]버튼을 눌러 지식 관리 기반을 즉시 구축합니다. - 일일 스케줄 관리: 스케줄 노트에 할 일을 입력하고 캘린더 모양의 버튼을 활용하여 마감일(D-Day)을 손쉽게 지정합니다.
- 빠른 캡처: 어느 노트에 있든 상단의 번개 모양 아이콘을 눌러 빠른 등록 모달창을 띄우고, 떠오른 할 일을 즉시 스케줄에 편입시킵니다.
- 🔗 플러그인 수동 설치부터 각 기능별 상세한 활용 팁은 👉 **플러그인 통합 사용 설명서**에 모두 정리되어 있습니다.
1) 지식 관리 시스템 자동 구축 (Setup Helper)
- 버튼 한 번 클릭으로 PARA (Project, Area, Resource, Archive) 구조와 제텔카스텐(Zettelkasten) 폴더 구조를 자동 생성합니다.
- 데일리 스케줄 및 프로젝트를 관리할 기본 템플릿(Template) 파일들까지 완벽하게 세팅합니다.
2) 강력한 할 일 양방향 동기화 (Task Sync)
- 메인
스케줄 노트와 각프로젝트 노트사이의 할 일 완료 상태([x])나 내용 수정이 양방향으로 동기화됩니다. (⚡ 수시 동기화 버튼 클릭) - 어디서 체크하든 원본 데이터가 안전하게 일치됩니다.
3) 디데이(D-Day) 자동 계산 및 정렬
- 할 일을 입력할 때 마감일을 지정하면, 디데이를 계산하여 뱃지 형태(
#D-0,#D-5등)로 예쁘게 색상을 입혀 시각화합니다. - 마감일이 임박한 순서대로 스케줄 노트에 자동으로 정렬되어, 무엇이 급한지 즉시 파악할 수 있습니다.
4) ✏️ 빠른 할 일 등록 (Quick Capture)
- 데일리 노트 어디서든 상단의 버튼을 눌러 빠른 할 일 모달창을 엽니다.
- 달력(Date Picker)과 입력창을 통해 내일 혹은 특정 날짜로 편하게 할 일을 주입할 수 있습니다.
5) 🔄 자정 데일리 리셋 및 통계 아카이빙
- 매일 자정이 지나 새로운 날이 밝으면, 전날의 스케줄 기록을 월간 통계 노트로 자동으로 보내어 안전하게 백업합니다.
- 오늘 해야 할 루틴과 새로운 할 일 목록들로 깔끔하게 화면을 리셋합니다.
🔗 확장성 및 타 플러그인 연동 향후 캘린더 등 타 플러그인과의 시너지 및 기능 확장에 대한 구상은 👉 **플러그인 연동 및 보조 플러그인 기획**에 정리되어 있습니다.
본 프로젝트는 견고한 코드 컨벤션과 아키텍처 원칙(👉 옵시디언 플러그인 개발 정책)을 바탕으로 구축되었습니다.
🔍 핵심 로직 분석 (Core Logic Analysis)
1️⃣ [Data Architecture] 마크다운 계층 보존을 위한 AST 파싱 엔진
- 기능 구현: 플랫(Flat)한 마크다운 텍스트 라인들을 단순 배열 정렬할 경우 하위 들여쓰기(Indent)가 파괴되는 문제를 막기 위해, 텍스트 스크림을 읽고 부모-자식 관계를 가지는
TaskNode트리(Tree) 구조로 파싱하는 커스텀 AST 변환 로직을 설계했습니다.
// TaskUtils.ts 中 (들여쓰기 뎁스를 기반으로 트리 구조 형성)
parseTasksToTree(lines: string[]): TaskNode[] {
const nodes: TaskNode[] = [];
const stack: { indent: number, children: TaskNode[] }[] = [{ indent: -1, children: nodes }];
lines.forEach(line => {
const indent = (line.match(REGEX.INDENT) || [""])[0].length;
const node: TaskNode = { line, indent, children: [] };
while (stack.length > 1 && stack[stack.length - 1].indent >= indent) stack.pop();
stack[stack.length - 1].children.push(node);
stack.push(node);
});
return nodes;
}
2️⃣ [Sync Engine] 블록 ID 정규표현식을 활용한 In-place 동기화
- 기능 구현: 양방향 데이터 동기화 시
replace로 통째로 텍스트를 갈아끼우면 유저가 작성한 다른 데이터가 유실(Lost Update)될 수 있습니다. 이를 방지하고자 라인 후미에 달린 고유 블록 ID(^1a2b3c)만을 정규식으로 추출하여 해당 라인의 상태 괄호([x])만 핀포인트로 교체(Swap)하는 안전 장치를 구현했습니다.
// Synchronizer.ts 中 (ID 매칭을 통한 상태 괄호 스왑 로직)
if (id && execMap.has(id)) {
const updatedExecTask = execMap.get(id);
const status = (updatedExecTask.line.match(REGEX.STATUS_MATCH))[1];
// 원본 텍스트(pMatch[1] 등)는 보존하고 상태만 최신으로 교체
newPlanLines.push(`${pMatch[1]} [${status}] ${text} ^${id}`);
}
3️⃣ [UX & Lifecycle] 자정 리셋 및 데일리 아카이빙 엔진
- 기능 구현: 매일 밤 12시가 지났을 때 사용자가 첫 옵시디언 실행을 하면, 과거 스케줄을 스캐닝하여 완료/미완료 통계를 산출한 뒤 월간 아카이브 노트로 백업(Append)하고 데일리 노트를 초기화하는 LifeCycle 매니저를 구축했습니다.
// ResetManager.ts 中 (통계 산출 후 월간 노트 백업)
async processReset(app: App, scheduleFile: TFile, previousDate: string) {
const content = await app.vault.read(scheduleFile);
const stats = this.calculateCompletionStats(content);
const archiveContent = `## ${previousDate}\n- 완료: ${stats.done}\n- 미완료: ${stats.undone}\n\n`;
await app.vault.append(archiveFile, archiveContent);
await this.resetDailySchedule(app, scheduleFile); // 오늘 날짜 뷰로 초기화
}
[!TIP] 더 방대하고 치열한 기술적 페인 포인트와 해결 과정(디버깅 기록)은 👉 트러블슈팅(기술적 깊이) 보고서 문서에서 확인하실 수 있습니다.
🔥 Troubleshooting: 문제 해결 및 설계적 방어 사례 (Key Highlights)
- [Data Structure] AST 기반 정렬 알고리즘: 들여쓰기로 이뤄진 마크다운 태스크의 계층이 정렬 시 파괴되는 문제를, 텍스트를 트리(Tree) 노드로 파싱하고 재귀적으로 정렬하는 엔진을 구현하여 원천 차단했습니다.
- [Optimization] 상태 하향 전파(Propagation) 스캐너: 부모 태스크에만 상태/마감일을 부여해도, Indent 스코프를 추적하여 자식 태스크로 속성을 O(N) 속도로 하향 전파하는 논리적 스캐너를 구축했습니다.
- [Data Integrity] 정규식 기반 In-place 동기화: 양방향 데이터 스왑 시 블록 캐시 ID(
^id) 앵커만을 추출하여 핀포인트로 업데이트하는 안전성을 확보했습니다. - [Defensive Programming] 마크다운 오염 방지 가드: 캡처 대상 섹션을 찾지 못할 시 하드코딩으로 무분별하게 문서를 Append하는 대신, 즉시 런타임을 중단하고 사용자에게 피드백을 주어 노트 생태계를 보호했습니다.
- [CI/CD & Lint] 엄격한 정적 분석 파이프라인 돌파: 글로벌 오픈소스 스토어 배포를 위해,
builtin-modules패키지 충돌을 제어하고 수십 개의 ESLint 타입 에러를 통제하여 CI/CD를 통과했습니다. - [Deep Debugging] 원시 타입 속성 오염 추적:
Cannot create property on string에러의 원인이 파라미터 매핑 누락으로 인한 String 객체화 실패임을 콜스택 단에서 추적하고, 인터페이스를 완벽히 교정했습니다. - [Lifecycle Management] 핫 리로드(Hot Reload) 캐싱 충돌 제어: 플러그인 빌드 갱신 시 메모리에 잔존한 구버전 인스턴스와 신규 모듈 간의 충돌 원인을 생명주기 관점에서 분석하고 클린 릴리즈 파이프라인을 구축했습니다.
오픈소스 생태계에 기여(Contribute)하시거나 플러그인의 배포 파이프라인이 궁금하시다면 아래 공식 가이드를 참고해 주세요.
- 플러그인 개발 및 공식 등록 가이드: 옵시디언 공식 커뮤니티 스토어에 플러그인을 등재하기 위한 PR(Pull Request) 절차 및 필수 요건을 다룹니다.
- 플러그인 검증 및 배포 가이드: 소스 코드를 빌드하고 새로운 버전을 릴리즈할 때 거쳐야 하는 내부 검증 프로세스와 버전 관리 규칙을 담고 있습니다.
-
🟢 Keep (Continuous Learning): 텍스트 환경에서의 자료구조 활용과 알고리즘적 사고
- 단순히 프레임워크나 라이브러리의 기능(API)을 호출하는 데 그치지 않고, 마크다운이라는 순수 텍스트(Plain Text) 환경의 한계를 직접 구현한 AST 트리 파싱과 정규식 In-place 스왑 알고리즘을 통해 돌파해냈습니다.
- 이를 통해 프레임워크가 가려둔 저수준(Low-level)의 텍스트 처리와 자료구조 설계의 중요성을 깨달았으며, 앞으로도 문제의 본질을 파고드는 엔지니어링 방식을 유지하고자 합니다.
-
🔴 Problem (Defensive Awareness): 예외 상황(Edge Case) 및 런타임 환경에 대한 고려 미흡
- 프로젝트 초기에는 '정상적인 동작(Happy Path)'에만 치중하여, 유저가 마크다운 템플릿을 임의로 지우거나 플러그인 핫 리로드 시 이전 메모리 캐시가 남아있는 등의 런타임 엣지 케이스들을 제대로 제어하지 못했습니다.
- 이로 인해 소중한 유저의 노트 데이터가 오염되거나
TypeError가 터지는 등 오픈소스가 가져야 할 가장 중요한 덕목인 '안정성' 측면에서 뼈아픈 시행착오를 겪었습니다.
-
🔵 Try (Defensive & Automated Planning): 방어적 프로그래밍 및 CI/CD의 체화
- [코드 레벨] 단순히 콘솔에 에러 로그만 띄우는 것을 넘어, 예외 발생 시 쓰기 연산을 즉각 차단(Return)하여 유저 데이터를 최우선으로 보호하는 방어적 프로그래밍 원칙을 정립했습니다.
- [인프라 레벨] 옵시디언 봇의 엄격한 검수와 캐싱 충돌을 겪은 후, 앞으로 어떤 프로젝트를 하더라도 코드 작성 초기부터 **정적 분석기(Linter)와 배포 자동화 파이프라인(CI/CD)**을 세팅하여 휴먼 에러를 시스템적으로 차단하는 습관을 들이기로 다짐했습니다.
📝 License & Contact
- License: MIT License - 누구나 자유롭게 활용하고 기여할 수 있는 오픈소스 프로젝트입니다.
- Contact: GitHub Issue 탭을 통한 버그 제보 및 PR을 환영합니다.
- Developer: GitHub Profile | 📧 [email protected]