@wonseok-han/confluence-sync 1.8.0 โ†’ 2.0.0

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.
Files changed (518) hide show
  1. package/README.md +44 -410
  2. package/dist/cli/args.js +1 -1
  3. package/dist/cli/help.js +214 -115
  4. package/dist/cli/init.js +44 -5
  5. package/dist/cli/main.js +42 -11
  6. package/dist/cli/status.js +83 -0
  7. package/dist/confluence/client.js +121 -57
  8. package/dist/confluence/config.js +12 -8
  9. package/dist/confluence/env-file.js +23 -0
  10. package/dist/confluence/links.js +18 -0
  11. package/dist/conversion/asset-paths.js +5 -0
  12. package/dist/conversion/attachments.js +29 -7
  13. package/dist/conversion/convert.js +10 -22
  14. package/dist/conversion/footnotes.js +114 -11
  15. package/dist/conversion/markdown.js +26 -0
  16. package/dist/conversion/pdf-pages.js +10 -8
  17. package/dist/documents/anchors.js +9 -0
  18. package/dist/documents/callout-roundtrip.js +75 -0
  19. package/dist/documents/callouts.js +74 -0
  20. package/dist/documents/catalog.js +2 -2
  21. package/dist/documents/footnote-roundtrip.js +96 -0
  22. package/dist/documents/format.js +116 -0
  23. package/dist/documents/html-tables.js +30 -0
  24. package/dist/documents/html-to-markdown.js +47 -13
  25. package/dist/documents/markdown.js +46 -4
  26. package/dist/documents/obsidian.js +6 -3
  27. package/dist/documents/tables.js +89 -0
  28. package/dist/runtime/network.js +4 -0
  29. package/dist/shared/colors.js +2 -2
  30. package/dist/shared/progress.js +164 -0
  31. package/dist/shared/version.js +12 -0
  32. package/dist/site/assets/Monaco-LICENSE.txt +21 -0
  33. package/dist/site/assets/Monaco-ThirdPartyNotices.txt +448 -0
  34. package/dist/site/assets/PDFJS-LICENSE.txt +177 -0
  35. package/dist/site/assets/app.css +1 -0
  36. package/dist/site/assets/app.js +4 -0
  37. package/dist/site/assets/chunks/chunk-TEW74QPN.js +35 -0
  38. package/dist/site/assets/chunks/markdown-S6623E66.js +1 -0
  39. package/dist/site/assets/chunks/monaco-36ZGUH4Y.js +897 -0
  40. package/dist/site/assets/chunks/monaco-HFLEBJTI.css +1 -0
  41. package/dist/site/assets/chunks/pdf-DDN7TXTP.js +55 -0
  42. package/dist/site/assets/confluence-env-example.txt +32 -0
  43. package/dist/site/assets/editor.worker.js +1 -0
  44. package/dist/site/assets/favicon.svg +3 -0
  45. package/dist/site/assets/guide/01-account-settings.png +0 -0
  46. package/dist/site/assets/guide/02-atlassian-security.png +0 -0
  47. package/dist/site/assets/guide/03-api-tokens.png +0 -0
  48. package/dist/site/assets/guide/04-scope-api-token-step1.png +0 -0
  49. package/dist/site/assets/guide/05-scope-api-token-step2.png +0 -0
  50. package/dist/site/assets/guide/06-scope-api-token-step3.png +0 -0
  51. package/dist/site/assets/guide/07-scope-api-token-step4.png +0 -0
  52. package/dist/site/assets/guide/web/document-preview.png +0 -0
  53. package/dist/site/assets/guide/web/remote-diff.png +0 -0
  54. package/dist/site/assets/guide/web/sync-workspace.png +0 -0
  55. package/dist/site/assets/pdf/cmaps/78-EUC-H.bcmap +0 -0
  56. package/dist/site/assets/pdf/cmaps/78-EUC-V.bcmap +0 -0
  57. package/dist/site/assets/pdf/cmaps/78-H.bcmap +0 -0
  58. package/dist/site/assets/pdf/cmaps/78-RKSJ-H.bcmap +0 -0
  59. package/dist/site/assets/pdf/cmaps/78-RKSJ-V.bcmap +0 -0
  60. package/dist/site/assets/pdf/cmaps/78-V.bcmap +0 -0
  61. package/dist/site/assets/pdf/cmaps/78ms-RKSJ-H.bcmap +0 -0
  62. package/dist/site/assets/pdf/cmaps/78ms-RKSJ-V.bcmap +0 -0
  63. package/dist/site/assets/pdf/cmaps/83pv-RKSJ-H.bcmap +0 -0
  64. package/dist/site/assets/pdf/cmaps/90ms-RKSJ-H.bcmap +0 -0
  65. package/dist/site/assets/pdf/cmaps/90ms-RKSJ-V.bcmap +0 -0
  66. package/dist/site/assets/pdf/cmaps/90msp-RKSJ-H.bcmap +0 -0
  67. package/dist/site/assets/pdf/cmaps/90msp-RKSJ-V.bcmap +0 -0
  68. package/dist/site/assets/pdf/cmaps/90pv-RKSJ-H.bcmap +0 -0
  69. package/dist/site/assets/pdf/cmaps/90pv-RKSJ-V.bcmap +0 -0
  70. package/dist/site/assets/pdf/cmaps/Add-H.bcmap +0 -0
  71. package/dist/site/assets/pdf/cmaps/Add-RKSJ-H.bcmap +0 -0
  72. package/dist/site/assets/pdf/cmaps/Add-RKSJ-V.bcmap +0 -0
  73. package/dist/site/assets/pdf/cmaps/Add-V.bcmap +0 -0
  74. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-0.bcmap +0 -0
  75. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-1.bcmap +0 -0
  76. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-2.bcmap +0 -0
  77. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-3.bcmap +0 -0
  78. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-4.bcmap +0 -0
  79. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-5.bcmap +0 -0
  80. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-6.bcmap +0 -0
  81. package/dist/site/assets/pdf/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  82. package/dist/site/assets/pdf/cmaps/Adobe-GB1-0.bcmap +0 -0
  83. package/dist/site/assets/pdf/cmaps/Adobe-GB1-1.bcmap +0 -0
  84. package/dist/site/assets/pdf/cmaps/Adobe-GB1-2.bcmap +0 -0
  85. package/dist/site/assets/pdf/cmaps/Adobe-GB1-3.bcmap +0 -0
  86. package/dist/site/assets/pdf/cmaps/Adobe-GB1-4.bcmap +0 -0
  87. package/dist/site/assets/pdf/cmaps/Adobe-GB1-5.bcmap +0 -0
  88. package/dist/site/assets/pdf/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  89. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-0.bcmap +0 -0
  90. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-1.bcmap +0 -0
  91. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-2.bcmap +0 -0
  92. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-3.bcmap +0 -0
  93. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-4.bcmap +0 -0
  94. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-5.bcmap +0 -0
  95. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-6.bcmap +0 -0
  96. package/dist/site/assets/pdf/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  97. package/dist/site/assets/pdf/cmaps/Adobe-Korea1-0.bcmap +0 -0
  98. package/dist/site/assets/pdf/cmaps/Adobe-Korea1-1.bcmap +0 -0
  99. package/dist/site/assets/pdf/cmaps/Adobe-Korea1-2.bcmap +0 -0
  100. package/dist/site/assets/pdf/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  101. package/dist/site/assets/pdf/cmaps/B5-H.bcmap +0 -0
  102. package/dist/site/assets/pdf/cmaps/B5-V.bcmap +0 -0
  103. package/dist/site/assets/pdf/cmaps/B5pc-H.bcmap +0 -0
  104. package/dist/site/assets/pdf/cmaps/B5pc-V.bcmap +0 -0
  105. package/dist/site/assets/pdf/cmaps/CNS-EUC-H.bcmap +0 -0
  106. package/dist/site/assets/pdf/cmaps/CNS-EUC-V.bcmap +0 -0
  107. package/dist/site/assets/pdf/cmaps/CNS1-H.bcmap +0 -0
  108. package/dist/site/assets/pdf/cmaps/CNS1-V.bcmap +0 -0
  109. package/dist/site/assets/pdf/cmaps/CNS2-H.bcmap +0 -0
  110. package/dist/site/assets/pdf/cmaps/CNS2-V.bcmap +3 -0
  111. package/dist/site/assets/pdf/cmaps/ETHK-B5-H.bcmap +0 -0
  112. package/dist/site/assets/pdf/cmaps/ETHK-B5-V.bcmap +0 -0
  113. package/dist/site/assets/pdf/cmaps/ETen-B5-H.bcmap +0 -0
  114. package/dist/site/assets/pdf/cmaps/ETen-B5-V.bcmap +0 -0
  115. package/dist/site/assets/pdf/cmaps/ETenms-B5-H.bcmap +3 -0
  116. package/dist/site/assets/pdf/cmaps/ETenms-B5-V.bcmap +0 -0
  117. package/dist/site/assets/pdf/cmaps/EUC-H.bcmap +0 -0
  118. package/dist/site/assets/pdf/cmaps/EUC-V.bcmap +0 -0
  119. package/dist/site/assets/pdf/cmaps/Ext-H.bcmap +0 -0
  120. package/dist/site/assets/pdf/cmaps/Ext-RKSJ-H.bcmap +0 -0
  121. package/dist/site/assets/pdf/cmaps/Ext-RKSJ-V.bcmap +0 -0
  122. package/dist/site/assets/pdf/cmaps/Ext-V.bcmap +0 -0
  123. package/dist/site/assets/pdf/cmaps/GB-EUC-H.bcmap +0 -0
  124. package/dist/site/assets/pdf/cmaps/GB-EUC-V.bcmap +0 -0
  125. package/dist/site/assets/pdf/cmaps/GB-H.bcmap +4 -0
  126. package/dist/site/assets/pdf/cmaps/GB-V.bcmap +0 -0
  127. package/dist/site/assets/pdf/cmaps/GBK-EUC-H.bcmap +0 -0
  128. package/dist/site/assets/pdf/cmaps/GBK-EUC-V.bcmap +0 -0
  129. package/dist/site/assets/pdf/cmaps/GBK2K-H.bcmap +0 -0
  130. package/dist/site/assets/pdf/cmaps/GBK2K-V.bcmap +0 -0
  131. package/dist/site/assets/pdf/cmaps/GBKp-EUC-H.bcmap +0 -0
  132. package/dist/site/assets/pdf/cmaps/GBKp-EUC-V.bcmap +0 -0
  133. package/dist/site/assets/pdf/cmaps/GBT-EUC-H.bcmap +0 -0
  134. package/dist/site/assets/pdf/cmaps/GBT-EUC-V.bcmap +0 -0
  135. package/dist/site/assets/pdf/cmaps/GBT-H.bcmap +0 -0
  136. package/dist/site/assets/pdf/cmaps/GBT-V.bcmap +0 -0
  137. package/dist/site/assets/pdf/cmaps/GBTpc-EUC-H.bcmap +0 -0
  138. package/dist/site/assets/pdf/cmaps/GBTpc-EUC-V.bcmap +0 -0
  139. package/dist/site/assets/pdf/cmaps/GBpc-EUC-H.bcmap +0 -0
  140. package/dist/site/assets/pdf/cmaps/GBpc-EUC-V.bcmap +0 -0
  141. package/dist/site/assets/pdf/cmaps/H.bcmap +0 -0
  142. package/dist/site/assets/pdf/cmaps/HKdla-B5-H.bcmap +0 -0
  143. package/dist/site/assets/pdf/cmaps/HKdla-B5-V.bcmap +0 -0
  144. package/dist/site/assets/pdf/cmaps/HKdlb-B5-H.bcmap +0 -0
  145. package/dist/site/assets/pdf/cmaps/HKdlb-B5-V.bcmap +0 -0
  146. package/dist/site/assets/pdf/cmaps/HKgccs-B5-H.bcmap +0 -0
  147. package/dist/site/assets/pdf/cmaps/HKgccs-B5-V.bcmap +0 -0
  148. package/dist/site/assets/pdf/cmaps/HKm314-B5-H.bcmap +0 -0
  149. package/dist/site/assets/pdf/cmaps/HKm314-B5-V.bcmap +0 -0
  150. package/dist/site/assets/pdf/cmaps/HKm471-B5-H.bcmap +0 -0
  151. package/dist/site/assets/pdf/cmaps/HKm471-B5-V.bcmap +0 -0
  152. package/dist/site/assets/pdf/cmaps/HKscs-B5-H.bcmap +0 -0
  153. package/dist/site/assets/pdf/cmaps/HKscs-B5-V.bcmap +0 -0
  154. package/dist/site/assets/pdf/cmaps/Hankaku.bcmap +0 -0
  155. package/dist/site/assets/pdf/cmaps/Hiragana.bcmap +0 -0
  156. package/dist/site/assets/pdf/cmaps/KSC-EUC-H.bcmap +0 -0
  157. package/dist/site/assets/pdf/cmaps/KSC-EUC-V.bcmap +0 -0
  158. package/dist/site/assets/pdf/cmaps/KSC-H.bcmap +0 -0
  159. package/dist/site/assets/pdf/cmaps/KSC-Johab-H.bcmap +0 -0
  160. package/dist/site/assets/pdf/cmaps/KSC-Johab-V.bcmap +0 -0
  161. package/dist/site/assets/pdf/cmaps/KSC-V.bcmap +0 -0
  162. package/dist/site/assets/pdf/cmaps/KSCms-UHC-H.bcmap +0 -0
  163. package/dist/site/assets/pdf/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  164. package/dist/site/assets/pdf/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  165. package/dist/site/assets/pdf/cmaps/KSCms-UHC-V.bcmap +0 -0
  166. package/dist/site/assets/pdf/cmaps/KSCpc-EUC-H.bcmap +0 -0
  167. package/dist/site/assets/pdf/cmaps/KSCpc-EUC-V.bcmap +0 -0
  168. package/dist/site/assets/pdf/cmaps/Katakana.bcmap +0 -0
  169. package/dist/site/assets/pdf/cmaps/LICENSE +36 -0
  170. package/dist/site/assets/pdf/cmaps/NWP-H.bcmap +0 -0
  171. package/dist/site/assets/pdf/cmaps/NWP-V.bcmap +0 -0
  172. package/dist/site/assets/pdf/cmaps/RKSJ-H.bcmap +0 -0
  173. package/dist/site/assets/pdf/cmaps/RKSJ-V.bcmap +0 -0
  174. package/dist/site/assets/pdf/cmaps/Roman.bcmap +0 -0
  175. package/dist/site/assets/pdf/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  176. package/dist/site/assets/pdf/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  177. package/dist/site/assets/pdf/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  178. package/dist/site/assets/pdf/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  179. package/dist/site/assets/pdf/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  180. package/dist/site/assets/pdf/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  181. package/dist/site/assets/pdf/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  182. package/dist/site/assets/pdf/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  183. package/dist/site/assets/pdf/cmaps/UniGB-UCS2-H.bcmap +0 -0
  184. package/dist/site/assets/pdf/cmaps/UniGB-UCS2-V.bcmap +0 -0
  185. package/dist/site/assets/pdf/cmaps/UniGB-UTF16-H.bcmap +0 -0
  186. package/dist/site/assets/pdf/cmaps/UniGB-UTF16-V.bcmap +0 -0
  187. package/dist/site/assets/pdf/cmaps/UniGB-UTF32-H.bcmap +0 -0
  188. package/dist/site/assets/pdf/cmaps/UniGB-UTF32-V.bcmap +0 -0
  189. package/dist/site/assets/pdf/cmaps/UniGB-UTF8-H.bcmap +0 -0
  190. package/dist/site/assets/pdf/cmaps/UniGB-UTF8-V.bcmap +0 -0
  191. package/dist/site/assets/pdf/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  192. package/dist/site/assets/pdf/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  193. package/dist/site/assets/pdf/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  194. package/dist/site/assets/pdf/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  195. package/dist/site/assets/pdf/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  196. package/dist/site/assets/pdf/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  197. package/dist/site/assets/pdf/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  198. package/dist/site/assets/pdf/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  199. package/dist/site/assets/pdf/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  200. package/dist/site/assets/pdf/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  201. package/dist/site/assets/pdf/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  202. package/dist/site/assets/pdf/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  203. package/dist/site/assets/pdf/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  204. package/dist/site/assets/pdf/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  205. package/dist/site/assets/pdf/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  206. package/dist/site/assets/pdf/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  207. package/dist/site/assets/pdf/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  208. package/dist/site/assets/pdf/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  209. package/dist/site/assets/pdf/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  210. package/dist/site/assets/pdf/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  211. package/dist/site/assets/pdf/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  212. package/dist/site/assets/pdf/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  213. package/dist/site/assets/pdf/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  214. package/dist/site/assets/pdf/cmaps/UniKS-UCS2-H.bcmap +0 -0
  215. package/dist/site/assets/pdf/cmaps/UniKS-UCS2-V.bcmap +0 -0
  216. package/dist/site/assets/pdf/cmaps/UniKS-UTF16-H.bcmap +0 -0
  217. package/dist/site/assets/pdf/cmaps/UniKS-UTF16-V.bcmap +0 -0
  218. package/dist/site/assets/pdf/cmaps/UniKS-UTF32-H.bcmap +0 -0
  219. package/dist/site/assets/pdf/cmaps/UniKS-UTF32-V.bcmap +0 -0
  220. package/dist/site/assets/pdf/cmaps/UniKS-UTF8-H.bcmap +0 -0
  221. package/dist/site/assets/pdf/cmaps/UniKS-UTF8-V.bcmap +0 -0
  222. package/dist/site/assets/pdf/cmaps/V.bcmap +0 -0
  223. package/dist/site/assets/pdf/cmaps/WP-Symbol.bcmap +0 -0
  224. package/dist/site/assets/pdf/standard_fonts/FoxitDingbats.pfb +0 -0
  225. package/dist/site/assets/pdf/standard_fonts/FoxitFixed.pfb +0 -0
  226. package/dist/site/assets/pdf/standard_fonts/FoxitFixedBold.pfb +0 -0
  227. package/dist/site/assets/pdf/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  228. package/dist/site/assets/pdf/standard_fonts/FoxitFixedItalic.pfb +0 -0
  229. package/dist/site/assets/pdf/standard_fonts/FoxitSerif.pfb +0 -0
  230. package/dist/site/assets/pdf/standard_fonts/FoxitSerifBold.pfb +0 -0
  231. package/dist/site/assets/pdf/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  232. package/dist/site/assets/pdf/standard_fonts/FoxitSerifItalic.pfb +0 -0
  233. package/dist/site/assets/pdf/standard_fonts/FoxitSymbol.pfb +0 -0
  234. package/dist/site/assets/pdf/standard_fonts/LICENSE_FOXIT +27 -0
  235. package/dist/site/assets/pdf/standard_fonts/LICENSE_LIBERATION +363 -0
  236. package/dist/site/assets/pdf/standard_fonts/LiberationSans-Bold.ttf +0 -0
  237. package/dist/site/assets/pdf/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  238. package/dist/site/assets/pdf/standard_fonts/LiberationSans-Italic.ttf +0 -0
  239. package/dist/site/assets/pdf/standard_fonts/LiberationSans-Regular.ttf +0 -0
  240. package/dist/site/assets/pdf/wasm/LICENSE_JBIG2 +196 -0
  241. package/dist/site/assets/pdf/wasm/LICENSE_OPENJPEG +39 -0
  242. package/dist/site/assets/pdf/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  243. package/dist/site/assets/pdf/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  244. package/dist/site/assets/pdf/wasm/LICENSE_PDFJS_QCMS +19 -0
  245. package/dist/site/assets/pdf/wasm/LICENSE_QCMS +21 -0
  246. package/dist/site/assets/pdf/wasm/jbig2.wasm +0 -0
  247. package/dist/site/assets/pdf/wasm/jbig2_nowasm_fallback.js +15 -0
  248. package/dist/site/assets/pdf/wasm/openjpeg.wasm +0 -0
  249. package/dist/site/assets/pdf/wasm/openjpeg_nowasm_fallback.js +17 -0
  250. package/dist/site/assets/pdf/wasm/qcms_bg.wasm +0 -0
  251. package/dist/site/assets/pdf/wasm/quickjs-eval.js +16 -0
  252. package/dist/site/assets/pdf/wasm/quickjs-eval.wasm +0 -0
  253. package/dist/site/assets/pdf.worker.min.mjs +29 -0
  254. package/dist/site/assets/workspace.worker.js +409 -0
  255. package/dist/site/index.html +253 -0
  256. package/dist/sync/baseline.js +45 -0
  257. package/dist/sync/changes.js +51 -0
  258. package/dist/sync/diff.js +80 -0
  259. package/dist/sync/fetch.js +287 -0
  260. package/dist/sync/ignore.js +4 -4
  261. package/dist/sync/local-state.js +12 -0
  262. package/dist/sync/mapping.js +31 -8
  263. package/dist/sync/metadata.js +57 -0
  264. package/dist/sync/prepare.js +52 -0
  265. package/dist/sync/pull.js +618 -141
  266. package/dist/sync/push.js +260 -213
  267. package/dist/sync/reconcile.js +51 -0
  268. package/dist/sync/references.js +2 -2
  269. package/dist/sync/remap.js +17 -5
  270. package/dist/sync/render.js +3 -2
  271. package/dist/sync/restore.js +28 -0
  272. package/dist/sync/scope.js +47 -0
  273. package/dist/sync/staging.js +193 -0
  274. package/dist/sync/workspace.js +100 -0
  275. package/dist/web/assets/PDFJS-LICENSE.txt +177 -0
  276. package/dist/web/assets/app.css +1 -1
  277. package/dist/web/assets/app.js +3 -938
  278. package/dist/web/assets/chunks/chunk-TEW74QPN.js +35 -0
  279. package/dist/web/assets/chunks/markdown-S6623E66.js +1 -0
  280. package/dist/web/assets/chunks/monaco-36ZGUH4Y.js +897 -0
  281. package/dist/web/assets/chunks/monaco-HFLEBJTI.css +1 -0
  282. package/dist/web/assets/chunks/pdf-DDN7TXTP.js +55 -0
  283. package/dist/web/assets/confluence-env-example.txt +32 -0
  284. package/dist/web/assets/editor.worker.js +1 -30
  285. package/dist/web/assets/favicon.svg +3 -0
  286. package/dist/web/assets/guide/01-account-settings.png +0 -0
  287. package/dist/web/assets/guide/02-atlassian-security.png +0 -0
  288. package/dist/web/assets/guide/03-api-tokens.png +0 -0
  289. package/dist/web/assets/guide/04-scope-api-token-step1.png +0 -0
  290. package/dist/web/assets/guide/05-scope-api-token-step2.png +0 -0
  291. package/dist/web/assets/guide/06-scope-api-token-step3.png +0 -0
  292. package/dist/web/assets/guide/07-scope-api-token-step4.png +0 -0
  293. package/dist/web/assets/guide/web/document-preview.png +0 -0
  294. package/dist/web/assets/guide/web/remote-diff.png +0 -0
  295. package/dist/web/assets/guide/web/sync-workspace.png +0 -0
  296. package/dist/web/assets/pdf/cmaps/78-EUC-H.bcmap +0 -0
  297. package/dist/web/assets/pdf/cmaps/78-EUC-V.bcmap +0 -0
  298. package/dist/web/assets/pdf/cmaps/78-H.bcmap +0 -0
  299. package/dist/web/assets/pdf/cmaps/78-RKSJ-H.bcmap +0 -0
  300. package/dist/web/assets/pdf/cmaps/78-RKSJ-V.bcmap +0 -0
  301. package/dist/web/assets/pdf/cmaps/78-V.bcmap +0 -0
  302. package/dist/web/assets/pdf/cmaps/78ms-RKSJ-H.bcmap +0 -0
  303. package/dist/web/assets/pdf/cmaps/78ms-RKSJ-V.bcmap +0 -0
  304. package/dist/web/assets/pdf/cmaps/83pv-RKSJ-H.bcmap +0 -0
  305. package/dist/web/assets/pdf/cmaps/90ms-RKSJ-H.bcmap +0 -0
  306. package/dist/web/assets/pdf/cmaps/90ms-RKSJ-V.bcmap +0 -0
  307. package/dist/web/assets/pdf/cmaps/90msp-RKSJ-H.bcmap +0 -0
  308. package/dist/web/assets/pdf/cmaps/90msp-RKSJ-V.bcmap +0 -0
  309. package/dist/web/assets/pdf/cmaps/90pv-RKSJ-H.bcmap +0 -0
  310. package/dist/web/assets/pdf/cmaps/90pv-RKSJ-V.bcmap +0 -0
  311. package/dist/web/assets/pdf/cmaps/Add-H.bcmap +0 -0
  312. package/dist/web/assets/pdf/cmaps/Add-RKSJ-H.bcmap +0 -0
  313. package/dist/web/assets/pdf/cmaps/Add-RKSJ-V.bcmap +0 -0
  314. package/dist/web/assets/pdf/cmaps/Add-V.bcmap +0 -0
  315. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-0.bcmap +0 -0
  316. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-1.bcmap +0 -0
  317. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-2.bcmap +0 -0
  318. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-3.bcmap +0 -0
  319. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-4.bcmap +0 -0
  320. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-5.bcmap +0 -0
  321. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-6.bcmap +0 -0
  322. package/dist/web/assets/pdf/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  323. package/dist/web/assets/pdf/cmaps/Adobe-GB1-0.bcmap +0 -0
  324. package/dist/web/assets/pdf/cmaps/Adobe-GB1-1.bcmap +0 -0
  325. package/dist/web/assets/pdf/cmaps/Adobe-GB1-2.bcmap +0 -0
  326. package/dist/web/assets/pdf/cmaps/Adobe-GB1-3.bcmap +0 -0
  327. package/dist/web/assets/pdf/cmaps/Adobe-GB1-4.bcmap +0 -0
  328. package/dist/web/assets/pdf/cmaps/Adobe-GB1-5.bcmap +0 -0
  329. package/dist/web/assets/pdf/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  330. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-0.bcmap +0 -0
  331. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-1.bcmap +0 -0
  332. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-2.bcmap +0 -0
  333. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-3.bcmap +0 -0
  334. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-4.bcmap +0 -0
  335. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-5.bcmap +0 -0
  336. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-6.bcmap +0 -0
  337. package/dist/web/assets/pdf/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  338. package/dist/web/assets/pdf/cmaps/Adobe-Korea1-0.bcmap +0 -0
  339. package/dist/web/assets/pdf/cmaps/Adobe-Korea1-1.bcmap +0 -0
  340. package/dist/web/assets/pdf/cmaps/Adobe-Korea1-2.bcmap +0 -0
  341. package/dist/web/assets/pdf/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  342. package/dist/web/assets/pdf/cmaps/B5-H.bcmap +0 -0
  343. package/dist/web/assets/pdf/cmaps/B5-V.bcmap +0 -0
  344. package/dist/web/assets/pdf/cmaps/B5pc-H.bcmap +0 -0
  345. package/dist/web/assets/pdf/cmaps/B5pc-V.bcmap +0 -0
  346. package/dist/web/assets/pdf/cmaps/CNS-EUC-H.bcmap +0 -0
  347. package/dist/web/assets/pdf/cmaps/CNS-EUC-V.bcmap +0 -0
  348. package/dist/web/assets/pdf/cmaps/CNS1-H.bcmap +0 -0
  349. package/dist/web/assets/pdf/cmaps/CNS1-V.bcmap +0 -0
  350. package/dist/web/assets/pdf/cmaps/CNS2-H.bcmap +0 -0
  351. package/dist/web/assets/pdf/cmaps/CNS2-V.bcmap +3 -0
  352. package/dist/web/assets/pdf/cmaps/ETHK-B5-H.bcmap +0 -0
  353. package/dist/web/assets/pdf/cmaps/ETHK-B5-V.bcmap +0 -0
  354. package/dist/web/assets/pdf/cmaps/ETen-B5-H.bcmap +0 -0
  355. package/dist/web/assets/pdf/cmaps/ETen-B5-V.bcmap +0 -0
  356. package/dist/web/assets/pdf/cmaps/ETenms-B5-H.bcmap +3 -0
  357. package/dist/web/assets/pdf/cmaps/ETenms-B5-V.bcmap +0 -0
  358. package/dist/web/assets/pdf/cmaps/EUC-H.bcmap +0 -0
  359. package/dist/web/assets/pdf/cmaps/EUC-V.bcmap +0 -0
  360. package/dist/web/assets/pdf/cmaps/Ext-H.bcmap +0 -0
  361. package/dist/web/assets/pdf/cmaps/Ext-RKSJ-H.bcmap +0 -0
  362. package/dist/web/assets/pdf/cmaps/Ext-RKSJ-V.bcmap +0 -0
  363. package/dist/web/assets/pdf/cmaps/Ext-V.bcmap +0 -0
  364. package/dist/web/assets/pdf/cmaps/GB-EUC-H.bcmap +0 -0
  365. package/dist/web/assets/pdf/cmaps/GB-EUC-V.bcmap +0 -0
  366. package/dist/web/assets/pdf/cmaps/GB-H.bcmap +4 -0
  367. package/dist/web/assets/pdf/cmaps/GB-V.bcmap +0 -0
  368. package/dist/web/assets/pdf/cmaps/GBK-EUC-H.bcmap +0 -0
  369. package/dist/web/assets/pdf/cmaps/GBK-EUC-V.bcmap +0 -0
  370. package/dist/web/assets/pdf/cmaps/GBK2K-H.bcmap +0 -0
  371. package/dist/web/assets/pdf/cmaps/GBK2K-V.bcmap +0 -0
  372. package/dist/web/assets/pdf/cmaps/GBKp-EUC-H.bcmap +0 -0
  373. package/dist/web/assets/pdf/cmaps/GBKp-EUC-V.bcmap +0 -0
  374. package/dist/web/assets/pdf/cmaps/GBT-EUC-H.bcmap +0 -0
  375. package/dist/web/assets/pdf/cmaps/GBT-EUC-V.bcmap +0 -0
  376. package/dist/web/assets/pdf/cmaps/GBT-H.bcmap +0 -0
  377. package/dist/web/assets/pdf/cmaps/GBT-V.bcmap +0 -0
  378. package/dist/web/assets/pdf/cmaps/GBTpc-EUC-H.bcmap +0 -0
  379. package/dist/web/assets/pdf/cmaps/GBTpc-EUC-V.bcmap +0 -0
  380. package/dist/web/assets/pdf/cmaps/GBpc-EUC-H.bcmap +0 -0
  381. package/dist/web/assets/pdf/cmaps/GBpc-EUC-V.bcmap +0 -0
  382. package/dist/web/assets/pdf/cmaps/H.bcmap +0 -0
  383. package/dist/web/assets/pdf/cmaps/HKdla-B5-H.bcmap +0 -0
  384. package/dist/web/assets/pdf/cmaps/HKdla-B5-V.bcmap +0 -0
  385. package/dist/web/assets/pdf/cmaps/HKdlb-B5-H.bcmap +0 -0
  386. package/dist/web/assets/pdf/cmaps/HKdlb-B5-V.bcmap +0 -0
  387. package/dist/web/assets/pdf/cmaps/HKgccs-B5-H.bcmap +0 -0
  388. package/dist/web/assets/pdf/cmaps/HKgccs-B5-V.bcmap +0 -0
  389. package/dist/web/assets/pdf/cmaps/HKm314-B5-H.bcmap +0 -0
  390. package/dist/web/assets/pdf/cmaps/HKm314-B5-V.bcmap +0 -0
  391. package/dist/web/assets/pdf/cmaps/HKm471-B5-H.bcmap +0 -0
  392. package/dist/web/assets/pdf/cmaps/HKm471-B5-V.bcmap +0 -0
  393. package/dist/web/assets/pdf/cmaps/HKscs-B5-H.bcmap +0 -0
  394. package/dist/web/assets/pdf/cmaps/HKscs-B5-V.bcmap +0 -0
  395. package/dist/web/assets/pdf/cmaps/Hankaku.bcmap +0 -0
  396. package/dist/web/assets/pdf/cmaps/Hiragana.bcmap +0 -0
  397. package/dist/web/assets/pdf/cmaps/KSC-EUC-H.bcmap +0 -0
  398. package/dist/web/assets/pdf/cmaps/KSC-EUC-V.bcmap +0 -0
  399. package/dist/web/assets/pdf/cmaps/KSC-H.bcmap +0 -0
  400. package/dist/web/assets/pdf/cmaps/KSC-Johab-H.bcmap +0 -0
  401. package/dist/web/assets/pdf/cmaps/KSC-Johab-V.bcmap +0 -0
  402. package/dist/web/assets/pdf/cmaps/KSC-V.bcmap +0 -0
  403. package/dist/web/assets/pdf/cmaps/KSCms-UHC-H.bcmap +0 -0
  404. package/dist/web/assets/pdf/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  405. package/dist/web/assets/pdf/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  406. package/dist/web/assets/pdf/cmaps/KSCms-UHC-V.bcmap +0 -0
  407. package/dist/web/assets/pdf/cmaps/KSCpc-EUC-H.bcmap +0 -0
  408. package/dist/web/assets/pdf/cmaps/KSCpc-EUC-V.bcmap +0 -0
  409. package/dist/web/assets/pdf/cmaps/Katakana.bcmap +0 -0
  410. package/dist/web/assets/pdf/cmaps/LICENSE +36 -0
  411. package/dist/web/assets/pdf/cmaps/NWP-H.bcmap +0 -0
  412. package/dist/web/assets/pdf/cmaps/NWP-V.bcmap +0 -0
  413. package/dist/web/assets/pdf/cmaps/RKSJ-H.bcmap +0 -0
  414. package/dist/web/assets/pdf/cmaps/RKSJ-V.bcmap +0 -0
  415. package/dist/web/assets/pdf/cmaps/Roman.bcmap +0 -0
  416. package/dist/web/assets/pdf/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  417. package/dist/web/assets/pdf/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  418. package/dist/web/assets/pdf/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  419. package/dist/web/assets/pdf/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  420. package/dist/web/assets/pdf/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  421. package/dist/web/assets/pdf/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  422. package/dist/web/assets/pdf/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  423. package/dist/web/assets/pdf/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  424. package/dist/web/assets/pdf/cmaps/UniGB-UCS2-H.bcmap +0 -0
  425. package/dist/web/assets/pdf/cmaps/UniGB-UCS2-V.bcmap +0 -0
  426. package/dist/web/assets/pdf/cmaps/UniGB-UTF16-H.bcmap +0 -0
  427. package/dist/web/assets/pdf/cmaps/UniGB-UTF16-V.bcmap +0 -0
  428. package/dist/web/assets/pdf/cmaps/UniGB-UTF32-H.bcmap +0 -0
  429. package/dist/web/assets/pdf/cmaps/UniGB-UTF32-V.bcmap +0 -0
  430. package/dist/web/assets/pdf/cmaps/UniGB-UTF8-H.bcmap +0 -0
  431. package/dist/web/assets/pdf/cmaps/UniGB-UTF8-V.bcmap +0 -0
  432. package/dist/web/assets/pdf/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  433. package/dist/web/assets/pdf/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  434. package/dist/web/assets/pdf/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  435. package/dist/web/assets/pdf/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  436. package/dist/web/assets/pdf/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  437. package/dist/web/assets/pdf/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  438. package/dist/web/assets/pdf/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  439. package/dist/web/assets/pdf/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  440. package/dist/web/assets/pdf/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  441. package/dist/web/assets/pdf/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  442. package/dist/web/assets/pdf/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  443. package/dist/web/assets/pdf/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  444. package/dist/web/assets/pdf/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  445. package/dist/web/assets/pdf/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  446. package/dist/web/assets/pdf/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  447. package/dist/web/assets/pdf/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  448. package/dist/web/assets/pdf/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  449. package/dist/web/assets/pdf/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  450. package/dist/web/assets/pdf/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  451. package/dist/web/assets/pdf/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  452. package/dist/web/assets/pdf/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  453. package/dist/web/assets/pdf/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  454. package/dist/web/assets/pdf/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  455. package/dist/web/assets/pdf/cmaps/UniKS-UCS2-H.bcmap +0 -0
  456. package/dist/web/assets/pdf/cmaps/UniKS-UCS2-V.bcmap +0 -0
  457. package/dist/web/assets/pdf/cmaps/UniKS-UTF16-H.bcmap +0 -0
  458. package/dist/web/assets/pdf/cmaps/UniKS-UTF16-V.bcmap +0 -0
  459. package/dist/web/assets/pdf/cmaps/UniKS-UTF32-H.bcmap +0 -0
  460. package/dist/web/assets/pdf/cmaps/UniKS-UTF32-V.bcmap +0 -0
  461. package/dist/web/assets/pdf/cmaps/UniKS-UTF8-H.bcmap +0 -0
  462. package/dist/web/assets/pdf/cmaps/UniKS-UTF8-V.bcmap +0 -0
  463. package/dist/web/assets/pdf/cmaps/V.bcmap +0 -0
  464. package/dist/web/assets/pdf/cmaps/WP-Symbol.bcmap +0 -0
  465. package/dist/web/assets/pdf/standard_fonts/FoxitDingbats.pfb +0 -0
  466. package/dist/web/assets/pdf/standard_fonts/FoxitFixed.pfb +0 -0
  467. package/dist/web/assets/pdf/standard_fonts/FoxitFixedBold.pfb +0 -0
  468. package/dist/web/assets/pdf/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  469. package/dist/web/assets/pdf/standard_fonts/FoxitFixedItalic.pfb +0 -0
  470. package/dist/web/assets/pdf/standard_fonts/FoxitSerif.pfb +0 -0
  471. package/dist/web/assets/pdf/standard_fonts/FoxitSerifBold.pfb +0 -0
  472. package/dist/web/assets/pdf/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  473. package/dist/web/assets/pdf/standard_fonts/FoxitSerifItalic.pfb +0 -0
  474. package/dist/web/assets/pdf/standard_fonts/FoxitSymbol.pfb +0 -0
  475. package/dist/web/assets/pdf/standard_fonts/LICENSE_FOXIT +27 -0
  476. package/dist/web/assets/pdf/standard_fonts/LICENSE_LIBERATION +363 -0
  477. package/dist/web/assets/pdf/standard_fonts/LiberationSans-Bold.ttf +0 -0
  478. package/dist/web/assets/pdf/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  479. package/dist/web/assets/pdf/standard_fonts/LiberationSans-Italic.ttf +0 -0
  480. package/dist/web/assets/pdf/standard_fonts/LiberationSans-Regular.ttf +0 -0
  481. package/dist/web/assets/pdf/wasm/LICENSE_JBIG2 +196 -0
  482. package/dist/web/assets/pdf/wasm/LICENSE_OPENJPEG +39 -0
  483. package/dist/web/assets/pdf/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  484. package/dist/web/assets/pdf/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  485. package/dist/web/assets/pdf/wasm/LICENSE_PDFJS_QCMS +19 -0
  486. package/dist/web/assets/pdf/wasm/LICENSE_QCMS +21 -0
  487. package/dist/web/assets/pdf/wasm/jbig2.wasm +0 -0
  488. package/dist/web/assets/pdf/wasm/jbig2_nowasm_fallback.js +15 -0
  489. package/dist/web/assets/pdf/wasm/openjpeg.wasm +0 -0
  490. package/dist/web/assets/pdf/wasm/openjpeg_nowasm_fallback.js +17 -0
  491. package/dist/web/assets/pdf/wasm/qcms_bg.wasm +0 -0
  492. package/dist/web/assets/pdf/wasm/quickjs-eval.js +16 -0
  493. package/dist/web/assets/pdf/wasm/quickjs-eval.wasm +0 -0
  494. package/dist/web/assets/pdf.worker.min.mjs +29 -0
  495. package/dist/web/assets/workspace.worker.js +409 -0
  496. package/dist/web/document-source.js +14 -0
  497. package/dist/web/hosted-files.js +189 -0
  498. package/dist/web/hosted.js +316 -0
  499. package/dist/web/node-runner.js +26 -0
  500. package/dist/web/preview.js +74 -0
  501. package/dist/web/server.js +85 -240
  502. package/dist/web/sync.js +364 -70
  503. package/dist/web/table-editor-script.js +99 -0
  504. package/dist/web/table-format.js +224 -0
  505. package/dist/web/views/help.js +15 -10
  506. package/dist/web/views/sync-panel.js +90 -19
  507. package/dist/web/views/token-guide.js +27 -0
  508. package/dist/web/views/usage-guide.js +12 -0
  509. package/dist/web/views/workspace.js +85 -15
  510. package/dist/web/workspace-api.js +371 -0
  511. package/docs/user/CLI.md +366 -0
  512. package/docs/user/CONFIGURATION.md +125 -0
  513. package/docs/user/OBSIDIAN.md +117 -0
  514. package/docs/user/WEB.md +90 -0
  515. package/docs/user/images/web/document-preview.png +0 -0
  516. package/docs/user/images/web/remote-diff.png +0 -0
  517. package/docs/user/images/web/sync-workspace.png +0 -0
  518. package/package.json +23 -6
