@knpkv/confluence-to-markdown 0.2.0 → 0.4.1

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 (336) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +21 -0
  3. package/README.md +282 -14
  4. package/dist/ConfluenceAuth.d.ts +76 -0
  5. package/dist/ConfluenceAuth.d.ts.map +1 -0
  6. package/dist/ConfluenceAuth.js +356 -0
  7. package/dist/ConfluenceAuth.js.map +1 -0
  8. package/dist/ConfluenceClient.d.ts +26 -2
  9. package/dist/ConfluenceClient.d.ts.map +1 -1
  10. package/dist/ConfluenceClient.js +98 -92
  11. package/dist/ConfluenceClient.js.map +1 -1
  12. package/dist/ConfluenceConfig.d.ts +4 -24
  13. package/dist/ConfluenceConfig.d.ts.map +1 -1
  14. package/dist/ConfluenceConfig.js +45 -7
  15. package/dist/ConfluenceConfig.js.map +1 -1
  16. package/dist/ConfluenceError.d.ts +89 -6
  17. package/dist/ConfluenceError.d.ts.map +1 -1
  18. package/dist/ConfluenceError.js +88 -5
  19. package/dist/ConfluenceError.js.map +1 -1
  20. package/dist/GitError.d.ts +103 -0
  21. package/dist/GitError.d.ts.map +1 -0
  22. package/dist/GitError.js +85 -0
  23. package/dist/GitError.js.map +1 -0
  24. package/dist/GitService.d.ts +175 -0
  25. package/dist/GitService.d.ts.map +1 -0
  26. package/dist/GitService.js +431 -0
  27. package/dist/GitService.js.map +1 -0
  28. package/dist/LocalFileSystem.d.ts +29 -4
  29. package/dist/LocalFileSystem.d.ts.map +1 -1
  30. package/dist/LocalFileSystem.js +80 -6
  31. package/dist/LocalFileSystem.js.map +1 -1
  32. package/dist/MarkdownConverter.d.ts +49 -2
  33. package/dist/MarkdownConverter.d.ts.map +1 -1
  34. package/dist/MarkdownConverter.js +73 -111
  35. package/dist/MarkdownConverter.js.map +1 -1
  36. package/dist/SchemaConverterError.d.ts +108 -0
  37. package/dist/SchemaConverterError.d.ts.map +1 -0
  38. package/dist/SchemaConverterError.js +84 -0
  39. package/dist/SchemaConverterError.js.map +1 -0
  40. package/dist/Schemas.d.ts +225 -1
  41. package/dist/Schemas.d.ts.map +1 -1
  42. package/dist/Schemas.js +155 -6
  43. package/dist/Schemas.js.map +1 -1
  44. package/dist/SyncEngine.d.ts +30 -20
  45. package/dist/SyncEngine.d.ts.map +1 -1
  46. package/dist/SyncEngine.js +566 -117
  47. package/dist/SyncEngine.js.map +1 -1
  48. package/dist/ast/BlockNode.d.ts +468 -0
  49. package/dist/ast/BlockNode.d.ts.map +1 -0
  50. package/dist/ast/BlockNode.js +319 -0
  51. package/dist/ast/BlockNode.js.map +1 -0
  52. package/dist/ast/Document.d.ts +244 -0
  53. package/dist/ast/Document.d.ts.map +1 -0
  54. package/dist/ast/Document.js +69 -0
  55. package/dist/ast/Document.js.map +1 -0
  56. package/dist/ast/InlineNode.d.ts +477 -0
  57. package/dist/ast/InlineNode.d.ts.map +1 -0
  58. package/dist/ast/InlineNode.js +263 -0
  59. package/dist/ast/InlineNode.js.map +1 -0
  60. package/dist/ast/MacroNode.d.ts +267 -0
  61. package/dist/ast/MacroNode.d.ts.map +1 -0
  62. package/dist/ast/MacroNode.js +164 -0
  63. package/dist/ast/MacroNode.js.map +1 -0
  64. package/dist/ast/index.d.ts +10 -0
  65. package/dist/ast/index.d.ts.map +1 -0
  66. package/dist/ast/index.js +14 -0
  67. package/dist/ast/index.js.map +1 -0
  68. package/dist/bin.js +33 -149
  69. package/dist/bin.js.map +1 -1
  70. package/dist/commands/auth.d.ts +15 -0
  71. package/dist/commands/auth.d.ts.map +1 -0
  72. package/dist/commands/auth.js +86 -0
  73. package/dist/commands/auth.js.map +1 -0
  74. package/dist/commands/clone.d.ts +12 -0
  75. package/dist/commands/clone.d.ts.map +1 -0
  76. package/dist/commands/clone.js +93 -0
  77. package/dist/commands/clone.js.map +1 -0
  78. package/dist/commands/delete.d.ts +13 -0
  79. package/dist/commands/delete.d.ts.map +1 -0
  80. package/dist/commands/delete.js +48 -0
  81. package/dist/commands/delete.js.map +1 -0
  82. package/dist/commands/errorHandler.d.ts +14 -0
  83. package/dist/commands/errorHandler.d.ts.map +1 -0
  84. package/dist/commands/errorHandler.js +33 -0
  85. package/dist/commands/errorHandler.js.map +1 -0
  86. package/dist/commands/git.d.ts +22 -0
  87. package/dist/commands/git.d.ts.map +1 -0
  88. package/dist/commands/git.js +72 -0
  89. package/dist/commands/git.js.map +1 -0
  90. package/dist/commands/index.d.ts +11 -0
  91. package/dist/commands/index.d.ts.map +1 -0
  92. package/dist/commands/index.js +11 -0
  93. package/dist/commands/index.js.map +1 -0
  94. package/dist/commands/layers.d.ts +31 -0
  95. package/dist/commands/layers.d.ts.map +1 -0
  96. package/dist/commands/layers.js +137 -0
  97. package/dist/commands/layers.js.map +1 -0
  98. package/dist/commands/new.d.ts +9 -0
  99. package/dist/commands/new.d.ts.map +1 -0
  100. package/dist/commands/new.js +80 -0
  101. package/dist/commands/new.js.map +1 -0
  102. package/dist/commands/pageTree.d.ts +18 -0
  103. package/dist/commands/pageTree.d.ts.map +1 -0
  104. package/dist/commands/pageTree.js +20 -0
  105. package/dist/commands/pageTree.js.map +1 -0
  106. package/dist/commands/shared.d.ts +15 -0
  107. package/dist/commands/shared.d.ts.map +1 -0
  108. package/dist/commands/shared.js +27 -0
  109. package/dist/commands/shared.js.map +1 -0
  110. package/dist/commands/sync.d.ts +15 -0
  111. package/dist/commands/sync.d.ts.map +1 -0
  112. package/dist/commands/sync.js +101 -0
  113. package/dist/commands/sync.js.map +1 -0
  114. package/dist/index.d.ts +10 -1
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +14 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/internal/NodeLayers.d.ts +7 -0
  119. package/dist/internal/NodeLayers.d.ts.map +1 -0
  120. package/dist/internal/NodeLayers.js +19 -0
  121. package/dist/internal/NodeLayers.js.map +1 -0
  122. package/dist/internal/frontmatter.d.ts +10 -0
  123. package/dist/internal/frontmatter.d.ts.map +1 -1
  124. package/dist/internal/frontmatter.js +16 -0
  125. package/dist/internal/frontmatter.js.map +1 -1
  126. package/dist/internal/gitCommands.d.ts +78 -0
  127. package/dist/internal/gitCommands.d.ts.map +1 -0
  128. package/dist/internal/gitCommands.js +156 -0
  129. package/dist/internal/gitCommands.js.map +1 -0
  130. package/dist/internal/hashUtils.d.ts +42 -1
  131. package/dist/internal/hashUtils.d.ts.map +1 -1
  132. package/dist/internal/hashUtils.js +38 -2
  133. package/dist/internal/hashUtils.js.map +1 -1
  134. package/dist/internal/oauthServer.d.ts +55 -0
  135. package/dist/internal/oauthServer.d.ts.map +1 -0
  136. package/dist/internal/oauthServer.js +110 -0
  137. package/dist/internal/oauthServer.js.map +1 -0
  138. package/dist/internal/pathUtils.d.ts +21 -4
  139. package/dist/internal/pathUtils.d.ts.map +1 -1
  140. package/dist/internal/pathUtils.js +24 -13
  141. package/dist/internal/pathUtils.js.map +1 -1
  142. package/dist/internal/tokenStorage.d.ts +75 -0
  143. package/dist/internal/tokenStorage.d.ts.map +1 -0
  144. package/dist/internal/tokenStorage.js +149 -0
  145. package/dist/internal/tokenStorage.js.map +1 -0
  146. package/dist/internal/userCache.d.ts +42 -0
  147. package/dist/internal/userCache.d.ts.map +1 -0
  148. package/dist/internal/userCache.js +51 -0
  149. package/dist/internal/userCache.js.map +1 -0
  150. package/dist/parsers/ConfluenceParser.d.ts +26 -0
  151. package/dist/parsers/ConfluenceParser.d.ts.map +1 -0
  152. package/dist/parsers/ConfluenceParser.js +792 -0
  153. package/dist/parsers/ConfluenceParser.js.map +1 -0
  154. package/dist/parsers/MarkdownParser.d.ts +26 -0
  155. package/dist/parsers/MarkdownParser.d.ts.map +1 -0
  156. package/dist/parsers/MarkdownParser.js +873 -0
  157. package/dist/parsers/MarkdownParser.js.map +1 -0
  158. package/dist/parsers/index.d.ts +8 -0
  159. package/dist/parsers/index.d.ts.map +1 -0
  160. package/dist/parsers/index.js +8 -0
  161. package/dist/parsers/index.js.map +1 -0
  162. package/dist/schemas/ConfluenceSchema.d.ts +21 -0
  163. package/dist/schemas/ConfluenceSchema.d.ts.map +1 -0
  164. package/dist/schemas/ConfluenceSchema.js +38 -0
  165. package/dist/schemas/ConfluenceSchema.js.map +1 -0
  166. package/dist/schemas/ConversionSchema.d.ts +35 -0
  167. package/dist/schemas/ConversionSchema.d.ts.map +1 -0
  168. package/dist/schemas/ConversionSchema.js +208 -0
  169. package/dist/schemas/ConversionSchema.js.map +1 -0
  170. package/dist/schemas/MarkdownSchema.d.ts +21 -0
  171. package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
  172. package/dist/schemas/MarkdownSchema.js +38 -0
  173. package/dist/schemas/MarkdownSchema.js.map +1 -0
  174. package/dist/schemas/hast/HastFromHtml.d.ts +27 -0
  175. package/dist/schemas/hast/HastFromHtml.d.ts.map +1 -0
  176. package/dist/schemas/hast/HastFromHtml.js +107 -0
  177. package/dist/schemas/hast/HastFromHtml.js.map +1 -0
  178. package/dist/schemas/hast/HastSchema.d.ts +195 -0
  179. package/dist/schemas/hast/HastSchema.d.ts.map +1 -0
  180. package/dist/schemas/hast/HastSchema.js +183 -0
  181. package/dist/schemas/hast/HastSchema.js.map +1 -0
  182. package/dist/schemas/hast/index.d.ts +9 -0
  183. package/dist/schemas/hast/index.d.ts.map +1 -0
  184. package/dist/schemas/hast/index.js +3 -0
  185. package/dist/schemas/hast/index.js.map +1 -0
  186. package/dist/schemas/index.d.ts +14 -0
  187. package/dist/schemas/index.d.ts.map +1 -0
  188. package/dist/schemas/index.js +16 -0
  189. package/dist/schemas/index.js.map +1 -0
  190. package/dist/schemas/mdast/MdastFromMarkdown.d.ts +30 -0
  191. package/dist/schemas/mdast/MdastFromMarkdown.d.ts.map +1 -0
  192. package/dist/schemas/mdast/MdastFromMarkdown.js +79 -0
  193. package/dist/schemas/mdast/MdastFromMarkdown.js.map +1 -0
  194. package/dist/schemas/mdast/MdastSchema.d.ts +385 -0
  195. package/dist/schemas/mdast/MdastSchema.d.ts.map +1 -0
  196. package/dist/schemas/mdast/MdastSchema.js +266 -0
  197. package/dist/schemas/mdast/MdastSchema.js.map +1 -0
  198. package/dist/schemas/mdast/index.d.ts +10 -0
  199. package/dist/schemas/mdast/index.d.ts.map +1 -0
  200. package/dist/schemas/mdast/index.js +4 -0
  201. package/dist/schemas/mdast/index.js.map +1 -0
  202. package/dist/schemas/mdast/mdastToString.d.ts +13 -0
  203. package/dist/schemas/mdast/mdastToString.d.ts.map +1 -0
  204. package/dist/schemas/mdast/mdastToString.js +85 -0
  205. package/dist/schemas/mdast/mdastToString.js.map +1 -0
  206. package/dist/schemas/nodes/block/BlockSchema.d.ts +43 -0
  207. package/dist/schemas/nodes/block/BlockSchema.d.ts.map +1 -0
  208. package/dist/schemas/nodes/block/BlockSchema.js +634 -0
  209. package/dist/schemas/nodes/block/BlockSchema.js.map +1 -0
  210. package/dist/schemas/nodes/block/index.d.ts +7 -0
  211. package/dist/schemas/nodes/block/index.d.ts.map +1 -0
  212. package/dist/schemas/nodes/block/index.js +7 -0
  213. package/dist/schemas/nodes/block/index.js.map +1 -0
  214. package/dist/schemas/nodes/index.d.ts +9 -0
  215. package/dist/schemas/nodes/index.d.ts.map +1 -0
  216. package/dist/schemas/nodes/index.js +12 -0
  217. package/dist/schemas/nodes/index.js.map +1 -0
  218. package/dist/schemas/nodes/inline/InlineSchema.d.ts +48 -0
  219. package/dist/schemas/nodes/inline/InlineSchema.d.ts.map +1 -0
  220. package/dist/schemas/nodes/inline/InlineSchema.js +436 -0
  221. package/dist/schemas/nodes/inline/InlineSchema.js.map +1 -0
  222. package/dist/schemas/nodes/inline/index.d.ts +7 -0
  223. package/dist/schemas/nodes/inline/index.d.ts.map +1 -0
  224. package/dist/schemas/nodes/inline/index.js +7 -0
  225. package/dist/schemas/nodes/inline/index.js.map +1 -0
  226. package/dist/schemas/nodes/macro/MacroSchema.d.ts +27 -0
  227. package/dist/schemas/nodes/macro/MacroSchema.d.ts.map +1 -0
  228. package/dist/schemas/nodes/macro/MacroSchema.js +162 -0
  229. package/dist/schemas/nodes/macro/MacroSchema.js.map +1 -0
  230. package/dist/schemas/nodes/macro/index.d.ts +7 -0
  231. package/dist/schemas/nodes/macro/index.d.ts.map +1 -0
  232. package/dist/schemas/nodes/macro/index.js +7 -0
  233. package/dist/schemas/nodes/macro/index.js.map +1 -0
  234. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts +24 -0
  235. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts.map +1 -0
  236. package/dist/schemas/preprocessing/ConfluencePreprocessor.js +351 -0
  237. package/dist/schemas/preprocessing/ConfluencePreprocessor.js.map +1 -0
  238. package/dist/schemas/preprocessing/index.d.ts +8 -0
  239. package/dist/schemas/preprocessing/index.d.ts.map +1 -0
  240. package/dist/schemas/preprocessing/index.js +2 -0
  241. package/dist/schemas/preprocessing/index.js.map +1 -0
  242. package/dist/serializers/ConfluenceSerializer.d.ts +30 -0
  243. package/dist/serializers/ConfluenceSerializer.d.ts.map +1 -0
  244. package/dist/serializers/ConfluenceSerializer.js +551 -0
  245. package/dist/serializers/ConfluenceSerializer.js.map +1 -0
  246. package/dist/serializers/MarkdownSerializer.d.ts +34 -0
  247. package/dist/serializers/MarkdownSerializer.d.ts.map +1 -0
  248. package/dist/serializers/MarkdownSerializer.js +355 -0
  249. package/dist/serializers/MarkdownSerializer.js.map +1 -0
  250. package/dist/serializers/index.d.ts +8 -0
  251. package/dist/serializers/index.d.ts.map +1 -0
  252. package/dist/serializers/index.js +8 -0
  253. package/dist/serializers/index.js.map +1 -0
  254. package/package.json +27 -16
  255. package/src/ConfluenceAuth.ts +571 -0
  256. package/src/ConfluenceClient.ts +188 -156
  257. package/src/ConfluenceConfig.ts +63 -7
  258. package/src/ConfluenceError.ts +110 -14
  259. package/src/GitError.ts +92 -0
  260. package/src/GitService.ts +859 -0
  261. package/src/LocalFileSystem.ts +179 -9
  262. package/src/MarkdownConverter.ts +126 -122
  263. package/src/SchemaConverterError.ts +108 -0
  264. package/src/Schemas.ts +223 -6
  265. package/src/SyncEngine.ts +745 -162
  266. package/src/ast/BlockNode.ts +425 -0
  267. package/src/ast/Document.ts +90 -0
  268. package/src/ast/InlineNode.ts +323 -0
  269. package/src/ast/MacroNode.ts +245 -0
  270. package/src/ast/index.ts +83 -0
  271. package/src/bin.ts +50 -249
  272. package/src/commands/auth.ts +117 -0
  273. package/src/commands/clone.ts +145 -0
  274. package/src/commands/delete.ts +57 -0
  275. package/src/commands/errorHandler.ts +32 -0
  276. package/src/commands/git.ts +114 -0
  277. package/src/commands/index.ts +10 -0
  278. package/src/commands/layers.ts +211 -0
  279. package/src/commands/new.ts +99 -0
  280. package/src/commands/pageTree.ts +40 -0
  281. package/src/commands/shared.ts +35 -0
  282. package/src/commands/sync.ts +129 -0
  283. package/src/index.ts +21 -1
  284. package/src/internal/NodeLayers.ts +21 -0
  285. package/src/internal/frontmatter.ts +21 -0
  286. package/src/internal/gitCommands.ts +229 -0
  287. package/src/internal/hashUtils.ts +65 -3
  288. package/src/internal/oauthServer.ts +199 -0
  289. package/src/internal/pathUtils.ts +34 -17
  290. package/src/internal/tokenStorage.ts +240 -0
  291. package/src/internal/userCache.ts +90 -0
  292. package/src/parsers/ConfluenceParser.ts +950 -0
  293. package/src/parsers/MarkdownParser.ts +1198 -0
  294. package/src/parsers/index.ts +8 -0
  295. package/src/schemas/ConfluenceSchema.ts +56 -0
  296. package/src/schemas/ConversionSchema.ts +318 -0
  297. package/src/schemas/MarkdownSchema.ts +56 -0
  298. package/src/schemas/hast/HastFromHtml.ts +153 -0
  299. package/src/schemas/hast/HastSchema.ts +274 -0
  300. package/src/schemas/hast/index.ts +35 -0
  301. package/src/schemas/index.ts +20 -0
  302. package/src/schemas/mdast/MdastFromMarkdown.ts +118 -0
  303. package/src/schemas/mdast/MdastSchema.ts +566 -0
  304. package/src/schemas/mdast/index.ts +59 -0
  305. package/src/schemas/mdast/mdastToString.ts +102 -0
  306. package/src/schemas/nodes/block/BlockSchema.ts +773 -0
  307. package/src/schemas/nodes/block/index.ts +13 -0
  308. package/src/schemas/nodes/index.ts +20 -0
  309. package/src/schemas/nodes/inline/InlineSchema.ts +523 -0
  310. package/src/schemas/nodes/inline/index.ts +14 -0
  311. package/src/schemas/nodes/macro/MacroSchema.ts +226 -0
  312. package/src/schemas/nodes/macro/index.ts +6 -0
  313. package/src/schemas/preprocessing/ConfluencePreprocessor.ts +446 -0
  314. package/src/schemas/preprocessing/index.ts +8 -0
  315. package/src/serializers/ConfluenceSerializer.ts +717 -0
  316. package/src/serializers/MarkdownSerializer.ts +493 -0
  317. package/src/serializers/index.ts +8 -0
  318. package/test/GitService.test.ts +209 -0
  319. package/test/MarkdownConverter.test.ts +37 -3
  320. package/test/Schemas.test.ts +97 -2
  321. package/test/ast/BlockNode.test.ts +265 -0
  322. package/test/ast/Document.test.ts +126 -0
  323. package/test/ast/InlineNode.test.ts +161 -0
  324. package/test/fixtures/integration-test.html.fixture +103 -0
  325. package/test/fixtures/integration-test.md.expected +257 -0
  326. package/test/integration.test.ts +269 -0
  327. package/test/oauthServer.test.ts +50 -0
  328. package/test/parsers/ConfluenceParser.test.ts +283 -0
  329. package/test/schemas/ConfluencePreprocessor.test.ts +180 -0
  330. package/test/schemas/ConversionSchema.test.ts +159 -0
  331. package/test/schemas/HastSchema.test.ts +138 -0
  332. package/test/schemas/MdastSchema.test.ts +145 -0
  333. package/test/schemas/nodes/block/BlockSchema.test.ts +173 -0
  334. package/test/schemas/nodes/inline/InlineSchema.test.ts +198 -0
  335. package/test/schemas/nodes/macro/MacroSchema.test.ts +142 -0
  336. package/test/tokenStorage.test.ts +99 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # @knpkv/confluence-to-markdown
