tdecollab 0.3.5 → 0.3.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Confluence, JIRA, GitLab을 하나의 CLI / TUI / MCP 서버로 통합 제공하는 도구.
4
4
 
5
- 터미널에서 직접 사용하거나, AI 에이전트(Claude Desktop 등)와 연동하여 사용할 수 있습니다.
5
+ 터미널에서 직접 사용하거나, AI 에이전트(Claude Desktop 등)와 연동하여 사용할 수 있습니다. 또한 Obsidian 플러그인을 통해 마크다운 노트를 Confluence와 양방향으로 연동할 수 있습니다.
6
6
 
7
7
  ## 지원 서비스
8
8
 
@@ -12,31 +12,44 @@ Confluence, JIRA, GitLab을 하나의 CLI / TUI / MCP 서버로 통합 제공하
12
12
  | **JIRA** | 이슈 CRUD, JQL 검색, 상태 변경(트랜지션), 코멘트 관리, 프로젝트/보드 조회 |
13
13
  | **GitLab** | 프로젝트 조회, MR 관리, 파이프라인 조회, 브랜치 관리, 파일 조회 |
14
14
 
15
- ## Obsidian 플러그인
15
+ ---
16
+
17
+ ## 1. Obsidian 플러그인
16
18
 
17
19
  현재 활성화된 마크다운 노트를 Confluence 페이지로 업로드하거나, 반대로 다운로드할 수 있는 Obsidian 플러그인을 제공합니다.
18
20
 
19
- ### 설치 (BRAT)
21
+ ### 설치 방법 (BRAT)
20
22
  1. Obsidian에서 **BRAT** 플러그인을 먼저 설치 및 활성화합니다.
21
23
  2. `BRAT: Add a beta plugin for testing` 명령을 실행합니다.
22
24
  3. **`goodjoon/tdecollab_public`** 주소를 입력하여 설치합니다.
23
25
  4. 설정에서 **TDE Collab Confluence**를 활성화합니다.
24
26
 
25
- ## 요구사항
27
+ ### 사용법
28
+ - Obsidian의 명령어 팔레트(`Cmd/Ctrl + P`)를 열어 `TDE Collab`을 검색합니다.
29
+ - **Upload to Confluence**: 현재 열려있는 마크다운 노트를 Confluence 페이지로 업로드합니다.
30
+ - **Download from Confluence**: Confluence 페이지를 가져와 현재 마크다운 노트로 다운로드합니다.
31
+
32
+ ---
33
+
34
+ ## 2. CLI / TUI 및 MCP 서버
35
+
36
+ 터미널에서 직접 실행하거나 Claude Desktop 등의 MCP 클라이언트와 연동할 수 있는 Node.js 기반 도구입니다.
37
+
38
+ ### 요구사항
26
39
 
27
40
  - Node.js 20 이상
28
41
 
29
- ## 설치
42
+ ### 설치 방법
30
43
 
31
44
  ```bash
32
- # 전역 설치
45
+ # 전역 설치 (CLI/TUI 사용 시 권장)
33
46
  npm install -g tdecollab
34
47
 
35
48
  # 또는 npx로 즉시 실행 (설치 불필요)
36
49
  npx -y tdecollab --help
37
50
  ```
38
51
 
39
- ## 설정
52
+ ### 환경변수 설정
40
53
 
41
54
  각 서비스 접속에 필요한 환경변수:
42
55
 
@@ -66,10 +79,11 @@ GITLAB_PRIVATE_TOKEN=your-private-token
66
79
 
67
80
  상위 우선순위에 이미 설정된 값은 하위 설정 파일 값으로 덮어쓰지 않습니다.
68
81
 
69
- ## 사용법
82
+ ### 사용법
83
+
84
+ #### TUI (Terminal UI) 모드
70
85
 
71
- ### TUI (Terminal UI) 모드
72
- ![[img_20260429004932.png]]
86
+ ![](tdecollab-docs/assets/Monosnap%20tdecollab%202026-05-03%2014-21-27.png)
73
87
 
74
88
  인자 없이 실행하면 인터랙티브 TUI가 시작됩니다 — 메뉴 탐색, 폼 입력, 실시간 결과 확인이 한 화면에서 가능합니다.
75
89
 