@@ -0,0 +1,224 @@
1
+ import { readFile, realpath, stat, mkdtemp, writeFile, rename, rm } from 'node:fs/promises';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { dirname, join } from 'node:path';
4
+ import { createDocument } from '@mixmark-io/domino';
5
+ import { htmlTableMarkdown } from '../documents/html-tables.js';
6
+ import { splitFrontmatter } from '../documents/obsidian.js';
7
+ import { applyTableWidths, tableWidths } from '../documents/tables.js';
8
+ import { formatDocument } from '../documents/format.js';
9
+ import { readPreviewSource } from './document-source.js';
10
+ export const sourceHash = (source) => createHash('sha256').update(source).digest('hex');
11
+ /** Source ranges come from Markdown tokens, never from the preview's sanitized HTML. */
12
+ function targets(source) {
13
+ const { body } = splitFrontmatter(source);
14
+ const prefix = source.length - body.length;
15
+ const lines = body.split('\n');
16
+ const offsets = [prefix];
17
+ for (const line of lines)
18
+ offsets.push(offsets.at(-1) + line.length + 1);
19
+ const md = htmlTableMarkdown();
20
+ const tokens = md.parse(body, {});
21
+ const result = [];
22
+ for (let i = 0; i < tokens.length; i++) {
23
+ const token = tokens[i];
24
+ if (token.type === 'table_open' && token.map) {
25
+ let end = i;
26
+ while (tokens[end]?.type !== 'table_close')
27
+ end++;
28
+ result.push(token.level === 0 ? { start: offsets[token.map[0]], end: Math.min(source.length, offsets[token.map[1]]), html: md.renderer.render(tokens.slice(i, end + 1), md.options, {}), markdown: true } : null);
29
+ i = end;
30
+ }
31
+ else if (token.type === 'html_block' && token.map) {
32
+ const count = createDocument(token.content).querySelectorAll('table').length;
33
+ const start = offsets[token.map[0]];
34
+ const raw = source.slice(start, Math.min(source.length, offsets[token.map[1]]));
35
+ const opening = raw.match(/^\s*<table\b(?:[^"'<>]|"[^"]*"|'[^']*')*>/i);
36
+ const close = raw.match(/<\/table\s*>/i);
37
+ const target = count === 1 && token.level === 0 && opening && close
38
+ ? { start: start + raw.indexOf('<'), end: start + close.index + close[0].length, html: raw.slice(raw.indexOf('<'), close.index + close[0].length), markdown: false } : null;
39
+ for (let n = 0; n < count; n++)
40
+ result.push(target);
41
+ }
42
+ }
43
+ return result;
44
+ }
45
+ function columnCount(table, visit) {
46
+ const occupied = [];
47
+ let count = 0;
48
+ const rows = Array.from(table.querySelectorAll('tr'));
49
+ rows.forEach((row, r) => {
50
+ let column = 0;
51
+ for (const cell of Array.from(row.children).filter(c => /^(TD|TH)$/.test(c.tagName))) {
52
+ while ((occupied[column] ?? 0) > r)
53
+ column++;
54
+ const span = Math.max(1, Number(cell.getAttribute('colspan')) || 1);
55
+ const rawRows = cell.getAttribute('rowspan');
56
+ const rowSpan = rawRows === '0' ? rows.length - r : Math.max(1, Number(rawRows) || 1);
57
+ if (!Number.isInteger(span) || span > 32 || !Number.isInteger(rowSpan))
58
+ return;
59
+ visit?.(cell, column, span);
60
+ for (let n = 0; n < span; n++)
61
+ occupied[column + n] = r + rowSpan;
62
+ column += span;
63
+ }
64
+ count = Math.max(count, column, occupied.length);
65
+ });
66
+ return count;
67
+ }
68
+ /** Visual-length estimate: wide characters count twice; row/column spans use logical columns. */
69
+ function contentWeights(table, count) {
70
+ const samples = Array.from({ length: count }, () => []);
71
+ columnCount(table, (cell, column, span) => {
72
+ const text = (cell.textContent ?? '').normalize('NFC').replace(/\s+/g, ' ').trim();
73
+ let length = 0;
74
+ for (const character of text) {
75
+ if (/\p{Mark}|[\u200d\ufe0e\ufe0f]/u.test(character))
76
+ continue;
77
+ length += /\p{Script=Hangul}|\p{Script=Han}|\p{Script=Hiragana}|\p{Script=Katakana}|\p{Extended_Pictographic}/u.test(character) ? 2 : 1;
78
+ }
79
+ for (let i = column; i < Math.min(count, column + span); i++)
80
+ samples[i].push(length / span);
81
+ });
82
+ return samples.map(values => {
83
+ values.sort((a, b) => a - b);
84
+ const typical = values[Math.ceil((values.length - 1) * 0.75)] ?? 0;
85
+ const longest = values.at(-1) ?? 0;
86
+ // Compress long prose, and limit a single unusually long cell's influence.
87
+ return Math.max(1, Math.sqrt(typical) * 0.8 + Math.sqrt(Math.min(longest, typical * 2)) * 0.2);
88
+ });
89
+ }
90
+ export function editableTables(source) {
91
+ return targets(source).map((target, index) => {
92
+ const table = target && createDocument(target.html).querySelector('table');
93
+ const count = table ? columnCount(table) : 0;
94
+ if (!table || count < 1 || count > 32)
95
+ return { index, widths: [], editable: false };
96
+ const dimensions = tableWidths(table);
97
+ const total = Math.round(Math.max(count * 40, Math.min(3000, dimensions.width ?? 760)));
98
+ const existing = dimensions.columns.length === count && dimensions.columns.every(w => w !== undefined) ? dimensions.columns : Array(count).fill(1);
99
+ const sum = existing.reduce((a, b) => a + b, 0);
100
+ const widths = existing.map(w => Math.max(40, Math.floor(w / sum * total)));
101
+ let remaining = total - widths.reduce((a, b) => a + b, 0);
102
+ while (remaining !== 0) {
103
+ const column = remaining > 0 ? widths.indexOf(Math.min(...widths)) : widths.indexOf(Math.max(...widths));
104
+ widths[column] += remaining > 0 ? 1 : -1;
105
+ remaining += remaining > 0 ? -1 : 1;
106
+ }
107
+ return { index, widths, editable: true, contentWeights: contentWeights(table, count) };
108
+ });
109
+ }
110
+ export function formatTable(source, index, widths) {
111
+ const list = targets(source);
112
+ const target = list[index];
113
+ const info = editableTables(source)[index];
114
+ if (!target || !info?.editable || !Number.isInteger(index))
115
+ throw new Error('์ด ํ‘œ๋Š” ๋„ˆ๋น„ ํŽธ์ง‘์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.');
116
+ if (!Array.isArray(widths) || widths.length !== info.widths.length || widths.some(w => !Number.isInteger(w) || w < 40 || w > 3000)
117
+ || widths.reduce((a, b) => a + b, 0) > 3000)
118
+ throw new Error('์—ด ๋„ˆ๋น„๋Š” 40px ์ด์ƒ, ์ „์ฒด ๋„ˆ๋น„๋Š” 3000px ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.');
119
+ const table = createDocument(target.html).querySelector('table');
120
+ const signature = (el) => Array.from(el.querySelectorAll('th, td')).map(c => [c.innerHTML, c.getAttribute('colspan'), c.getAttribute('rowspan')]);
121
+ const before = signature(table);
122
+ const total = widths.reduce((a, b) => a + b, 0);
123
+ applyTableWidths(table, { width: total, columns: widths });
124
+ if (table.hasAttribute('data-table-width'))
125
+ table.setAttribute('data-table-width', String(total));
126
+ let html;
127
+ if (target.markdown)
128
+ html = table.outerHTML + '\n';
129
+ else {
130
+ const opening = table.cloneNode(false);
131
+ const startTag = opening.outerHTML.slice(0, -'</table>'.length);
132
+ const group = table.querySelector('colgroup').outerHTML;
133
+ const original = target.html.replace(/^<table\b(?:[^"'<>]|"[^"]*"|'[^']*')*>/i, startTag);
134
+ html = /<colgroup\b/i.test(original)
135
+ ? original.replace(/<colgroup\b[^>]*>[\s\S]*?<\/colgroup\s*>/i, group)
136
+ : original.replace(startTag, startTag + '\n' + group);
137
+ }
138
+ const checked = createDocument(html).querySelector('table');
139
+ if (JSON.stringify(signature(checked)) !== JSON.stringify(before)
140
+ || tableWidths(checked).width !== total
141
+ || JSON.stringify(tableWidths(checked).columns) !== JSON.stringify(widths))
142
+ throw new Error('ํ‘œ ๋‚ด์šฉ์„ ๋ณด์กดํ•  ์ˆ˜ ์—†์–ด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.');
143
+ return source.slice(0, target.start) + html + source.slice(target.end);
144
+ }
145
+ export function formatAllTables(source, mode) {
146
+ let after = source;
147
+ for (const table of editableTables(source).filter(t => t.editable)) {
148
+ const total = table.widths.reduce((a, b) => a + b, 0), count = table.widths.length;
149
+ const weights = mode === 'fit' ? table.contentWeights : Array(count).fill(1);
150
+ const extra = total - count * 40, sum = weights.reduce((a, b) => a + b, 0);
151
+ const shares = weights.map(w => w / sum * extra), widths = shares.map(w => 40 + Math.floor(w));
152
+ const order = shares.map((w, i) => ({ i, fraction: w - Math.floor(w) })).sort((a, b) => b.fraction - a.fraction);
153
+ const rest = total - widths.reduce((a, b) => a + b, 0);
154
+ for (let i = 0; i < rest; i++)
155
+ widths[order[i].i]++;
156
+ after = formatTable(after, table.index, widths);
157
+ }
158
+ return after;
159
+ }
160
+ export function createTableFormatting() {
161
+ const plans = new Map();
162
+ const plan = (base, file, before, after) => {
163
+ if (Buffer.byteLength(after) > 1_000_000)
164
+ throw new Error('๋ณ€๊ฒฝ ๊ฒฐ๊ณผ๊ฐ€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ง€์› ํฌ๊ธฐ์ธ 1MB๋ฅผ ๋„˜์Šต๋‹ˆ๋‹ค.');
165
+ const planId = randomUUID();
166
+ if (plans.size >= 20)
167
+ plans.delete(plans.keys().next().value);
168
+ plans.set(planId, { base, file, before, after });
169
+ return { planId, before, after };
170
+ };
171
+ return {
172
+ async documentPreview(base, file, hash, basic, tables, changes = []) {
173
+ if (typeof basic !== 'boolean' || !['keep', 'fit', 'equal'].includes(tables))
174
+ throw new Error('๋ฌธ์„œ ์„œ์‹ ์˜ต์…˜์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.');
175
+ const { source, path } = await readPreviewSource(base, file);
176
+ if (sourceHash(source) !== hash)
177
+ throw new Error('ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด ์ฃผ์„ธ์š”.');
178
+ if (!Array.isArray(changes) || changes.length > 100 || new Set(changes.map(e => e?.index)).size !== changes.length)
179
+ throw new Error('ํ‘œ ๋ณ€๊ฒฝ ๋ชฉ๋ก์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.');
180
+ let after = source;
181
+ for (const edit of changes)
182
+ after = formatTable(after, edit?.index, edit?.widths);
183
+ if (basic)
184
+ after = formatDocument(after);
185
+ if (tables !== 'keep')
186
+ after = formatAllTables(after, tables);
187
+ return plan(base, path, source, after);
188
+ },
189
+ async preview(base, file, hash, index, widths, changes) {
190
+ const { source, path } = await readPreviewSource(base, file);
191
+ if (sourceHash(source) !== hash)
192
+ throw new Error('ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด ์ฃผ์„ธ์š”.');
193
+ const edits = changes ?? [{ index, widths }];
194
+ if (!Array.isArray(edits) || !edits.length || edits.length > 100 || new Set(edits.map(e => e?.index)).size !== edits.length)
195
+ throw new Error('ํ‘œ ๋ณ€๊ฒฝ ๋ชฉ๋ก์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.');
196
+ let after = source;
197
+ for (const edit of edits)
198
+ after = formatTable(after, edit?.index, edit?.widths);
199
+ return plan(base, path, source, after);
200
+ },
201
+ async save(planId) {
202
+ const plan = plans.get(planId);
203
+ if (!plan)
204
+ throw new Error('๋ณ€๊ฒฝ ๋น„๊ต๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด ์ฃผ์„ธ์š”.');
205
+ const { source, path } = await readPreviewSource(plan.base, plan.file);
206
+ if (source !== plan.before || path !== plan.file)
207
+ throw new Error('ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด ์ €์žฅํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ๊ณ ์นจ ํ›„ ๋‹ค์‹œ ๋น„๊ตํ•ด ์ฃผ์„ธ์š”.');
208
+ const mode = (await stat(path)).mode & 0o777;
209
+ const stage = await mkdtemp(join(dirname(path), '.csync-table-'));
210
+ try {
211
+ const candidate = join(stage, 'document.md');
212
+ await writeFile(candidate, plan.after, { mode });
213
+ if (await realpath(plan.file) !== path || await readFile(path, 'utf8') !== plan.before)
214
+ throw new Error('ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด ์ €์žฅํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.');
215
+ await rename(candidate, path);
216
+ plans.delete(planId);
217
+ }
218
+ finally {
219
+ await rm(stage, { recursive: true, force: true });
220
+ }
221
+ return { saved: path };
222
+ },
223
+ };
224
+ }
@@ -1,30 +1,35 @@
1
+ import { tokenGuide } from './token-guide.js';
2
+ import { usageGuide } from './usage-guide.js';
1
3
  /** In-app guide for the local document workflow. */
2
4
  export const helpDialog = `
3
5
  <dialog id="help-dialog" class="help-dialog" aria-labelledby="help-title">
4
6
  <header class="help-heading"><div><span class="eyebrow">WORKSPACE GUIDE</span><h2 id="help-title">์‚ฌ์šฉ ๋„์›€๋ง</h2></div><form method="dialog"><button aria-label="๋„์›€๋ง ๋‹ซ๊ธฐ" autofocus>๋‹ซ๊ธฐ</button></form></header>
5
- <nav class="help-nav" aria-label="๋„์›€๋ง ๋ชฉ์ฐจ"><a href="#help-convert">๋ฌธ์„œ ๋ณ€ํ™˜</a><a href="#help-sync">๋™๊ธฐํ™”</a><a href="#help-links">์ฐธ์กฐ ๋งํฌ</a><a href="#help-faq">์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ</a></nav>
7
+ <nav class="help-nav" aria-label="๋„์›€๋ง ๋ชฉ์ฐจ"><a href="#help-screens">ํ™”๋ฉด์œผ๋กœ ๋ณด๊ธฐ</a><a href="#help-convert">๋ฌธ์„œ ๋ณ€ํ™˜</a><a href="#help-sync">Confluence</a><a href="#help-token">API ํ† ํฐ ๋ฐœ๊ธ‰</a><a href="#help-links">์ฐธ์กฐ ๋งํฌ</a><a href="#help-faq">์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ</a></nav>
6
8
  <div class="help-body" tabindex="0" aria-label="์‚ฌ์šฉ ๋„์›€๋ง ๋‚ด์šฉ">
7
- <p class="help-intro">Obsidian์—์„œ ์ž‘์—…ํ•œ ๋ฌธ์„œ๋ฅผ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ, ๋ณ€ํ™˜ ๊ฒฐ๊ณผ ํด๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ Confluence์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํƒญ์˜ ๊ธฐ์ค€ ํด๋”๋Š” ๊ฐ๊ฐ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.</p>
9
+ <p class="help-intro">Obsidian์—์„œ ์ž‘์—…ํ•œ ๋ฌธ์„œ๋ฅผ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ, ๋ณ€ํ™˜ ๊ฒฐ๊ณผ ํด๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ Confluence์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์‹คํ–‰์—์„œ๋Š” ๋‘ ํƒญ์˜ ๊ธฐ์ค€ ํด๋”๋ฅผ ๊ฐ๊ฐ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ์›น์€ ๋กœ์ปฌ CLI ์—†์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฌธ์„œ ํด๋”๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Vercel ๋ฐฐํฌ์—์„œ๋Š” ๋ณ€ํ™˜ยท๋ณ€๊ฒฝ ํ™•์ธ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  Confluence ์š”์ฒญ๋งŒ ์ค‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. Docker ๋ฐฐํฌ์—์„œ๋Š” ๋ฌธ์„œยท์ฒจ๋ถ€ยท.env๋ฅผ ์„œ๋ฒ„์˜ ์ž„์‹œ ๊ณต๊ฐ„์œผ๋กœ ์ „๋‹ฌํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๋กœ์ปฌ ํŽธ์ง‘ ์ถฉ๋Œ์„ ํ™•์ธํ•œ ๋’ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ChromeยทEdge์™€ HTTPS๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ €์žฅ ์ „์— ์ถœ๋ ฅ ํด๋”๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ์›๋ณธ๊ณผ ๊ฐ™์€ ํด๋”๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ €์žฅ ์‹œ ๋ฎ์–ด์“ฐ๊ธฐ ํ™•์ธ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค.</p>
10
+ ${usageGuide}
8
11
  <section id="help-convert"><h3>๋ฌธ์„œ ๋ณ€ํ™˜</h3>
9
- <ol><li><strong>๋ณ€ํ™˜ ํด๋” ์„ ํƒโ€ฆ</strong>์œผ๋กœ ์›๋ณธ ํด๋”๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ๋Š” ํด๋”๋ฅผ ํŽผ์น˜๊ณ , ์ด๋ฆ„์„ ๋ˆ„๋ฅด๋ฉด ๋ณ€ํ™˜ ๋Œ€์ƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.</li><li>ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ทธ ํŒŒ์ผ๋งŒ, ํด๋”๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•˜์œ„ Markdown ์ „์ฒด๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</li><li>๋ณ€ํ™˜ ํ˜•์‹๊ณผ ์ถœ๋ ฅ ํด๋”๋ฅผ ์ •ํ•˜๊ณ  <strong>๋ฏธ๋ฆฌ๋ณด๊ธฐ</strong>๋กœ ์›๋ณธ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.</li><li><strong>๋ณ€ํ™˜ ํ›„ ์ €์žฅ</strong>์„ ๋ˆ„๋ฅธ ๋’ค <strong>๊ฒฐ๊ณผ ํด๋” ์—ด๊ธฐ</strong>๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์›น ๋ณ€ํ™˜์€ ๋ณ„๋„ ์ถœ๋ ฅ ํด๋”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.</li></ol>
10
- <dl><dt>Markdown</dt><dd>์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„ํ‚ค๋งํฌ๋ฅผ ์ƒ๋Œ€ ๋งํฌ๋กœ ๋ฐ”๊พธ๊ณ  PDF ํŽ˜์ด์ง€ ์ฐธ์กฐ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฐพ์ง€ ๋ชปํ•œ ๋ฌธ์„œ ์œ„ํ‚ค๋งํฌ๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.</dd><dt>Obsidian</dt><dd>ํ•ด์„ ๊ฐ€๋Šฅํ•œ Markdown ๋ฌธ์„œ ๋งํฌ๋ฅผ ์œ„ํ‚ค๋งํฌ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.</dd><dt>Confluence ๋ณ€ํ™˜ ์˜ค๋ฅ˜ ๋ณด์ •</dt><dd>์˜› ๋ณ€ํ™˜ ๊ฒฐ๊ณผ์˜ CSS ์ž”ํ•ด, ๋ถˆํ•„์š”ํ•œ ์ด์Šค์ผ€์ดํ”„์™€ ์ฝ”๋“œ๋ธ”๋ก ์–ธ์–ด ๋“ฑ์„ ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ๋ฐ”๋€ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”.</dd><dt>์ถœ๋ ฅ ์œ„์น˜</dt><dd>ํŒŒ์ผ ํ•˜๋‚˜๋Š” ์ถœ๋ ฅ ํด๋” ๋ฐ”๋กœ ์•„๋ž˜์—, ํด๋” ์ „์ฒด๋Š” ์„ ํƒ ํด๋” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ๊ฒฝ๋กœ๋ฅผ ๋น„์šฐ๋ฉด ์›๋ณธ ๊ธฐ์ค€ ํด๋” ์˜†์— ์ƒˆ ๊ฒฐ๊ณผ ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.</dd></dl>
12
+ <ol><li><strong>๊ธฐ์ค€ ํด๋” ๋ณ€๊ฒฝโ€ฆ</strong>์œผ๋กœ ์›๋ณธ ํด๋”๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ๋Š” ํด๋”๋ฅผ ํŽผ์น˜๊ณ , ์ด๋ฆ„์„ ๋ˆ„๋ฅด๋ฉด ๋ณ€ํ™˜ ๋Œ€์ƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.</li><li>ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ‘ํžŒ <strong>๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ</strong>๋ฅผ ํŽผ์น˜๋ฉด ํ‘œ์™€ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•œ ๋ณธ๋ฌธ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ทธ ํŒŒ์ผ๋งŒ, ํด๋”๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•˜์œ„ Markdown ์ „์ฒด๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์„ค์ •์˜ ๊ธฐ์ค€ ํด๋” ์ „์ฒด ์„ ํƒ์„ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ํƒ์ƒ‰ ์œ„์น˜์™€ ๊ด€๊ณ„์—†์ด ๊ธฐ์ค€ ํด๋” ์•„๋ž˜ ๋ชจ๋“  Markdown์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ํ›„ ๋ณ€ํ™˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์™€ ๋ณ€ํ™˜ ํ›„ ์ €์žฅ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.</li><li>๋ณ€ํ™˜ ํ˜•์‹๊ณผ ์ถœ๋ ฅ ํด๋”๋ฅผ ์ •ํ•˜๊ณ  <strong>๋ณ€ํ™˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ</strong>๋กœ ์›๋ณธ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.</li><li><strong>๋ณ€ํ™˜ ํ›„ ์ €์žฅ</strong>์„ ๋ˆ„๋ฅธ ๋’ค <strong>๊ฒฐ๊ณผ ํด๋” ์—ด๊ธฐ</strong>๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์›น ๋ณ€ํ™˜์€ ์ง€์ •ํ•œ ์ถœ๋ ฅ ํด๋”์— ์ €์žฅํ•˜๋ฉฐ, ์ฒจ๋ถ€์™€ PDF ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€๋Š” ๊ฐ ๋ฌธ์„œ ์˜†์˜ attachments/๋ฌธ์„œ๋ช…/์— ๋ชจ์๋‹ˆ๋‹ค.</li></ol>
13
+ <dl><dt>Markdown</dt><dd>์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„ํ‚ค๋งํฌ๋ฅผ ์ƒ๋Œ€ ๋งํฌ๋กœ ๋ฐ”๊พธ๊ณ  PDF ํŽ˜์ด์ง€ ์ฐธ์กฐ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฐพ์ง€ ๋ชปํ•œ ๋ฌธ์„œ ์œ„ํ‚ค๋งํฌ๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.</dd><dt>Obsidian</dt><dd>ํ•ด์„ ๊ฐ€๋Šฅํ•œ Markdown ๋ฌธ์„œ ๋งํฌ๋ฅผ ์œ„ํ‚ค๋งํฌ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.</dd><dt>Confluence ๋ณ€ํ™˜ ์˜ค๋ฅ˜ ๋ณด์ •</dt><dd>์˜› ๋ณ€ํ™˜ ๊ฒฐ๊ณผ์˜ CSS ์ž”ํ•ด, ๋ถˆํ•„์š”ํ•œ ์ด์Šค์ผ€์ดํ”„์™€ ์ฝ”๋“œ๋ธ”๋ก ์–ธ์–ด ๋“ฑ์„ ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ๋ฐ”๋€ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”.</dd><dt>์ถœ๋ ฅ ์œ„์น˜</dt><dd>ํŒŒ์ผ ํ•˜๋‚˜๋Š” ์ถœ๋ ฅ ํด๋” ๋ฐ”๋กœ ์•„๋ž˜์—, ํด๋” ์ „์ฒด๋Š” ์„ ํƒ ํด๋” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํด๋”๋ฅผ ์›๋ณธ๊ณผ ๊ฐ™๊ฒŒ ์ง€์ •ํ•˜๋ฉด ์„ ํƒ ๋ฒ”์œ„์˜ ์›๋ž˜ ์œ„์น˜์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฎ์–ด์“ฐ๊ธฐ ์ „ ๋ณ€๊ฒฝ ํŒŒ์ผ์„ ํ™•์ธํ•˜๋ฉฐ, ํ™•์ธ ์ดํ›„ ์›๋ณธ์ด ๋ฐ”๋€Œ๋ฉด ์ €์žฅ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์‹คํ–‰์—์„œ ์ถœ๋ ฅ ๊ฒฝ๋กœ๋ฅผ ๋น„์šฐ๋ฉด ์›๋ณธ ๊ธฐ์ค€ ํด๋” ์˜†์— ์ƒˆ ๊ฒฐ๊ณผ ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.</dd></dl>
11
14
  </section>
12
- <section id="help-sync"><h3>Confluence ๋™๊ธฐํ™”</h3>
13
- <ol><li><strong>๋™๊ธฐํ™” ํด๋” ์„ ํƒโ€ฆ</strong>์œผ๋กœ ์—…๋กœ๋“œํ•  ๋ฌธ์„œ๊ฐ€ ๋ชจ์ธ ํด๋”๋ฅผ ์—ฝ๋‹ˆ๋‹ค.</li><li>๋ฒ”์œ„๋ฅผ ๊ณ ๋ฅด๊ณ  <strong>์„ค์ • ํ™•์ธ</strong>์œผ๋กœ ์„œ๋ฒ„ยท์ŠคํŽ˜์ด์Šคยท์ƒ์œ„ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.</li><li><strong>๋™๊ธฐํ™” ๋ฏธ๋ฆฌ๋ณด๊ธฐ</strong>์—์„œ ์‹ ๊ทœยท๋ณ€๊ฒฝ ๋ฌธ์„œ์™€ ๋งํฌ ๊ฒฝ๊ณ ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ๋กœ์ปฌ ๋น„๊ต์ด๋ฉฐ Confluence์— ์ ‘์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</li><li><strong>Confluence์— ๋™๊ธฐํ™”</strong>๋ฅผ ๋ˆ„๋ฅด๋ฉด ์‹ค์ œ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋‚˜ ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ๋‹ค์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</li></ol>
14
- <dl><dt>์„ ํƒ ๋ฌธ์„œ</dt><dd>์™ผ์ชฝ์—์„œ ์„ ํƒํ•œ Markdown ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.</dd><dt>ํ˜„์žฌ ํด๋”</dt><dd>ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ํด๋”์™€ ๊ทธ ํ•˜์œ„ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์ƒ์œ„ ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</dd><dt>๊ธฐ์ค€ ํด๋” ์ „์ฒด</dt><dd>์„ค์ •ํ•œ ๋™๊ธฐํ™” ๋ฃจํŠธ์˜ ๋ชจ๋“  ํ•˜์œ„ Markdown์ž…๋‹ˆ๋‹ค. ์ œ์™ธ ๊ทœ์น™์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ๋Š” ๋น ์ง‘๋‹ˆ๋‹ค.</dd><dt>์„ค์ • ํŒŒ์ผ</dt><dd>๋น„์šฐ๋ฉด ๊ธฐ์ค€ ํด๋”์˜ <code>.env</code>๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์—†์œผ๋ฉด ์›น ์„œ๋ฒ„ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ค์ • ํŒŒ์ผ์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.</dd></dl>
15
- <p class="help-note">๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ์„œ๋ฒ„์˜ ๊ถŒํ•œ์ด๋‚˜ ํŽ˜์ด์ง€ ์กด์žฌ๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘ ์ผ๋ถ€ ๋ฌธ์„œ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ•˜์„ธ์š”.</p>
15
+ <section id="help-sync"><h3>Confluence: Push / Pull</h3>
16
+ <p>๋กœ์ปฌ ๋ฌธ์„œ์—์„œ ์ŠคํŽ˜์ด์Šค ๋ฌธ์„œ๋ฅผ ๋ณด๊ด€ํ•  ๊ธฐ์ค€ ํด๋”๋ฅผ ์„ ํƒํ•˜๊ณ , .env ์—ฐ๊ฒฐ ์„ค์ •์—์„œ ์„ค์ • ํ™•์ธ ํ›„ ์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ์„ ๋ˆ„๋ฅด์„ธ์š”. ๋ณ„๋„ ํŒŒ์ผยทํด๋” ์Šค์ฝ”ํ”„ ์„ค์ •์€ ์—†์Šต๋‹ˆ๋‹ค.</p>
17
+ <dl><dt>๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ Fetch</dt><dd>๋กœ์ปฌ์€ 5์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ž๋™ ํ™•์ธํ•˜๋ฉฐ Confluence API๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Fetch๋Š” ์ŠคํŽ˜์ด์Šค ํŽ˜์ด์ง€๋ฅผ 100๊ฐœ์”ฉ ์กฐํšŒํ•ด ์ƒˆ ๋ฌธ์„œ์™€ ๋ฒ„์ „ยท์œ„์น˜ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜๊ณ  2๋ถ„ ๋™์•ˆ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. PushยทPull ์„ฑ๊ณต ํ›„์—๋Š” ์บ์‹œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ํ•œ ๋ฒˆ ๋” Fetchํ•ด ๋ชฉ๋ก์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ํ›„์† Fetch๋งŒ ์‹คํŒจํ•˜๋ฉด ์™„๋ฃŒ๋œ PushยทPull์€ ์œ ์ง€ํ•˜๊ณ  ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์™€ ๋™๊ธฐํ™” ๊ธฐ์ค€์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.</dd><dt>์—…๋กœ๋“œ(Push)</dt><dd>์—…๋กœ๋“œํ•  ๋ฌธ์„œ๋ฅผ ์ฒดํฌํ•˜๊ณ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์™„๋ฃŒํ•œ ๋’ค ์—…๋กœ๋“œํ•˜์„ธ์š”. ์ฒดํฌํ•œ ๋ฌธ์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์›๊ฒฉ ์ถฉ๋Œ ๊ฒ€์‚ฌ๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ํ›„ ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์ตœ์‹  ๋‚ด์šฉ ๋ฐ˜์˜๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๋‹ค์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.</dd><dt>๊ฐ€์ ธ์˜ค๊ธฐ(Pull)</dt><dd>๋ณ€๊ฒฝ ๋ชฉ๋ก ์œ„์˜ โ€˜์›๊ฒฉ ๋ฌธ์„œ n๊ฐœ ๊ฐ€์ ธ์˜ค๊ธฐโ€™๋กœ ์›๊ฒฉ ์‹ ๊ทœ ๋ฌธ์„œ์™€ ์›๊ฒฉ์—์„œ๋งŒ ๋ฐ”๋€ ๋ฌธ์„œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ์ด ๋น„์–ด ์žˆ์–ด๋„ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ˆ˜์ •ยท์˜๋„์ ์ธ ์‚ญ์ œยท์–‘์ชฝ ๋ณ€๊ฒฝ์€ ๋ณด์กดํ•˜๋ฉฐ ์—…๋กœ๋“œ ์ฒดํฌ๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ๋ฒ„์ „์ด ๊ทธ๋Œ€๋กœ์ธ ์ฒจ๋ถ€ ๋‹จ๋… ๋ณ€๊ฒฝ์€ Fetch์—์„œ ๊ฐ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ ํ˜•์‹์€ Markdown ๋˜๋Š” Obsidian์„ ์„ ํƒํ•˜๋ฉฐ, ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๋ณต๊ตฌยท์›๋ณต์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋งํฌ ํ‘œ๊ธฐ์™€ ํŒจ๋„ ๋ณต์› ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. Markdown์€ ์ œ๋ชฉ์ด ์žˆ๋Š” ์ธ์šฉ๋ฌธ๊ณผ ์œ„์ฒจ์ž ๊ฐ์ฃผ ๋ชฉ๋ก์œผ๋กœ, Obsidian์€ ์ฝœ์•„์›ƒ๊ณผ ์ •์˜ํ˜•ยท์ธ๋ผ์ธ ๊ฐ์ฃผ๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ฐ์ฃผ ๋ณต์› ์ •๋ณด๋Š” ์ƒˆ ์—…๋กœ๋“œ๋ถ€ํ„ฐ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํŒŒ์ผ์„ ์ผ๊ด„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</dd><dt>๋ฌธ์„œ ๋ณต๊ตฌยท์›๋ณต</dt><dd>๊ฐ ๋ฌธ์„œ ํ–‰์—์„œ ์›๊ฒฉ์—์„œ ๋ณต๊ตฌ ๋˜๋Š” ์›๊ฒฉ์œผ๋กœ ์›๋ณต์„ ๋ˆ„๋ฅด๊ณ  ํ™•์ธํ•˜์„ธ์š”. ์›๋ณต์€ ํ•ด๋‹น ๋ฌธ์„œ์™€ ์ฐธ์กฐ ์ฒจ๋ถ€์˜ ๋กœ์ปฌ ์ˆ˜์ •์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ์›๊ฒฉ ๋ฌธ์„œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ณต๊ตฌํ•œ ๋ฌธ์„œ๋Š” ์—…๋กœ๋“œ ์„ ํƒ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.</dd><dt>์™ผ์ชฝ ๋ฌธ์„œ ํƒ์ƒ‰</dt><dd>ํŒŒ์ผ์„ ์„ ํƒํ•˜๋ฉด ๋ฌธ์„œ๋ฅผ ๋ฏธ๋ฆฌ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ์ƒ‰ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”๋„ ์ž‘์—…๊ณต๊ฐ„์ด๋‚˜ ์—…๋กœ๋“œ ์„ ํƒ์€ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์™ธ ๊ทœ์น™๊ณผ ๋…๋ฆฝ๋œ ํ•˜์œ„ ์ž‘์—…๊ณต๊ฐ„์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.</dd><dt>๋‹ค์šด๋กœ๋“œ</dt><dd>.env ์—ฐ๊ฒฐ ์„ค์ •์—์„œ ๋นˆ .env ์ƒ˜ํ”Œ์„ ๋‚ด๋ ค๋ฐ›์•„ ๊ฐ’์„ ์ฑ„์šฐ์„ธ์š”. ๋Œ€์ƒ ๋ฐ ์‹คํ–‰ ๋‚ด์—ญ์˜ ๋กœ๊ทธ ๋‹ค์šด๋กœ๋“œ๋Š” ํ˜„์žฌ ์ž‘์—…์˜ ์ง„ํ–‰ยท์„ฑ๊ณตยท์‹คํŒจ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ์€ ๊ฐ€๋ ค์ง€์ง€๋งŒ ๋ฌธ์„œ ๊ฒฝ๋กœ์™€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.</dd><dt>์„ค์ • ํŒŒ์ผ</dt><dd>๊ธฐ์ค€ ํด๋”์˜ .env ๋˜๋Š” ์ง์ ‘ ๊ฐ€์ ธ์˜จ .env๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜จ ๊ฐ’์€ ํ˜„์žฌ ์›น ์ž‘์—…์—๋งŒ ์ ์šฉ๋˜๋ฉฐ ๋ณ„๋„ ์ €์žฅ ๋ฒ„ํŠผ์œผ๋กœ ๊ธฐ์ค€ ํด๋”์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</dd></dl>
18
+ <p class="help-note">Pull์€ ์›๊ฒฉ ์‚ญ์ œ๋ฅผ ๋กœ์ปฌ์— ์ž๋™ ๋ฐ˜์˜ํ•˜๊ฑฐ๋‚˜ ์–‘์ชฝ ๋ณ€๊ฒฝ์„ ์ž๋™ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ์›๊ฒฉ ์ฒจ๋ถ€๋Š” ์›๊ฒฉ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ฒฝ๊ณ ํ•˜๋ฉฐ, ๊ถŒํ•œยท๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋Š” ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์›๊ฒฉ ๋ฃจํŠธ ์—ฐ๊ฒฐ๊ณผ ๋ฌธ์„œ ๋งคํ•‘์€ ์ž„์˜๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
16
19
  </section>
20
+ ${tokenGuide}
17
21
  <section id="help-links"><h3>๋‹ค๋ฅธ ํด๋”์˜ ๋ฌธ์„œ์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ</h3>
18
22
  <p>์—…๋กœ๋“œํ•  ๋ฌธ์„œ๋Š” ํ”„๋กœ์ ํŠธ ํด๋”์— ์žˆ๊ณ , ์—ฐ๊ฒฐํ•  ๋ฌธ์„œ๋Š” ๋ณ„๋„ DBP ํด๋”์— ์žˆ๋‹ค๋ฉด <strong>์ฐธ์กฐ ๋ฌธ์„œ ํด๋”</strong>์— DBP์˜ ๋™๊ธฐํ™” ๋ฃจํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ํ•œ ์ค„์”ฉ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํด๋” ์„ ํƒ์ฐฝ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
19
23
  <pre><code>[[์›๋ณธ/๊ธด/๊ฒฝ๋กœ/๋ฌธ์„œ๋ช…|ํ‘œ์‹œ ์ด๋ฆ„]]
20
24
  [ํ‘œ์‹œ ์ด๋ฆ„](../์ด์ „/๋ฌธ์„œ๋ช….md)</code></pre>
21
25
  <p>๋จผ์ € ๊ฒฝ๋กœ๋กœ ์ฐพ๊ณ , ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๊ธฐ์ค€ยท์ฐธ์กฐ ํด๋”์—์„œ ํŒŒ์ผ๋ช…์œผ๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค. ํ›„๋ณด๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ๋งŒ ์—ฐ๊ฒฐํ•˜๋ฉฐ <code>|</code> ์˜ค๋ฅธ์ชฝ์€ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.</p>
22
- <ul><li>ํ˜„์žฌ ๋ฃจํŠธ์˜ ๋ฌธ์„œ๋Š” ๊ทธ ๋ฌธ์„œ์˜ ํŽ˜์ด์ง€ ์ œ๋ชฉ์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…๊ณผ H1์ด ๋‹ฌ๋ผ๋„ ๋ฉ๋‹ˆ๋‹ค.</li><li>์ฐธ์กฐ ๋ฌธ์„œ๋Š” <code>.confluence-sync.json</code>์˜ ๊ฒŒ์‹œ๋œ ํŽ˜์ด์ง€ ID๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ ๋ฌธ์„œ ์ž์ฒด๋Š” ์—…๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</li><li>๊ฐ™์€ Confluence ์„œ๋ฒ„์˜ ๋ณ„๋„ ๋™๊ธฐํ™” ํด๋”๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์ค‘๋ณต ํŒŒ์ผ๋ช…, ๋ฌธ์„œ ๋ˆ„๋ฝ, ๊ฒŒ์‹œ ๋งคํ•‘ ๋ˆ„๋ฝ์€ ๊ฒฝ๊ณ ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.</li></ul>
26
+ <ul><li>ํ˜„์žฌ ๋ฃจํŠธ์˜ ๋ฌธ์„œ๋Š” ๊ทธ ๋ฌธ์„œ์˜ ํŽ˜์ด์ง€ ์ œ๋ชฉ์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…๊ณผ H1์ด ๋‹ฌ๋ผ๋„ ๋ฉ๋‹ˆ๋‹ค.</li><li>์ฐธ์กฐ ๋ฌธ์„œ๋Š” <code>.csync/mapping.json</code>์˜ ๊ฒŒ์‹œ๋œ ํŽ˜์ด์ง€ ID๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ ๋ฌธ์„œ ์ž์ฒด๋Š” ์—…๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</li><li>๊ฐ™์€ Confluence ์„œ๋ฒ„์˜ ๋ณ„๋„ ๋™๊ธฐํ™” ํด๋”๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์ค‘๋ณต ํŒŒ์ผ๋ช…, ๋ฌธ์„œ ๋ˆ„๋ฝ, ๊ฒŒ์‹œ ๋งคํ•‘ ๋ˆ„๋ฝ์€ ๊ฒฝ๊ณ ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.</li></ul>
23
27
  <p class="help-note">๋งํฌ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์–ด๋„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ๋งํฌ๋Š” ์›๋ฌธ์œผ๋กœ ๋‚จ์œผ๋ฏ€๋กœ ์‹คํ–‰ ์ „์— ๊ฒฝ๊ณ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.</p>
24
28
  </section>
25
29
  <section id="help-faq"><h3>์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ</h3>
30
+ <details><summary>๋ฌธ์„œ์™€ ํ‘œ ์„œ์‹์„ ํ•œ ๋ฒˆ์— ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‚˜์š”?</summary><p>๋ฌธ์„œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์˜ ๋ฌธ์„œ ์„œ์‹ ์ •๋ฆฌ๋ฅผ ์—ด๊ณ  ๊ธฐ๋ณธ ์„œ์‹ ์ •๋ฆฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ •๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ์„ ๋ˆŒ๋Ÿฌ์•ผ ํŒŒ์ผ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋„ˆ๋น„ ์œ ์ง€๊ฐ€ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ ์„œ์‹ ์ •๋ฆฌ ์•ˆ์˜ ๋ชจ๋“  ํ‘œ ๋ฉ”๋‰ด์—์„œ ๋‚ด์šฉ์— ๋งž์ถคยท๊ท ๋“ฑ ๋ฐฐ๋ถ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ ํ•˜๋‚˜๋ฅผ ์กฐ์ ˆํ•˜๋ ค๋ฉด ๊ฐ™์€ ํˆด๋ฐ”์˜ ํ‘œ ์ง์ ‘ ํŽธ์ง‘์„ ๋ˆ„๋ฅธ ๋’ค ํ‘œ๋ฅผ ํด๋ฆญํ•˜์„ธ์š”. ๋ฏธ์ €์žฅ ํ‘œ ์กฐ์ ˆ๋„ ๊ธฐ๋ณธ ์„œ์‹ ์ •๋ฆฌ ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ๋ณ€๊ฒฝ ๋น„๊ต๋Š” ํ‘œ ์กฐ์ ˆ๋งŒ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ์— ๋งž์ถค์œผ๋กœ ๊ธ€์ž ๊ธธ์ด์— ๋”ฐ๋ผ ์ž๋™ ๋ฐฐ๋ถ„ํ•˜๊ฑฐ๋‚˜, ์—ด ๊ฒฝ๊ณ„ ๋“œ๋ž˜๊ทธยท๊ท ๋“ฑ ๋ฐฐ๋ถ„ยท์ „์ฒด ๋„ˆ๋น„๋ฅผ ์กฐ์ ˆํ•œ ๋’ค, ๋ณ€๊ฒฝ ๋น„๊ต์—์„œ ์›๋ณธ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ Markdown ํ‘œ๋Š” HTML๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋ฏธ์ €์žฅ ๋ณ€๊ฒฝ์€ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.</p></details>
26
31
  <details><summary>๊ธฐ์กด ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ๋ฎ์–ด์“ฐ๊ธฐ ํ™•์ธ์ฐฝ์ด ์•ˆ ๋‚˜์™€์š”.</summary><p>๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด ํŒŒ์ผ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋งŒ ๋Œ€์ƒ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๊ณ  ๋ฎ์–ด์“ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ทจ์†Œํ•˜๋ฉด ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p></details>
27
- <details><summary>๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ๋Š”๋ฐ ๋‚˜์˜ค์ง€ ์•Š์•„์š”.</summary><p>๊ฒ€์ƒ‰์€ ์„ ํƒํ•œ ๊ธฐ์ค€ ํด๋”์˜ ๋ชจ๋“  ํ•˜์œ„ Markdown ํŒŒ์ผ๋ช…์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์€ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆจ๊น€ ํด๋”์™€ node_modules๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.</p></details>
32
+ <details><summary>๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ๋Š”๋ฐ ๋‚˜์˜ค์ง€ ์•Š์•„์š”.</summary><p>๊ฒ€์ƒ‰์€ ์„ ํƒํ•œ ๊ธฐ์ค€ ํด๋”์˜ ๋ชจ๋“  ํ•˜์œ„ Markdown ํŒŒ์ผ๋ช…์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์€ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆจ๊น€ ํด๋”ยทnode_modulesยทattachments๋Š” ํƒ์ƒ‰๊ณผ ๊ฒ€์ƒ‰์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฒจ๋ถ€๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐยท๋ณ€ํ™˜ยท์—…๋กœ๋“œ์—์„œ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p></details>
28
33
  <details><summary>ํด๋”๋ฅผ ๋ณ€ํ™˜ํ–ˆ๋Š”๋ฐ ๋น„๊ต ํ™”๋ฉด์— ์ผ๋ถ€๋งŒ ๋ณด์—ฌ์š”.</summary><p>๋ณธ๋ฌธ ๋น„๊ต๋Š” ์ตœ๋Œ€ 20๊ฐœ ๋ฌธ์„œ, ๋ฌธ์„œ๋‹น 200KB๊นŒ์ง€ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ €์žฅ์€ ์„ ํƒ ํด๋”์˜ ์ „์ฒด ๋ณ€ํ™˜ ๋Œ€์ƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.</p></details>
29
34
  <details><summary>์‹คํ–‰ ๋‚ด์—ญ์˜ ์ƒ‰์€ ๋ฌด์—‡์„ ๋œปํ•˜๋‚˜์š”?</summary><p>์ดˆ๋ก์€ ์‹ ๊ทœยท์ƒ์„ฑยท์™„๋ฃŒ, ํ™ฉ๊ฐˆ์ƒ‰์€ ๋ณ€๊ฒฝยท๊ฐฑ์‹ , ๋ณด๋ผ๋Š” ์ฐธ์กฐยท์—ฐ๊ฒฐ, ํšŒ์ƒ‰์€ ๋™์ผยท์žฌ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค. ์ฃผํ™ฉ ๋ฐฐ๊ฒฝ์€ ๊ฒฝ๊ณ , ๋นจ๊ฐ• ๋ฐฐ๊ฒฝ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ํ•จ๊ป˜ ํ‘œ์‹œ๋œ ๋ฌธ๊ตฌ๋กœ ์ƒ์„ธ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”.</p></details>
30
35
  <details><summary>์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์„ค์ •์ด ์‚ฌ๋ผ์ง€๋‚˜์š”?</summary><p>๊ธฐ์ค€ ํด๋”, ์ถœ๋ ฅ ๊ฒฝ๋กœ, ์ฐธ์กฐ ํด๋”์™€ ์ž‘์—… ์˜ต์…˜์€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฃผ์†ŒยทํฌํŠธ์—์„œ ์—ด๋ฉด ์„ค์ •์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋กœ๋“œ ์Šน์ธ์€ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ•˜์„ธ์š”.</p></details>
@@ -1,26 +1,97 @@
1
1
  export const syncPanel = `
2
2
  <div id="sync-view" class="workspace-content" role="tabpanel" aria-labelledby="tab-sync" hidden>
3
- <section class="panel" aria-label="๋™๊ธฐํ™” ์„ค์ •">
4
- <div class="panel-heading"><h2><span class="section-number">02</span>Confluence ๋™๊ธฐํ™”</h2><span class="count">Markdown โ†’ Confluence</span></div>
5
- <div class="settings-body sync-settings">
6
- <p class="sync-intro">๋กœ์ปฌ ๋ฌธ์„œ๋ฅผ Confluence์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์‹ ๊ทœยท๋ณ€๊ฒฝ ๋ฌธ์„œ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”.</p>
7
- <div class="settings-grid">
8
- <div class="field"><label for="sync-scope">๋™๊ธฐํ™” ๋ฒ”์œ„</label><select id="sync-scope"><option value="file">์„ ํƒ ๋ฌธ์„œ</option><option value="folder">ํ˜„์žฌ ํด๋”</option><option value="all">๊ธฐ์ค€ ํด๋” ์ „์ฒด</option></select></div>
9
- <div class="field"><label for="sync-env">์„ค์ • ํŒŒ์ผ <span>์„ ํƒ ์‚ฌํ•ญ</span></label><div class="path-row"><input id="sync-env" class="path-input" placeholder="๊ธฐ์ค€ ํด๋”์˜ .env ์ž๋™ ์‚ฌ์šฉ"><button id="sync-load">์„ค์ • ํ™•์ธ</button></div></div>
10
- </div>
11
- <div class="field"><label for="sync-references">์ฐธ์กฐ ๋ฌธ์„œ ํด๋” <span>์„ ํƒ ์‚ฌํ•ญ ยท ํ•œ ์ค„์— ํ•œ ๊ฒฝ๋กœ</span></label><textarea id="sync-references" class="path-input" rows="3" placeholder="๋‹ค๋ฅธ ๋™๊ธฐํ™” ํด๋” ๊ฒฝ๋กœ"></textarea><button id="sync-add-reference" type="button">์ฐธ์กฐ ํด๋” ์ถ”๊ฐ€โ€ฆ</button><p class="hint">์ฐธ์กฐ ํด๋”์˜ ๊ฒŒ์‹œ ๋งคํ•‘์œผ๋กœ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Confluence ์„œ๋ฒ„์˜ ํด๋”๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์ฐธ์กฐ ๋ฌธ์„œ๋Š” ์—…๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p></div>
12
- <p id="sync-target" class="sync-target">์™ผ์ชฝ์—์„œ ๋ฌธ์„œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.</p>
13
- <p class="hint">์„ค์ • ๊ฒฝ๋กœ๋ฅผ ๋น„์šฐ๋ฉด ๊ธฐ์ค€ ํด๋”์˜ .env๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—†์œผ๋ฉด ์›น ์„œ๋ฒ„ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p>
14
- <dl id="sync-config" class="sync-config"><dt>์—ฐ๊ฒฐ ์„ค์ •</dt><dd>์„ค์ • ํ™•์ธ์„ ๋ˆ„๋ฅด๋ฉด ์—…๋กœ๋“œ ์œ„์น˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</dd></dl>
3
+ <section class="panel env-settings" aria-labelledby="sync-env-heading">
4
+ <div class="panel-heading"><h2 id="sync-env-heading"><button id="sync-env-toggle" class="preview-disclosure" type="button" aria-expanded="false" aria-controls="sync-env-body"><span id="sync-env-chevron" aria-hidden="true">โ–ธ</span>.env ์—ฐ๊ฒฐ ์„ค์ •<span id="sync-env-toggle-label" class="preview-disclosure-label">ํŽผ์น˜๊ธฐ</span></button></h2><div class="actions"><button id="sync-load" type="button">์„ค์ • ํ™•์ธ</button><button id="sync-connect" type="button" disabled>์ŠคํŽ˜์ด์Šค ์—ฐ๊ฒฐ</button></div></div>
5
+ <div id="sync-env-body" class="env-settings-body" hidden>
6
+ <div class="env-help-actions"><a class="env-template-download" href="/assets/confluence-env-example.txt" download="confluence.env.example"><svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v12m-5-5 5 5 5-5M4 17v4h16v-4"/></svg>.env ์ƒ˜ํ”Œ ๋‹ค์šด๋กœ๋“œ</a>
7
+ <p class="hint">API ํ† ํฐ์ด ์—†๋‚˜์š”? <button id="open-token-guide" class="quiet" type="button" aria-haspopup="dialog" aria-controls="help-dialog">API ํ† ํฐ ๋ฐœ๊ธ‰ ๊ฐ€์ด๋“œ</button></p></div>
8
+ <p class="hint">์ƒ˜ํ”Œ์˜ ๋นˆ ๊ฐ’์„ ์ฑ„์šด ๋’ค .env ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ์ด๋ฆ„์„ .env๋กœ ๋ฐ”๊ฟ” ๊ธฐ์ค€ ํด๋”์— ์ €์žฅํ•˜์„ธ์š”.</p>
9
+ <fieldset class="env-source-options"><legend class="sr-only">ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๋ฐฉ์‹</legend>
10
+ <label><input type="radio" name="sync-env-source" id="sync-env-base-mode" checked><span><strong>๊ธฐ์ค€ ํด๋”์˜ .env ์‚ฌ์šฉ</strong><small>๋กœ์ปฌ ๋ฌธ์„œ์—์„œ ์„ ํƒํ•œ ํด๋”์˜ ์„ค์ •์„ ์ฝ์Šต๋‹ˆ๋‹ค.</small></span></label>
11
+ <label><input type="radio" name="sync-env-source" id="sync-env-import-mode"><span><strong>.env ๊ฐ€์ ธ์˜ค๊ธฐ</strong><small>ํŒŒ์ผ์„ ์„ ํƒํ•ด ํ˜„์žฌ ์›น ์ž‘์—…์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.</small></span></label>
12
+ </fieldset>
13
+ <div id="sync-env-import-controls" class="env-import-controls" hidden>
14
+ <input type="file" id="sync-env-file" hidden>
15
+ <div class="env-file-row"><button id="sync-env-choose" type="button">.env ํŒŒ์ผ ์„ ํƒโ€ฆ</button><span id="sync-env-file-name">์„ ํƒํ•œ ํŒŒ์ผ ์—†์Œ</span></div>
16
+ <button id="sync-env-save" type="button" disabled>๊ธฐ์ค€ ํด๋”์— .env ์ €์žฅ</button>
17
+ </div>
18
+ <p id="sync-env-source-note" class="hint">๋กœ์ปฌ ๋ฌธ์„œ์—์„œ ์„ ํƒํ•œ ๊ธฐ์ค€ ํด๋”์˜ .env๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์—†์œผ๋ฉด .env๋ฅผ ๊ฐ€์ ธ์˜ค์„ธ์š”.</p>
19
+ <div class="env-config-summary"><h4>์ ์šฉ๋œ ์—ฐ๊ฒฐ ์ •๋ณด</h4>
20
+ <dl id="sync-config" class="sync-config"><dt>์—ฐ๊ฒฐ ์„ค์ •</dt><dd>์„ค์ • ํ™•์ธ์„ ๋ˆ„๋ฅด๋ฉด ์„œ๋ฒ„ยท๊ณ„์ •ยท์ŠคํŽ˜์ด์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</dd></dl>
15
21
  <p id="sync-config-status" class="hint" role="status"></p>
16
- <label class="repair-option"><input id="sync-verify" type="checkbox">๋ณ€๊ฒฝ ์—†๋Š” ๋ฌธ์„œ๋„ Confluence ํŽ˜์ด์ง€ ์กด์žฌ ํ™•์ธ</label>
17
- <p class="hint">.confluence-syncignore์™€ ๊ธฐ์กด ํŽ˜์ด์ง€ ๋งคํ•‘์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ๋กœ์ปฌ ๋ณ€๊ฒฝ ๋น„๊ต์ด๋ฉฐ ์„œ๋ฒ„ ์—ฐ๊ฒฐยท๊ถŒํ•œ์€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
22
+ </div>
18
23
  </div>
19
- <div class="action-bar"><span class="save-note">๋จผ์ € ๋Œ€์ƒ์„ ํ™•์ธํ•œ ๋’ค ์—…๋กœ๋“œํ•˜์„ธ์š”.</span><div class="actions"><button id="sync-preview" disabled>๋™๊ธฐํ™” ๋ฏธ๋ฆฌ๋ณด๊ธฐ</button><button id="sync-push" class="primary" disabled>Confluence์— ๋™๊ธฐํ™”</button></div></div>
20
- <div class="feedback"><p id="sync-status" class="status" role="status" aria-live="polite">๋ฌธ์„œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋™๊ธฐํ™” ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.</p><button id="sync-reconnect" hidden>์ง„ํ–‰ ์ƒํƒœ ๋‹ค์‹œ ํ™•์ธ</button></div>
21
24
  </section>
22
- <section class="panel sync-results" aria-label="๋™๊ธฐํ™” ๋‚ด์—ญ">
23
- <div class="panel-heading"><h2><span class="section-number">03</span>๋Œ€์ƒ ๋ฐ ์‹คํ–‰ ๋‚ด์—ญ</h2><span id="sync-job-state" class="count">๋Œ€๊ธฐ</span></div>
24
- <div class="sync-result-body"><p id="sync-job-summary" class="hint" hidden></p><p id="sync-log-empty" class="empty">๋ฏธ๋ฆฌ๋ณด๊ธฐํ•˜๋ฉด ๋ฌธ์„œ๋ณ„ ์‹ ๊ทœยท๋ณ€๊ฒฝยท๋™์ผ ์ƒํƒœ์™€ ๋ถ€๋ชจ ๊ณ„์ธต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p><pre id="sync-log" tabindex="0" aria-label="๋™๊ธฐํ™” ๋กœ๊ทธ" hidden></pre></div>
25
+ <section class="panel sync-workbench" aria-label="Confluence ์ž‘์—… ์„ค์ •">
26
+ <div class="panel-heading"><h2>Confluence</h2><span id="sync-stage-count" class="count">0๊ฐœ ์—…๋กœ๋“œ ์˜ˆ์ •</span></div>
27
+ <div class="sync-workbench-body">
28
+ <p id="sync-target" class="sync-target">๋กœ์ปฌ ๋ฌธ์„œ์—์„œ ์ŠคํŽ˜์ด์Šค ์ „์ฒด๋ฅผ ๋ณด๊ด€ํ•  ๊ธฐ์ค€ ํด๋”๋ฅผ ์„ ํƒํ•˜์„ธ์š”.</p>
29
+ <div class="sync-workbench-toolbar">
30
+ <div class="actions" aria-label="์›๊ฒฉ ๋ณ€๊ฒฝ ํ™•์ธ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ">
31
+ <button id="sync-fetch" type="button" title="์ŠคํŽ˜์ด์Šค์˜ ์ƒˆ ๋ฌธ์„œ์™€ ๋ฒ„์ „ยท์œ„์น˜ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 2๋ถ„ ์ด๋‚ด ๊ฒฐ๊ณผ๋Š” ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค." disabled>์›๊ฒฉ ๋ณ€๊ฒฝ ํ™•์ธ (Fetch)</button>
32
+ <button id="sync-pull-remote" type="button" disabled>โ†“ ์›๊ฒฉ ๋ณ€๊ฒฝ ๊ฐ€์ ธ์˜ค๊ธฐ (Pull)</button>
33
+ <label class="sync-pull-format" for="sync-pull-format">๊ฐ€์ ธ์˜ค๊ธฐ ํ˜•์‹<select id="sync-pull-format" aria-describedby="sync-pull-format-help"><option value="markdown">Markdown</option><option value="obsidian">Obsidian</option></select></label>
34
+ <button hidden id="sync-stage-scan" type="button">โ†ป ๋กœ์ปฌ ๋‹ค์‹œ ํ™•์ธ</button>
35
+ </div>
36
+ <div class="actions" aria-label="์—…๋กœ๋“œ ๋Œ€์ƒ ์ผ๊ด„ ์„ ํƒ">
37
+ <button id="sync-stage-add" type="button" disabled><span aria-hidden="true">๏ผ‹</span> ๋ณ€๊ฒฝ ๋ฌธ์„œ ๋ชจ๋‘ ํฌํ•จ</button>
38
+ <button id="sync-stage-remove" type="button" disabled><span aria-hidden="true">โˆ’</span> ๋ชจ๋‘ ์ œ์™ธ</button>
39
+ </div>
40
+ </div>
41
+ <p id="sync-pull-format-help" class="hint sync-pull-format-help">์ผ๋ฐ˜ Markdown ๋งํฌ์™€ ์ œ๋ชฉ์ด ์žˆ๋Š” ์ธ์šฉ๋ฌธ์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์ƒˆ๋กœ ๋ฐ›๋Š” ๋ฌธ์„œ์™€ ๋ณต๊ตฌยท์›๋ณต์— ์ ์šฉํ•˜๋ฉฐ ๊ธฐ์กด ํŒŒ์ผ์„ ์ผ๊ด„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
42
+ <div class="sync-observation"><span id="sync-stage-checking" class="stage-checking" aria-hidden="true"><i class="activity-spinner" aria-hidden="true"></i>๋กœ์ปฌ ํ™•์ธ ์ค‘โ€ฆ</span><span>๋กœ์ปฌ ์ž๋™ ํ™•์ธ ยท 5์ดˆ ๊ฐ„๊ฒฉ ยท API ํ˜ธ์ถœ ์—†์Œ</span><span id="sync-stage-remote-note">์›๊ฒฉ ์ƒํƒœ ๋ฏธํ™•์ธ ยท Fetch๋กœ ๊ฐฑ์‹ ํ•˜์„ธ์š”.</span></div>
43
+ <div class="sync-change-heading"><h3 id="sync-stage-heading">๋ณ€๊ฒฝ์‚ฌํ•ญ</h3><span>๋ฐ›์„ ๋ฌธ์„œ๋Š” Pull ยท ๋ณด๋‚ผ ๋ณ€๊ฒฝ์€ ์ฒดํฌ ํ›„ Push</span></div>
44
+ <p id="sync-stage-note" class="hint" role="status">๋กœ์ปฌ ๋ณ€๊ฒฝ์„ ์ž๋™์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์›๊ฒฉ ์ƒํƒœ๋Š” Fetch๋ฅผ ๋ˆŒ๋Ÿฌ ํ™•์ธํ•˜์„ธ์š”.</p>
45
+ <div id="sync-stage-list" class="sync-stage-list" aria-label="์—…๋กœ๋“œ ๋ฌธ์„œ ์„ ํƒ"></div>
46
+ </div>
47
+ <div class="sync-execution">
48
+ <div class="sync-execution-heading"><h3>์„ ํƒ ๋ฌธ์„œ ์—…๋กœ๋“œ</h3><span class="count">๋กœ์ปฌ โ†’ Confluence</span></div>
49
+ <p class="sync-intro">์ฒดํฌํ•œ ๋ฌธ์„œ๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ•œ ๋’ค ์—…๋กœ๋“œํ•˜์„ธ์š”.</p>
50
+ <details class="sync-advanced"><summary>์ถ”๊ฐ€ ์„ค์ • <span>์ฐธ์กฐ ๋ฌธ์„œ ยท ์›๊ฒฉ ๊ฒ€์ฆ</span></summary>
51
+ <div class="sync-settings">
52
+ <div id="sync-push-options" class="sync-push-options">
53
+ <section class="sync-option-section" aria-labelledby="sync-reference-heading">
54
+ <h3 id="sync-reference-heading">์ฐธ์กฐ ๋ฌธ์„œ ์—ฐ๊ฒฐ <span class="subtle-label">์„ ํƒ ์‚ฌํ•ญ</span></h3>
55
+ <p id="sync-references-help" class="hint">๋‹ค๋ฅธ ๋™๊ธฐํ™” ํด๋”์˜ ๊ฒŒ์‹œ ๋งคํ•‘์„ ์ด์šฉํ•ด ๋ฌธ์„œ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ Confluence ์„œ๋ฒ„์˜ ํด๋”๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์ฐธ์กฐ ๋ฌธ์„œ๋Š” ์—…๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
56
+ <div class="field"><label for="sync-references">์ฐธ์กฐ ๋ฌธ์„œ ํด๋” <span>ํ•œ ์ค„์— ํ•œ ๊ฒฝ๋กœ</span></label><textarea id="sync-references" class="path-input" rows="3" placeholder="๋‹ค๋ฅธ ๋™๊ธฐํ™” ํด๋” ๊ฒฝ๋กœ" aria-describedby="sync-references-help"></textarea></div>
57
+ <button id="sync-add-reference" type="button">์ฐธ์กฐ ํด๋” ์ถ”๊ฐ€โ€ฆ</button>
58
+ </section>
59
+ <section class="sync-option-section" aria-labelledby="sync-verify-heading">
60
+ <h3 id="sync-verify-heading">๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ™•์ธ ์˜ต์…˜</h3>
61
+ <label class="repair-option sync-verify-option"><input id="sync-verify" type="checkbox" aria-describedby="sync-verify-help">Confluence์˜ ์›๊ฒฉ ๋ฒ„์ „๊ณผ ํŽ˜์ด์ง€ ์กด์žฌ ์—ฌ๋ถ€๋„ ํ™•์ธ</label>
62
+ <p id="sync-verify-help" class="hint">์„ ํƒํ•˜๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ค‘ Confluence๋ฅผ ์กฐํšŒํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ๊ณผ ์›๊ฒฉ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
63
+ </section>
64
+ </div>
65
+ </div>
66
+ </details>
67
+ </div>
68
+ <div class="action-bar"><span class="save-note">๋ฐ›์„ ๋ณ€๊ฒฝ๊ณผ ์ฒดํฌํ•œ ์—…๋กœ๋“œ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.</span><div class="actions"><button id="sync-preview" disabled>์—…๋กœ๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ</button><button id="sync-push" class="primary" disabled>Confluence์— ์—…๋กœ๋“œ</button></div></div>
69
+ <div class="feedback"><p id="sync-status" class="status" role="status" aria-live="polite">๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ณ  ๋ฐ›์„ ๋ฌธ์„œ์™€ ๋ณด๋‚ผ ๋ฌธ์„œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.</p><button id="sync-reconnect" hidden>์ง„ํ–‰ ์ƒํƒœ ๋‹ค์‹œ ํ™•์ธ</button></div>
70
+ </section>
71
+
72
+ <dialog id="sync-diff-dialog" class="sync-diff-dialog" aria-labelledby="sync-diff-title">
73
+ <div class="panel-heading"><h2 id="sync-diff-title">๋ฌธ์„œ ๋ณ€๊ฒฝ ๋น„๊ต</h2><button id="sync-diff-close" type="button">๋‹ซ๊ธฐ</button></div>
74
+ <div class="settings-body"><p id="sync-diff-path" class="sync-diff-path"></p><p id="sync-diff-note" class="hint" role="status"></p>
75
+ <div class="actions"><button id="sync-diff-remote" type="button" hidden>์›๊ฒฉ๊ณผ ๋น„๊ต ยท ๋ณธ๋ฌธ 1ํšŒ ์กฐํšŒ</button></div>
76
+ <div id="sync-diff-labels" class="sync-diff-labels" hidden><span id="sync-diff-before-label">๊ธฐ์ค€ Markdown</span><span>ํ˜„์žฌ ๋กœ์ปฌ Markdown</span></div>
77
+ <div id="sync-diff-editor" class="sync-diff-editor" hidden></div>
78
+ </div>
79
+ </dialog>
80
+ <dialog id="sync-restore-dialog" class="env-confirm-dialog restore-dialog" aria-labelledby="sync-restore-title" aria-describedby="sync-restore-warning">
81
+ <h3 id="sync-restore-title">๋ฌธ์„œ๋ฅผ ์›๊ฒฉ ์ตœ์‹ ์œผ๋กœ ๋ณต๊ตฌํ• ๊นŒ์š”?</h3>
82
+ <p id="sync-restore-path" class="sync-diff-path"></p>
83
+ <p id="sync-restore-warning" class="restore-warning"></p>
84
+ <p class="hint">์›๊ฒฉ ๋ฌธ์„œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณต๊ตฌ ํ›„ ์—…๋กœ๋“œ ์„ ํƒ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ๋„์ค‘ ์ถ”๊ฐ€ ์ˆ˜์ •์ด ์ƒ๊ธฐ๋ฉด ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.</p>
85
+ <div class="actions"><button id="sync-restore-cancel" type="button">์ทจ์†Œ</button><button id="sync-restore-confirm" type="button" class="restore-confirm">์›๊ฒฉ์—์„œ ๋ณต๊ตฌ</button></div>
86
+ </dialog>
87
+ <dialog id="sync-env-confirm" class="env-confirm-dialog" aria-labelledby="sync-env-confirm-title">
88
+ <h3 id="sync-env-confirm-title">๊ธฐ์กด .env์˜ ์—ฐ๊ฒฐ ์„ค์ •์„ ๋ฐ”๊ฟ€๊นŒ์š”?</h3>
89
+ <p id="sync-env-confirm-path" class="hint"></p>
90
+ <p>์„œ๋ฒ„ ์ฃผ์†Œ, ๊ณ„์ •, API ํ† ํฐ, ์ŠคํŽ˜์ด์Šค ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.</p>
91
+ <div class="actions"><button id="sync-env-confirm-cancel" type="button">์ทจ์†Œ</button><button id="sync-env-confirm-save" type="button" class="primary">์—ฐ๊ฒฐ ์„ค์ • ๊ต์ฒด ํ›„ ์ €์žฅ</button></div>
92
+ </dialog>
93
+ <section id="sync-results" class="panel sync-results" aria-label="Confluence ์ž‘์—… ๋‚ด์—ญ">
94
+ <div class="panel-heading"><h2>๋Œ€์ƒ ๋ฐ ์‹คํ–‰ ๋‚ด์—ญ</h2><div class="actions sync-log-actions"><span id="sync-job-state" class="count sync-job-status" role="status" hidden></span><button id="sync-log-download" type="button" disabled title="ํ˜„์žฌ ์ž‘์—…์˜ ์‹คํ–‰ ๋‚ด์—ญ์„ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์—๋„ ํ˜„์žฌ๊นŒ์ง€์˜ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."><svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v12m-5-5 5 5 5-5M4 17v4h16v-4"/></svg>๋กœ๊ทธ ๋‹ค์šด๋กœ๋“œ</button></div></div>
95
+ <div class="sync-result-body"><p id="sync-job-summary" class="hint" hidden></p><p id="sync-log-empty" class="empty">๋ฏธ๋ฆฌ๋ณด๊ธฐํ•˜๋ฉด ๋ฌธ์„œ๋ณ„ ์‹ ๊ทœยท๋ณ€๊ฒฝยท๋™์ผ ์ƒํƒœ์™€ ๋ถ€๋ชจ ๊ณ„์ธต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p><pre id="sync-log" tabindex="0" aria-label="Confluence ์ž‘์—… ๋กœ๊ทธ" hidden></pre></div>
25
96
  </section>
26
97
  </div>`;
@@ -0,0 +1,27 @@
1
+ /** Only annotated, account-redacted screenshots are included in the web build. */
2
+ const steps = [
3
+ ['01-account-settings', '๊ณ„์ • ์„ค์ • ์—ด๊ธฐ', 'Confluence ์˜ค๋ฅธ์ชฝ ์œ„ ํ”„๋กœํ•„ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅธ ๋‹ค์Œ Account settings๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.'],
4
+ ['02-atlassian-security', '๋ณด์•ˆ โ†’ API ํ† ํฐ ๊ด€๋ฆฌ', '์ƒ๋‹จ ๋ณด์•ˆ ํƒญ์—์„œ API ํ† ํฐ ๋งŒ๋“ค๊ธฐ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฐ”๋กœ๊ฐ€๊ธฐ ๋งํฌ๋กœ๋„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.'],
5
+ ['03-api-tokens', '๋ฒ”์œ„๋ฅผ ํฌํ•จํ•œ ํ† ํฐ ๋งŒ๋“ค๊ธฐ', '๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜์—ฌ API ํ† ํฐ ๋งŒ๋“ค๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.'],
6
+ ['04-scope-api-token-step1', '์ด๋ฆ„๊ณผ ๋งŒ๋ฃŒ์ผ ์ž…๋ ฅ', 'Name์— ์šฉ๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„(์˜ˆ: csync)์„ ์ž…๋ ฅํ•˜๊ณ  ๋งŒ๋ฃŒ์ผ์„ ์ •ํ•œ ๋’ค ๋‹ค์Œ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์˜ ๋‚ ์งœ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.'],
7
+ ['05-scope-api-token-step2', 'Confluence ์•ฑ ์„ ํƒ', '์•ฑ ๋ชฉ๋ก์—์„œ Confluence๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.'],
8
+ ['06-scope-api-token-step3', 'ํ•„์š”ํ•œ ๊ถŒํ•œ ๊ฒ€์ƒ‰ยท์„ ํƒ', '๊ถŒํ•œ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ฒฐ๊ณผ ์™ผ์ชฝ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ถŒํ•œ๋งˆ๋‹ค ๋ฐ˜๋ณตํ•œ ๋’ค ๋‹ค์Œ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ•˜์„ธ์š”.'],
9
+ ['07-scope-api-token-step4', '๊ฒ€ํ†  ํ›„ ํ† ํฐ ๋งŒ๋“ค๊ธฐ', '์ด๋ฆ„ยท๋งŒ๋ฃŒ์ผยท์•ฑยท์„ ํƒํ•œ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ  ํ† ํฐ ๋งŒ๋“ค๊ธฐ๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ํ™”๋ฉด์˜ read:space ํ•˜๋‚˜๋Š” ์˜ˆ์‹œ์ด๋ฉฐ csync ์ „์ฒด ๊ธฐ๋Šฅ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.'],
10
+ ];
11
+ export const tokenGuide = `<section id="help-token"><h3>API ํ† ํฐ ๋ฐœ๊ธ‰ ๊ฐ€์ด๋“œ</h3>
12
+ <p>๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ์™€ Click ํ‘œ์‹œ๋ฅผ ๋”ฐ๋ผ ์ง„ํ–‰ํ•˜์„ธ์š”. ๊ณ„์ • ์ •๋ณด๋Š” ๊ฐ€๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. API ํ† ํฐ์˜ ๊ถŒํ•œ(scope)์€ csync์—์„œ ์ฒ˜๋ฆฌํ•  ๋กœ์ปฌ ํŒŒ์ผยทํด๋” ์ž‘์—… ์Šค์ฝ”ํ”„์™€ ๋ณ„๊ฐœ์˜ ์„ค์ •์ž…๋‹ˆ๋‹ค.</p>
13
+ <p><a href="https://id.atlassian.com/manage-profile/security/api-tokens" target="_blank" rel="noopener noreferrer">Atlassian API ํ† ํฐ ๊ด€๋ฆฌ ์—ด๊ธฐ โ†—</a></p>
14
+ <div class="token-guide-steps guide-steps">${steps.map(([file, title, description], i) => `<details${i === 0 ? ' open' : ''}><summary>${i + 1}. ${title}</summary><p>${description}</p><figure><a href="/assets/guide/${file}.png" target="_blank" rel="noopener noreferrer" aria-label="${i + 1}๋‹จ๊ณ„ ์ด๋ฏธ์ง€ ์›๋ณธ ํฌ๊ธฐ๋กœ ๋ณด๊ธฐ"><img src="/assets/guide/${file}.png" alt="${title}: ๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ๋กœ ํ‘œ์‹œํ•œ ์กฐ์ž‘ ์œ„์น˜" loading="lazy"></a><figcaption>์ด๋ฏธ์ง€๋ฅผ ๋ˆ„๋ฅด๋ฉด ์›๋ณธ ํฌ๊ธฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</figcaption></figure></details>`).join('')}</div>
15
+ <h4>csync์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ถŒํ•œ</h4>
16
+ <p>์•„๋ž˜ ์ด๋ฆ„ ์ „์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”. ์กฐํšŒยทPull์—๋Š” ๊ธฐ๋ณธ ์ฝ๊ธฐ ๊ถŒํ•œ์„, Push์—๋Š” ํ•„์š”ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ ๊ณ„์ • ์ž์ฒด์—๋„ ๋Œ€์ƒ ์ŠคํŽ˜์ด์Šค์˜ ํ•ด๋‹น ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</p>
17
+ <div class="token-scope-table"><table><thead><tr><th>์ž‘์—…</th><th>๊ถŒํ•œ</th></tr></thead><tbody>
18
+ <tr><td>์Šค์ฝ”ํ”„ ํƒ์ƒ‰ยท๋ฌธ์„œ ์กฐํšŒยทPull</td><td><code>read:space:confluence</code><br><code>read:page:confluence</code><br><code>read:content-details:confluence</code></td></tr>
19
+ <tr><td>ํŽ˜์ด์ง€ Push</td><td><code>write:page:confluence</code></td></tr>
20
+ <tr><td>์ด๋ฏธ์ง€ยท์ฒจ๋ถ€ ๋‹ค์šด๋กœ๋“œ</td><td><code>read:attachment:confluence</code></td></tr>
21
+ <tr><td>์ด๋ฏธ์ง€ยท์ฒจ๋ถ€ ์—…๋กœ๋“œ</td><td><code>read:content-details:confluence</code><br><code>write:attachment:confluence</code></td></tr>
22
+ <tr><td>README ์—†๋Š” ํด๋” ์ƒ์„ฑ</td><td><code>write:folder:confluence</code></td></tr>
23
+ </tbody></table></div>
24
+ <h4>๋ฐœ๊ธ‰ํ•œ ํ† ํฐ ์ ์šฉ</h4><p>์ƒ์„ฑ ์งํ›„ Copy to clipboard๋กœ ๋ณต์‚ฌํ•˜์—ฌ <code>.env</code>์˜ <code>CONFLUENCE_API_TOKEN</code>์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ํ† ํฐ์€ ๋ฐœ๊ธ‰ ํ™”๋ฉด์„ ๋‹ซ์€ ๋’ค ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์›น์˜ <strong>.env ๊ฐ€์ ธ์˜ค๊ธฐ</strong>๋กœ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๊ธฐ์ค€ ํด๋”์˜ <code>.env</code>๋ฅผ ๊ฐฑ์‹ ํ•œ ๋’ค <strong>์„ค์ • ํ™•์ธ</strong>์„ ๋ˆ„๋ฅด์„ธ์š”.</p>
25
+ <p>๋ฒ”์œ„๋ฅผ ํฌํ•จํ•œ ํ† ํฐ์˜ <code>CONFLUENCE_BASE_URL</code>์€ <code>https://api.atlassian.com/ex/confluence/&lt;CLOUD_ID&gt;/wiki</code> ํ˜•์‹์ž…๋‹ˆ๋‹ค. Cloud ID๋Š” <code>https://&lt;์‚ฌ์ดํŠธ&gt;.atlassian.net/_edge/tenant_info</code>์˜ <code>cloudId</code> ๊ฐ’์ž…๋‹ˆ๋‹ค.</p>
26
+ <p><a href="https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/" target="_blank" rel="noopener noreferrer">Atlassian ๊ณต์‹ ๋ฐœ๊ธ‰ ์•ˆ๋‚ด โ†—</a> ยท <a href="https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-content---children-and-descendants/" target="_blank" rel="noopener noreferrer">Confluence API ๊ถŒํ•œ ๋ฌธ์„œ โ†—</a></p>
27
+ </section>`;
@@ -0,0 +1,12 @@
1
+ const screens = [
2
+ { file: 'sync-workspace', title: 'FetchยทPull๊ณผ ์—…๋กœ๋“œํ•  ๋ฌธ์„œ ์„ ํƒ', width: 1440, height: 1280,
3
+ description: 'Fetch๋กœ ์›๊ฒฉ ์‹ ๊ทœยท๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜๊ณ  ๋ฐ›์„ ๋ฌธ์„œ๋Š” Pull๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ณด๋‚ผ ๋ฌธ์„œ๋งŒ ์ฒดํฌํ•œ ๋’ค ์—…๋กœ๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ์—…๋กœ๋“œ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.' },
4
+ { file: 'remote-diff', title: '์›๊ฒฉ ๋ณธ๋ฌธ๊ณผ ๋กœ์ปฌ ๋ฌธ์„œ ๋น„๊ต', width: 1120, height: 718,
5
+ description: '๋ฌธ์„œ ํ–‰์˜ diff ๋ณด๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ์›๊ฒฉ ๋ณธ๋ฌธ๊ณผ ๋กœ์ปฌ Markdown์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์™ผ์ชฝ์€ ์›๊ฒฉ HTML์˜ ๊ทผ์‚ฌ ๋ณ€ํ™˜๋ณธ, ์˜ค๋ฅธ์ชฝ์€ ๋กœ์ปฌ ๋ณธ๋ฌธ์ž…๋‹ˆ๋‹ค.' },
6
+ { file: 'document-preview', title: '๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์™€ ํ‘œ ์„œ์‹ ์ •๋ฆฌ', width: 1078, height: 867,
7
+ description: '์™ผ์ชฝ์—์„œ ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ณ  ๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ์„œ์‹ ์ •๋ฆฌ์—์„œ ๊ธฐ๋ณธ ์„œ์‹์ด๋‚˜ ๋ชจ๋“  ํ‘œ์˜ ๋‚ด์šฉ์— ๋งž์ถคยท๊ท ๋“ฑ ๋ฐฐ๋ถ„์„ ์ ์šฉํ•˜๊ณ , ๋ณ€๊ฒฝ ๋น„๊ต ํ›„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.' },
8
+ ];
9
+ export const usageGuide = `<section id="help-screens"><h3>ํ™”๋ฉด์œผ๋กœ ๋ณด๊ธฐ</h3>
10
+ <p>๋ฌธ์„œ์™€ Confluence ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ๋ฒ• ์„ค๋ช…์šฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํ™”๋ฉด์„ ํŽผ์ณ ๋ณด์„ธ์š”.</p>
11
+ <div class="guide-steps usage-guide-steps">${screens.map(({ file, title, description, width, height }) => `<details><summary>${title}</summary><p>${description}</p><figure><a href="/assets/guide/web/${file}.png" target="_blank" rel="noopener noreferrer" aria-label="${title} ํ™”๋ฉด ์›๋ณธ ํฌ๊ธฐ๋กœ ๋ณด๊ธฐ"><img src="/assets/guide/web/${file}.png" alt="${title} ์‚ฌ์šฉ ํ™”๋ฉด" width="${width}" height="${height}" loading="lazy" decoding="async"></a><figcaption>์ด๋ฏธ์ง€๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ƒˆ ํƒญ์—์„œ ์›๋ณธ ํฌ๊ธฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</figcaption></figure></details>`).join('')}</div>
12
+ </section>`;