2
2
 
3
+ ## 0.4.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#23](https://github.com/knpkv/npm/pull/23) [`bd5bbf4`](https://github.com/knpkv/npm/commit/bd5bbf4679ae1d41b33182fcca70adf0960f0839) Thanks @konopkov! - feat(confluence-api-client): new package for Confluence Cloud REST API
8
+
9
+ New `@knpkv/confluence-api-client` package with Effect-based Confluence Cloud REST API client:
10
+ - V1 API: `/user`, `/content/{id}/property/{key}` endpoints
11
+ - V2 API: Pages CRUD with pagination support
12
+ - Basic auth (email + API token) and OAuth2 (access token + cloud ID)
13
+ - Effect Layer wrapper with config service
14
+ - Daily CI workflow for spec updates
15
+
16
+ Migrated `confluence-to-markdown` to use new API client package.
17
+
18
+ - [#24](https://github.com/knpkv/npm/pull/24) [`cbbe42f`](https://github.com/knpkv/npm/commit/cbbe42f8747af8955aacfa64a7e3868035cffec5) Thanks @konopkov! - Fix Confluence link handling and consolidate preprocessing modules
19
+ - Handle `<ac:link><ac:link-body>` pattern that was being lost during conversion
20
+ - Consolidate duplicate preprocessing code (deleted `parsers/preprocessing/`)
21
+ - Remove type assertion casts in favor of Schema.decodeSync
22
+ - Fix CI: configure git user.name/email in init for fresh repos
23
+
24
+ - Updated dependencies [[`bd5bbf4`](https://github.com/knpkv/npm/commit/bd5bbf4679ae1d41b33182fcca70adf0960f0839)]:
25
+ - @knpkv/confluence-api-client@0.2.0
26
+
27
+ ## 0.4.0
28
+
29
+ ### Minor Changes
30
+
31
+ - [#21](https://github.com/knpkv/npm/pull/21) [`f696d00`](https://github.com/knpkv/npm/commit/f696d0056de28f2871a48a0caac88b696c86ba68) Thanks @konopkov! - Add git version tracking and CLI improvements
32
+ - Add GitService for git operations with version history replay
33
+ - Add clone command that pulls pages with full version history
34
+ - Flatten git commands: confluence commit/log/diff (was: confluence git ...)
35
+ - Add auth status subcommand
36
+ - Reorganize bin.ts into separate command files
37
+ - Add nice error messages without stack traces
38
+ - Clone fails if already cloned
39
+
40
+ ## 0.3.0
41
+
42
+ ### Minor Changes
43
+
44
+ - [#19](https://github.com/knpkv/npm/pull/19) [`15b1ff7`](https://github.com/knpkv/npm/commit/15b1ff70e9e7a406ddbc4ce8bcd0673965464421) Thanks @konopkov! - Add OAuth authentication for Confluence Cloud
45
+ - `confluence auth create` - opens Atlassian Developer Console to create OAuth app
46
+ - `confluence auth configure` - save client ID/secret
47
+ - `confluence auth login` - browser-based OAuth flow
48
+ - `confluence auth logout` - remove stored token
49
+ - Show login status in `confluence status`
50
+ - Auto-refresh tokens when expired
51
+ - Use granular scopes for API v2: read:page:confluence, write:page:confluence
52
+
53
+ ## 0.2.1
54
+
55
+ ### Patch Changes
56
+
57
+ - [#17](https://github.com/knpkv/npm/pull/17) [`879af56`](https://github.com/knpkv/npm/commit/879af56383230d852e1434efb67e6f5cdffd3507) Thanks @konopkov! - Improve type safety and code organization:
58
+ - Add MdastRootSchema with runtime validation
59
+ - Extract preprocessing to separate module
60
+ - Consolidate duplicate mdastToString utility
61
+ - Use exhaustive switch statements
62
+
3
63
  ## 0.2.0
4
64
 
5
65
  ### Minor Changes
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 knpkv
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > **Warning**
4
4
  > This package is experimental and in early development. Code is primarily AI-generated and not yet publicly published. For preview, use snapshot releases.
5
5
 
6
- Sync Confluence Cloud pages to local GitHub Flavored Markdown files.
6
+ Sync Confluence Cloud pages to local GitHub Flavored Markdown files with built-in git version tracking.
7
7
 
8
8
  ## Installation
9
9
 
@@ -13,47 +13,315 @@ npm install @knpkv/confluence-to-markdown effect
13
13
 
14
14
  ## CLI Usage
15
15
 
16
+ ### Core Commands
17
+
16
18
  ```bash
17
- # Initialize configuration
18
- confluence init --root-page-id 123456 --base-url https://yoursite.atlassian.net
19
+ # Clone pages with full version history
20
+ confluence clone --root-page-id <ID> --base-url <URL>
19
21
 
20
22
  # Pull pages from Confluence
21
23
  confluence pull
24
+ confluence pull -f, --force # overwrite local changes
25
+ confluence pull --replay-history # replay each version as separate git commit
22
26
 
23
27
  # Push local changes to Confluence
24
28
  confluence push
29
+ confluence push -n, --dry-run # preview changes without applying
25
30
 
26
- # Bidirectional sync
27
- confluence sync
31
+ # Delete a page (interactive selector, deletes local file)
32
+ confluence delete
28
33
 
29
34
  # Check sync status
30
35
  confluence status
31
36
  ```
32
37
 
38
+ ### Authentication Commands
39
+
40
+ ```bash
41
+ # Create OAuth app (opens browser to Atlassian Developer Console)
42
+ confluence auth create
43
+
44
+ # Configure OAuth credentials
45
+ confluence auth configure --client-id <ID> --client-secret <SECRET>
46
+
47
+ # Login via browser
48
+ confluence auth login
49
+ confluence auth login --site <URL> # for accounts with multiple sites
50
+
51
+ # Check auth status
52
+ confluence auth status
53
+
54
+ # Logout
55
+ confluence auth logout
56
+ ```
57
+
58
+ ### Page Creation
59
+
60
+ ```bash
61
+ # Create a new page (interactive parent selector)
62
+ confluence new
63
+
64
+ # Workflow:
65
+ # 1. Create new page: confluence new
66
+ # 2. Edit the file
67
+ # 3. Commit: confluence commit -m "Add new page"
68
+ # 4. Push to Confluence: confluence push
69
+ ```
70
+
71
+ ### Page Deletion
72
+
73
+ ```bash
74
+ # Delete a page (interactive selector)
75
+ confluence delete
76
+
77
+ # Workflow:
78
+ # 1. Delete page: confluence delete (or rm <file>)
79
+ # 2. Commit: confluence commit -m "Delete page"
80
+ # 3. Push to Confluence: confluence push # deletes from Confluence
81
+ ```
82
+
83
+ ### Git Commands
84
+
85
+ ```bash
86
+ # Commit current changes
87
+ confluence commit
88
+ confluence commit -m "message"
89
+
90
+ # Show commit history
91
+ confluence log
92
+ confluence log -n 5 # last 5 commits
93
+ confluence log --oneline # compact format
94
+ confluence log --since 2024-01-01 # since date
95
+
96
+ # Show changes in working directory
97
+ confluence diff
98
+ confluence diff --staged # staged changes only
99
+ confluence diff --commit HEAD~1 # compare with commit
100
+ ```
101
+
102
+ ## How It Works
103
+
104
+ 1. `confluence clone` creates `.confluence/` directory, initializes git, and pulls pages with full version history
105
+ 2. `confluence pull` downloads pages and auto-commits changes
106
+ 3. `confluence pull --replay-history` replays each Confluence version as a separate git commit with original author/date
107
+ 4. Version messages from Confluence are preserved in markdown front-matter
108
+ 5. Use standard git commands in `.confluence/` for advanced operations
109
+
110
+ ## Git Implementation
111
+
112
+ ### Two-Branch Model
113
+
114
+ The CLI uses a two-branch model to track sync state:
115
+
116
+ - **`local`** (current branch): Your working branch for edits
117
+ - **`origin/confluence`**: Tracks the remote Confluence state
118
+
119
+ ```
120
+ Clone:
121
+ Confluence ──pull──> local + origin/confluence (both at same commit)
122
+
123
+ Pull:
124
+ Confluence ──pull──> origin/confluence ──merge──> local
125
+
126
+ Push:
127
+ local ──push──> Confluence
128
+
129
+ └──> origin/confluence (updated to HEAD)
130
+ ```
131
+
132
+ ### Commit Behavior
133
+
134
+ When you commit:
135
+
136
+ 1. **Sync external docs** (if configured): Copies files from external `docsPath` to `.confluence/`
137
+ 2. **Stage all changes**: Runs `git add -A`
138
+ 3. **Create commit**: Records changes with your message
139
+
140
+ Note: Front-matter (`contentHash`, `version`) is **not** updated at commit time. Changes are detected by comparing actual content hash vs stored hash.
141
+
142
+ ### Push Behavior
143
+
144
+ When you push:
145
+
146
+ 1. **Detect changes**: Compares content hash vs stored `contentHash` in front-matter
147
+ 2. **Push to Confluence**: Uploads markdown converted to Confluence storage format
148
+ 3. **Fetch canonical content**: Downloads what Confluence actually stored (may differ slightly)
149
+ 4. **Amend commit**: Updates local file with canonical content so future clones match exactly
150
+ 5. **Update tracking branch**: Moves `origin/confluence` to HEAD
151
+
152
+ Multiple local commits combine into a single Confluence version (uses last commit's message).
153
+
154
+ ### Content Hash Tracking
155
+
156
+ Each markdown file has front-matter with a `contentHash` field:
157
+
158
+ ```yaml
159
+ ---
160
+ pageId: "123456"
161
+ version: 42
162
+ title: My Page
163
+ contentHash: 7a8b9c... # SHA-256 of markdown content
164
+ ---
165
+ ```
166
+
167
+ - After clone/pull: `contentHash` matches the actual content
168
+ - After local edit: content differs from `contentHash` → detected as "needs push"
169
+ - After push: `contentHash` updated to match canonical Confluence content
170
+
171
+ ### Why Canonical Content?
172
+
173
+ Confluence may transform your content (normalize whitespace, reorder attributes, etc.). By fetching and storing the canonical content after push:
174
+
175
+ - `clone` on another machine produces **identical** files
176
+ - Git history shows exactly what Confluence has
177
+ - No false "modified" status from round-trip differences
178
+
179
+ ## Authentication
180
+
181
+ ### OAuth (recommended)
182
+
183
+ #### 1. Create OAuth App
184
+
185
+ 1. Go to [Atlassian Developer Console](https://developer.atlassian.com/console/myapps/)
186
+ 2. Click **Create** → **OAuth 2.0 integration**
187
+ 3. Enter app name (e.g., "Confluence CLI")
188
+ 4. Configure permissions in **Permissions** tab:
189
+ - Add **Confluence API** with scopes:
190
+ - `read:page:confluence` - read pages
191
+ - `write:page:confluence` - push changes
192
+ - `delete:page:confluence` - delete pages
193
+ - Add **User Identity API**:
194
+ - `read:me` - get current user info
195
+ 5. In **Authorization** tab, set callback URL: `http://localhost:8585/callback`
196
+ 6. In **Settings** tab, copy **Client ID** and **Secret**
197
+
198
+ #### 2. Configure and Login
199
+
200
+ ```bash
201
+ # Configure with your client ID and secret
202
+ confluence auth configure --client-id <ID> --client-secret <SECRET>
203
+
204
+ # Login via browser
205
+ confluence auth login
206
+
207
+ # Check login status
208
+ confluence status
209
+
210
+ # Logout
211
+ confluence auth logout
212
+ ```
213
+
214
+ ### API Token (alternative)
215
+
216
+ ```bash
217
+ export CONFLUENCE_API_KEY=your-api-token
218
+ export CONFLUENCE_EMAIL=your-email@example.com
219
+ ```
220
+
221
+ Generate API token at [Atlassian Account Settings](https://id.atlassian.com/manage-profile/security/api-tokens).
222
+
223
+ ### Security Notes
224
+
225
+ - OAuth credentials stored in `~/.confluence/` with restricted permissions (0600)
226
+ - Treat these files as sensitive - do not share or commit
227
+ - Create separate OAuth apps per developer for team projects
228
+ - Tokens auto-refresh; if refresh fails, re-run `confluence auth login`
229
+
33
230
  ## Configuration
34
231
 
35
- Create `.confluence.json` in your project root:
232
+ Initialize configuration with `confluence clone`:
233
+
234
+ ```bash
235
+ confluence clone --root-page-id 123456 --base-url https://yoursite.atlassian.net
236
+ ```
237
+
238
+ This creates `.confluence/config.json` in your project root:
36
239
 
37
240
  ```json
38
241
  {
39
242
  "rootPageId": "123456",
40
243
  "baseUrl": "https://yoursite.atlassian.net",
41
- "spaceKey": "DEV",
42
- "docsPath": ".docs/confluence"
244
+ "docsPath": ".confluence/docs",
245
+ "excludePatterns": [],
246
+ "saveSource": false,
247
+ "trackedPaths": ["**/*.md"]
43
248
  }
44
249
  ```
45
250
 
46
- ## Environment Variables
251
+ ### Configuration Options
47
252
 
48
- ```bash
49
- export CONFLUENCE_API_KEY=your-api-token
50
- export CONFLUENCE_EMAIL=your-email@example.com
253
+ | Option | Description | Default |
254
+ | ----------------- | ------------------------------------- | ------------------ |
255
+ | `rootPageId` | Confluence page ID to sync from | Required |
256
+ | `baseUrl` | Confluence Cloud URL | Required |
257
+ | `spaceKey` | Optional space key | - |
258
+ | `docsPath` | Local path for markdown files | `.confluence/docs` |
259
+ | `excludePatterns` | Glob patterns to exclude | `[]` |
260
+ | `saveSource` | Save original HTML alongside markdown | `false` |
261
+ | `trackedPaths` | Glob patterns for git tracking | `["**/*.md"]` |
262
+
263
+ ## Directory Structure
264
+
265
+ ```
266
+ project/
267
+ ├── .confluence/
268
+ │ ├── config.json # Configuration file
269
+ │ ├── .git/ # Git repository for version tracking
270
+ │ └── docs/ # Synced markdown files
271
+ │ ├── page1.md
272
+ │ ├── page1/ # Children of page1
273
+ │ │ └── child.md
274
+ │ └── subdir/
275
+ │ └── page2.md
276
+ └── ...
277
+ ```
278
+
279
+ ### Page Hierarchy Rules
280
+
281
+ Directory structure determines Confluence page hierarchy:
282
+
283
+ - Files in `docs/` root → children of root page
284
+ - `foo.md` → page "foo"
285
+ - `foo/` directory → contains children of "foo.md"
286
+ - `foo/bar.md` → child page of "foo.md"
287
+
288
+ Example structure:
289
+
290
+ ```
291
+ docs/
292
+ ├── guide.md # Child of root
293
+ ├── guide/ # Children of guide.md
294
+ │ ├── getting-started.md
295
+ │ └── advanced.md
296
+ └── reference.md # Child of root
297
+ ```
298
+
299
+ ### New Page Front-matter
300
+
301
+ New pages require only a `title` in front-matter:
302
+
303
+ ```yaml
304
+ ---
305
+ title: "My New Page"
306
+ ---
307
+ Page content here...
308
+ ```
309
+
310
+ After pushing, the file is updated with full metadata:
311
+
312
+ ```yaml
313
+ ---
314
+ pageId: "123456"
315
+ version: 1
316
+ title: "My New Page"
317
+ updated: 2024-01-15T10:30:00.000Z
318
+ parentId: "789012"
319
+ contentHash: "7a8b9c..."
320
+ ---
51
321
  ```
52
322
 
53
323
  ## Known Limitations
54
324
 
55
- - **Page creation**: Creating new pages from local markdown is not yet implemented
56
- - **Conflict detection**: Bidirectional sync does not detect conflicts (last write wins)
57
325
  - **Attachments**: Image and file attachments are not synced
58
326
  - **Comments**: Page comments are not preserved
59
327
 
@@ -0,0 +1,76 @@
1
+ import * as CommandExecutor from "@effect/platform/CommandExecutor";
2
+ import * as HttpClient from "@effect/platform/HttpClient";
3
+ import * as Context from "effect/Context";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Layer from "effect/Layer";
6
+ import type { FileSystemError } from "./ConfluenceError.js";
7
+ import { AuthMissingError, OAuthError } from "./ConfluenceError.js";
8
+ import type { OAuthConfig, OAuthUser } from "./Schemas.js";
9
+ /**
10
+ * Options for the login method.
11
+ */
12
+ export interface LoginOptions {
13
+ /** Site URL to select (for accounts with multiple sites) */
14
+ readonly siteUrl?: string;
15
+ }
16
+ /**
17
+ * Information about an accessible Confluence site.
18
+ */
19
+ export interface AccessibleSite {
20
+ readonly id: string;
21
+ readonly name: string;
22
+ readonly url: string;
23
+ }
24
+ /**
25
+ * ConfluenceAuth service interface.
26
+ *
27
+ * @category Services
28
+ */
29
+ export interface ConfluenceAuthService {
30
+ /** Configure OAuth client credentials */
31
+ readonly configure: (config: OAuthConfig) => Effect.Effect<void, FileSystemError>;
32
+ /** Check if OAuth is configured */
33
+ readonly isConfigured: () => Effect.Effect<boolean, FileSystemError>;
34
+ /** Start OAuth login flow. Returns list of sites if multiple are available. */
35
+ readonly login: (options?: LoginOptions) => Effect.Effect<ReadonlyArray<AccessibleSite> | void, OAuthError | FileSystemError>;
36
+ /** Remove stored authentication */
37
+ readonly logout: () => Effect.Effect<void, OAuthError | FileSystemError>;
38
+ /** Get access token, refreshing if needed */
39
+ readonly getAccessToken: () => Effect.Effect<string, AuthMissingError | OAuthError | FileSystemError>;
40
+ /** Get cloud ID from stored token */
41
+ readonly getCloudId: () => Effect.Effect<string, AuthMissingError | FileSystemError>;
42
+ /** Get current user info from stored token */
43
+ readonly getCurrentUser: () => Effect.Effect<OAuthUser | null, FileSystemError>;
44
+ /** Check if user is logged in */
45
+ readonly isLoggedIn: () => Effect.Effect<boolean, FileSystemError>;
46
+ }
47
+ declare const ConfluenceAuth_base: Context.TagClass<ConfluenceAuth, "@knpkv/confluence-to-markdown/ConfluenceAuth", ConfluenceAuthService>;
48
+ /**
49
+ * ConfluenceAuth service tag.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * import { Effect } from "effect"
54
+ * import { ConfluenceAuth } from "@knpkv/confluence-to-markdown/ConfluenceAuth"
55
+ *
56
+ * Effect.gen(function* () {
57
+ * const auth = yield* ConfluenceAuth
58
+ * const isLoggedIn = yield* auth.isLoggedIn()
59
+ * if (!isLoggedIn) {
60
+ * yield* auth.login()
61
+ * }
62
+ * })
63
+ * ```
64
+ *
65
+ * @category Services
66
+ */
67
+ export declare class ConfluenceAuth extends ConfluenceAuth_base {
68
+ }
69
+ /**
70
+ * Layer for ConfluenceAuth service.
71
+ *
72
+ * @category Layers
73
+ */
74
+ export declare const layer: Layer.Layer<ConfluenceAuth, never, HttpClient.HttpClient | CommandExecutor.CommandExecutor>;
75
+ export {};
76
+ //# sourceMappingURL=ConfluenceAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfluenceAuth.d.ts","sourceRoot":"","sources":["../src/ConfluenceAuth.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,eAAe,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AAEzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAWnE,OAAO,KAAK,EAAE,WAAW,EAAc,SAAS,EAAE,MAAM,cAAc,CAAA;AAqEtE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IACjF,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IACpE,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,CAAC,EAAE,YAAY,KACnB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,CAAA;IACtF,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,CAAA;IACxE,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,GAAG,eAAe,CAAC,CAAA;IACrG,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAA;IACpF,8CAA8C;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,eAAe,CAAC,CAAA;IAC/E,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;CACnE;;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,cAAe,SAAQ,mBAGjC;CAAG;AA6YN;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,cAAc,EACd,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,eAAe,CAAC,eAAe,CACnB,CAAA"}