@@ -89,9 +103,9 @@ tdecollab
89
103
 
90
104
  마지막 사용값은 `.tdecollab.json`에, 명령 히스토리는 `~/.tdecollab_history.json`에 자동 저장됩니다.
91
105
 
92
- ### CLI 명령어
106
+ #### CLI 명령어
93
107
 
94
- #### Confluence
108
+ ##### Confluence
95
109
 
96
110
  ```bash
97
111
  # 스페이스 목록
@@ -105,7 +119,7 @@ tdecollab confluence page create --space <key> --title <title> --file <path_to_m
105
119
  tdecollab confluence page update <pageId> --file <path_to_md>
106
120
  ```
107
121
 
108
- #### JIRA / GitLab
122
+ ##### JIRA / GitLab
109
123
 
110
124
  ```bash
111
125
  tdecollab jira issue get PROJ-1234
@@ -115,16 +129,16 @@ tdecollab gitlab mr list <projectId> -s opened
115
129
 
116
130
  `tdecollab <service> --help` 또는 `tdecollab <service> <command> --help`로 모든 옵션을 확인할 수 있습니다.
117
131
 
118
- ## MCP 서버 (Claude Desktop 연동)
132
+ ### MCP 서버 연동 (Claude Desktop)
119
133
 
120
134
  Claude Desktop에서 Confluence, JIRA, GitLab 도구를 사용할 수 있습니다.
121
135
 
122
- ### 설정 파일 위치
136
+ #### 설정 파일 위치
123
137
 
124
138
  - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
125
139
  - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
126
140
 
127
- ### npx 사용 (권장 — 별도 설치 불필요)
141
+ #### npx 사용 (권장 — 별도 설치 불필요)
128
142
 
129
143
  ```json
130
144
  {
@@ -146,7 +160,7 @@ Claude Desktop에서 Confluence, JIRA, GitLab 도구를 사용할 수 있습니
146
160
  }
147
161
  ```
148
162
 
149
- ### 전역 설치 후 사용
163
+ #### 전역 설치 후 사용
150
164
 
151
165
  ```bash
152
166
  npm install -g tdecollab
@@ -173,7 +187,7 @@ npm install -g tdecollab
173
187
 
174
188
  설정 후 Claude Desktop을 재시작하면 도구가 활성화됩니다.
175
189
 
176
- ### 제공 MCP 도구
190
+ #### 제공하는 MCP 도구
177
191
 
178
192
  | 서비스 | 도구 |
179
193
  |---|---|
@@ -183,6 +197,8 @@ npm install -g tdecollab
183
197
 
184
198
  자세한 도구별 파라미터는 Claude Desktop의 MCP 도구 검색 UI 또는 `tdecollab mcp` 실행 시 stderr 로그를 참조하세요.
185
199
 
200
+ ---
201
+
186
202
  ## 라이선스
187
203
 
188
- [MIT](LICENSE)
204
+ [MIT](LICENSE)
@@ -24,10 +24,10 @@ import {
24
24
  loadGitlabConfig,
25
25
  loadJiraConfig,
26
26
  tryBuildJiraIssueMap
27
- } from "./chunk-JUM5ZG64.js";
27
+ } from "./chunk-SIKUIQKX.js";
28
28
  import {
29
29
  logger
30
- } from "./chunk-6RIA6AJ3.js";
30
+ } from "./chunk-IFYMZLQI.js";
31
31
 
32
32
  // tools/mcp/server.ts
33
33
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -138,7 +138,7 @@ function registerConfluenceTools(server) {
138
138
  if (page.body?.storage?.value) {
139
139
  let imageUrlMap;
140
140
  if (downloadImages) {
141
- const { ImageDownloader } = await import("./image-downloader-AKNR5YKJ.js");
141
+ const { ImageDownloader } = await import("./image-downloader-VKPGS3TY.js");
142
142
  const downloader = new ImageDownloader(contentApi, {
143
143
  outputDir: imageDir || "./images",
144
144
  pageId: page.id,
@@ -1107,4 +1107,4 @@ async function runServer() {
1107
1107
  export {
1108
1108
  runServer
1109
1109
  };
1110
- //# sourceMappingURL=chunk-5IY42AV6.js.map
1110
+ //# sourceMappingURL=chunk-6GCKWJJ7.js.map
@@ -1,10 +1,3 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined") return require.apply(this, arguments);
5
- throw Error('Dynamic require of "' + x + '" is not supported');
6
- });
7
-
8
1
  // tools/common/logger.ts
9
2
  var Logger = class {
10
3
  level = "info";
@@ -75,7 +68,6 @@ var Logger = class {
75
68
  var logger = new Logger();
76
69
 
77
70
  export {
78
- __require,
79
71
  logger
80
72
  };
81
- //# sourceMappingURL=chunk-6RIA6AJ3.js.map
73
+ //# sourceMappingURL=chunk-IFYMZLQI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../tools/common/logger.ts"],"sourcesContent":["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nclass Logger {\n private level: LogLevel = 'info';\n\n constructor() {\n this.level = (process.env.LOG_LEVEL as LogLevel) || 'info';\n }\n\n // 로그 레벨 설정\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n // 로그 메시지 포맷팅 (타임스탬프, 레벨 포함)\n private formatMessage(level: LogLevel, message: string, ...args: any[]): string {\n const timestamp = new Date().toISOString();\n let formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;\n\n if (args.length > 0) {\n formattedMessage += ' ' + args.map(arg => {\n if (arg instanceof Error) {\n return arg.stack || arg.message;\n }\n return typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n }\n\n // 민감 정보 마스킹 (토큰, 비밀번호 등)\n formattedMessage = this.maskSensitiveData(formattedMessage);\n\n return formattedMessage;\n }\n\n // 민감한 데이터(키, 패스워드 등) 마스킹 처리\n private maskSensitiveData(text: string): string {\n // 1. Authorization 헤더 마스킹 (Basic ***, Bearer ***)\n let masked = text.replace(/(Authorization[\"']?\\s*[:=]\\s*[\"']?)(Basic|Bearer)\\s+([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3, p4) => {\n const maskedToken = p3.length > 8 ? p3.substring(0, 4) + '...' + p3.substring(p3.length - 4) : '******';\n return `${p1}${p2} ${maskedToken}${p4}`;\n });\n\n // 2. 키워드 기반 마스킹 (token, password, secret, key 등)\n // 헤더 이름(PRIVATE-TOKEN 등)과 변수명 모두 대응 가능하도록 개선\n masked = masked.replace(/((?:token|password|secret|key|api_token|private_token)[\"']?\\s*[:=]\\s*[\"']?)([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3) => {\n const maskedValue = p2.length > 8 ? p2.substring(0, 4) + '...' + p2.substring(p2.length - 4) : '******';\n return `${p1}${maskedValue}${p3}`;\n });\n\n return masked;\n }\n\n // Debug 레벨 로그 출력\n debug(message: string, ...args: any[]) {\n if (this.shouldLog('debug')) {\n console.error(this.formatMessage('debug', message, ...args));\n }\n }\n\n // Info 레벨 로그 출력\n info(message: string, ...args: any[]) {\n if (this.shouldLog('info')) {\n console.error(this.formatMessage('info', message, ...args));\n }\n }\n\n // Warn 레벨 로그 출력\n warn(message: string, ...args: any[]) {\n if (this.shouldLog('warn')) {\n console.error(this.formatMessage('warn', message, ...args));\n }\n }\n\n // Error 레벨 로그 출력\n error(message: string, ...args: any[]) {\n if (this.shouldLog('error')) {\n console.error(this.formatMessage('error', message, ...args));\n }\n }\n\n // 현재 설정된 로그 레벨에 따라 출력 여부 결정\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.level);\n }\n}\n\nexport const logger = new Logger();\n"],"mappings":";;;;;;;;AAEA,IAAM,SAAN,MAAa;AAAA,EACD,QAAkB;AAAA,EAE1B,cAAc;AACV,SAAK,QAAS,QAAQ,IAAI,aAA0B;AAAA,EACxD;AAAA;AAAA,EAGA,SAAS,OAAiB;AACtB,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA,EAGQ,cAAc,OAAiB,YAAoB,MAAqB;AAC5E,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAI,mBAAmB,IAAI,SAAS,MAAM,MAAM,YAAY,CAAC,KAAK,OAAO;AAEzE,QAAI,KAAK,SAAS,GAAG;AACjB,0BAAoB,MAAM,KAAK,IAAI,SAAO;AACtC,YAAI,eAAe,OAAO;AACtB,iBAAO,IAAI,SAAS,IAAI;AAAA,QAC5B;AACA,eAAO,OAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,OAAO,GAAG;AAAA,MAC9E,CAAC,EAAE,KAAK,GAAG;AAAA,IACf;AAGA,uBAAmB,KAAK,kBAAkB,gBAAgB;AAE1D,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,kBAAkB,MAAsB;AAE5C,QAAI,SAAS,KAAK,QAAQ,2EAA2E,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO;AAC5H,YAAM,cAAc,GAAG,SAAS,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI;AAC/F,aAAO,GAAG,EAAE,GAAG,EAAE,IAAI,WAAW,GAAG,EAAE;AAAA,IACzC,CAAC;AAID,aAAS,OAAO,QAAQ,kGAAkG,CAAC,OAAO,IAAI,IAAI,OAAO;AAC7I,YAAM,cAAc,GAAG,SAAS,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI;AAC/F,aAAO,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,YAAoB,MAAa;AACnC,QAAI,KAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,GAAG,IAAI,CAAC;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,YAAoB,MAAa;AAClC,QAAI,KAAK,UAAU,MAAM,GAAG;AACxB,cAAQ,MAAM,KAAK,cAAc,QAAQ,SAAS,GAAG,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,YAAoB,MAAa;AAClC,QAAI,KAAK,UAAU,MAAM,GAAG;AACxB,cAAQ,MAAM,KAAK,cAAc,QAAQ,SAAS,GAAG,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAoB,MAAa;AACnC,QAAI,KAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,GAAG,IAAI,CAAC;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA,EAGQ,UAAU,OAA0B;AACxC,UAAM,SAAqB,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAC5D,WAAO,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK;AAAA,EAC7D;AACJ;AAEO,IAAM,SAAS,IAAI,OAAO;","names":[]}
1
+ {"version":3,"sources":["../tools/common/logger.ts"],"sourcesContent":["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nclass Logger {\n private level: LogLevel = 'info';\n\n constructor() {\n this.level = (process.env.LOG_LEVEL as LogLevel) || 'info';\n }\n\n // 로그 레벨 설정\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n // 로그 메시지 포맷팅 (타임스탬프, 레벨 포함)\n private formatMessage(level: LogLevel, message: string, ...args: any[]): string {\n const timestamp = new Date().toISOString();\n let formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;\n\n if (args.length > 0) {\n formattedMessage += ' ' + args.map(arg => {\n if (arg instanceof Error) {\n return arg.stack || arg.message;\n }\n return typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n }\n\n // 민감 정보 마스킹 (토큰, 비밀번호 등)\n formattedMessage = this.maskSensitiveData(formattedMessage);\n\n return formattedMessage;\n }\n\n // 민감한 데이터(키, 패스워드 등) 마스킹 처리\n private maskSensitiveData(text: string): string {\n // 1. Authorization 헤더 마스킹 (Basic ***, Bearer ***)\n let masked = text.replace(/(Authorization[\"']?\\s*[:=]\\s*[\"']?)(Basic|Bearer)\\s+([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3, p4) => {\n const maskedToken = p3.length > 8 ? p3.substring(0, 4) + '...' + p3.substring(p3.length - 4) : '******';\n return `${p1}${p2} ${maskedToken}${p4}`;\n });\n\n // 2. 키워드 기반 마스킹 (token, password, secret, key 등)\n // 헤더 이름(PRIVATE-TOKEN 등)과 변수명 모두 대응 가능하도록 개선\n masked = masked.replace(/((?:token|password|secret|key|api_token|private_token)[\"']?\\s*[:=]\\s*[\"']?)([^\"'\\s]+)([\"']?)/gi, (match, p1, p2, p3) => {\n const maskedValue = p2.length > 8 ? p2.substring(0, 4) + '...' + p2.substring(p2.length - 4) : '******';\n return `${p1}${maskedValue}${p3}`;\n });\n\n return masked;\n }\n\n // Debug 레벨 로그 출력\n debug(message: string, ...args: any[]) {\n if (this.shouldLog('debug')) {\n console.error(this.formatMessage('debug', message, ...args));\n }\n }\n\n // Info 레벨 로그 출력\n info(message: string, ...args: any[]) {\n if (this.shouldLog('info')) {\n console.error(this.formatMessage('info', message, ...args));\n }\n }\n\n // Warn 레벨 로그 출력\n warn(message: string, ...args: any[]) {\n if (this.shouldLog('warn')) {\n console.error(this.formatMessage('warn', message, ...args));\n }\n }\n\n // Error 레벨 로그 출력\n error(message: string, ...args: any[]) {\n if (this.shouldLog('error')) {\n console.error(this.formatMessage('error', message, ...args));\n }\n }\n\n // 현재 설정된 로그 레벨에 따라 출력 여부 결정\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.level);\n }\n}\n\nexport const logger = new Logger();\n"],"mappings":";AAEA,IAAM,SAAN,MAAa;AAAA,EACD,QAAkB;AAAA,EAE1B,cAAc;AACV,SAAK,QAAS,QAAQ,IAAI,aAA0B;AAAA,EACxD;AAAA;AAAA,EAGA,SAAS,OAAiB;AACtB,SAAK,QAAQ;AAAA,EACjB;AAAA;AAAA,EAGQ,cAAc,OAAiB,YAAoB,MAAqB;AAC5E,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAI,mBAAmB,IAAI,SAAS,MAAM,MAAM,YAAY,CAAC,KAAK,OAAO;AAEzE,QAAI,KAAK,SAAS,GAAG;AACjB,0BAAoB,MAAM,KAAK,IAAI,SAAO;AACtC,YAAI,eAAe,OAAO;AACtB,iBAAO,IAAI,SAAS,IAAI;AAAA,QAC5B;AACA,eAAO,OAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,OAAO,GAAG;AAAA,MAC9E,CAAC,EAAE,KAAK,GAAG;AAAA,IACf;AAGA,uBAAmB,KAAK,kBAAkB,gBAAgB;AAE1D,WAAO;AAAA,EACX;AAAA;AAAA,EAGQ,kBAAkB,MAAsB;AAE5C,QAAI,SAAS,KAAK,QAAQ,2EAA2E,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO;AAC5H,YAAM,cAAc,GAAG,SAAS,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI;AAC/F,aAAO,GAAG,EAAE,GAAG,EAAE,IAAI,WAAW,GAAG,EAAE;AAAA,IACzC,CAAC;AAID,aAAS,OAAO,QAAQ,kGAAkG,CAAC,OAAO,IAAI,IAAI,OAAO;AAC7I,YAAM,cAAc,GAAG,SAAS,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI;AAC/F,aAAO,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,YAAoB,MAAa;AACnC,QAAI,KAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,GAAG,IAAI,CAAC;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,YAAoB,MAAa;AAClC,QAAI,KAAK,UAAU,MAAM,GAAG;AACxB,cAAQ,MAAM,KAAK,cAAc,QAAQ,SAAS,GAAG,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,KAAK,YAAoB,MAAa;AAClC,QAAI,KAAK,UAAU,MAAM,GAAG;AACxB,cAAQ,MAAM,KAAK,cAAc,QAAQ,SAAS,GAAG,IAAI,CAAC;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAoB,MAAa;AACnC,QAAI,KAAK,UAAU,OAAO,GAAG;AACzB,cAAQ,MAAM,KAAK,cAAc,SAAS,SAAS,GAAG,IAAI,CAAC;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA,EAGQ,UAAU,OAA0B;AACxC,UAAM,SAAqB,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAC5D,WAAO,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK;AAAA,EAC7D;AACJ;AAEO,IAAM,SAAS,IAAI,OAAO;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  logger
3
- } from "./chunk-6RIA6AJ3.js";
3
+ } from "./chunk-IFYMZLQI.js";
4
4
 
5
5
  // tools/confluence/utils/image-downloader.ts
6
6
  import fs from "fs";
@@ -122,4 +122,4 @@ var ImageDownloader = class {
122
122
  export {
123
123
  ImageDownloader
124
124
  };
125
- //# sourceMappingURL=chunk-R4YTIP7E.js.map
125
+ //# sourceMappingURL=chunk-JBDK5WP3.js.map