@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
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CLI error handler.
3
+ *
4
+ * We use custom error handling instead of built-in options because:
5
+ * - Cause.pretty() includes stack traces which are noisy for CLI users
6
+ * - Logger.pretty is for logging, not error output
7
+ * - NodeRuntime.runMain error reporting shows full cause structure
8
+ */
9
+ import * as Cause from "effect/Cause";
10
+ /**
11
+ * Print errors to stderr without stack traces.
12
+ */
13
+ export const handleError = (cause) => {
14
+ if (Cause.isEmpty(cause))
15
+ return;
16
+ for (const error of Cause.failures(cause)) {
17
+ if (error && typeof error === "object" && "message" in error) {
18
+ process.stderr.write(`${error.message}\n`);
19
+ }
20
+ else {
21
+ process.stderr.write(`${String(error)}\n`);
22
+ }
23
+ }
24
+ for (const defect of Cause.defects(cause)) {
25
+ if (defect instanceof Error) {
26
+ process.stderr.write(`Error: ${defect.message}\n`);
27
+ }
28
+ else {
29
+ process.stderr.write(`Error: ${String(defect)}\n`);
30
+ }
31
+ }
32
+ };
33
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/commands/errorHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,KAAqB,EAAQ,EAAE;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAM;IAEhC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,KAA6B,CAAC,OAAO,IAAI,CAAC,CAAA;QACrE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Git commands (commit, log, diff) for Confluence CLI.
3
+ */
4
+ import { Command } from "@effect/cli";
5
+ import * as Option from "effect/Option";
6
+ import { ConfluenceConfig } from "../ConfluenceConfig.js";
7
+ import { GitService } from "../GitService.js";
8
+ export declare const commitCommand: Command.Command<"commit", ConfluenceConfig | GitService, import("../GitService.js").GitServiceError, {
9
+ readonly message: Option.Option<string>;
10
+ }>;
11
+ export declare const logCommand: Command.Command<"log", GitService, import("../GitService.js").GitServiceError, {
12
+ readonly limit: number;
13
+ readonly oneline: boolean;
14
+ readonly since: Option.Option<string>;
15
+ readonly file: Option.Option<string>;
16
+ }>;
17
+ export declare const diffCommand: Command.Command<"diff", GitService, import("../GitService.js").GitServiceError, {
18
+ readonly staged: boolean;
19
+ readonly commit: Option.Option<string>;
20
+ readonly file: Option.Option<string>;
21
+ }>;
22
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAQ,OAAO,EAAW,MAAM,aAAa,CAAA;AAGpD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAS7C,eAAO,MAAM,aAAa;;EAgByC,CAAA;AAoBnE,eAAO,MAAM,UAAU;;;;;EA4B+B,CAAA;AActD,eAAO,MAAM,WAAW;;;;EAkB4C,CAAA"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Git commands (commit, log, diff) for Confluence CLI.
3
+ */
4
+ import { Args, Command, Options } from "@effect/cli";
5
+ import * as Console from "effect/Console";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Option from "effect/Option";
8
+ import { ConfluenceConfig } from "../ConfluenceConfig.js";
9
+ import { GitService } from "../GitService.js";
10
+ // === Commit command ===
11
+ const commitMessageOption = Options.text("message").pipe(Options.withAlias("m"), Options.withDescription("Commit message"), Options.optional);
12
+ export const commitCommand = Command.make("commit", { message: commitMessageOption }, ({ message }) => Effect.gen(function* () {
13
+ const git = yield* GitService;
14
+ const config = yield* ConfluenceConfig;
15
+ // Sync from external docs path to .confluence/ (skips if docsPath is inside .confluence/)
16
+ yield* git.syncFromDocs(config.docsPath, config.trackedPaths);
17
+ yield* git.addAll();
18
+ const msg = Option.isSome(message) ? message.value : "Manual commit";
19
+ const hash = yield* git.commit({ message: msg });
20
+ yield* Console.log(`Committed: ${hash.substring(0, 7)}`);
21
+ })).pipe(Command.withDescription("Stage and commit current changes"));
22
+ // === Log command ===
23
+ const logLimitOption = Options.integer("limit").pipe(Options.withAlias("n"), Options.withDescription("Number of commits to show"), Options.withDefault(10));
24
+ const logOnelineOption = Options.boolean("oneline").pipe(Options.withDescription("Show compact one-line format"));
25
+ const logSinceOption = Options.text("since").pipe(Options.withDescription("Show commits since date (e.g., '2024-01-01')"), Options.optional);
26
+ const logFileArg = Args.text({ name: "file" }).pipe(Args.optional);
27
+ export const logCommand = Command.make("log", { limit: logLimitOption, oneline: logOnelineOption, since: logSinceOption, file: logFileArg }, ({ file, limit, oneline, since }) => Effect.gen(function* () {
28
+ const git = yield* GitService;
29
+ const opts = {
30
+ n: limit,
31
+ oneline,
32
+ ...(Option.isSome(since) ? { since: since.value } : {}),
33
+ ...(Option.isSome(file) ? { file: file.value } : {})
34
+ };
35
+ const commits = yield* git.log(opts);
36
+ if (commits.length === 0) {
37
+ yield* Console.log("No commits yet");
38
+ }
39
+ else if (oneline) {
40
+ for (const commit of commits) {
41
+ yield* Console.log(`${commit.hash.substring(0, 7)} ${commit.message}`);
42
+ }
43
+ }
44
+ else {
45
+ for (const commit of commits) {
46
+ yield* Console.log(`commit ${commit.hash}`);
47
+ yield* Console.log(`Author: ${commit.author} <${commit.email}>`);
48
+ yield* Console.log(`Date: ${commit.date.toISOString()}`);
49
+ yield* Console.log(`\n ${commit.message}\n`);
50
+ }
51
+ }
52
+ })).pipe(Command.withDescription("Show commit history"));
53
+ // === Diff command ===
54
+ const diffStagedOption = Options.boolean("staged").pipe(Options.withDescription("Show staged changes"));
55
+ const diffCommitOption = Options.text("commit").pipe(Options.withDescription("Compare with specific commit"), Options.optional);
56
+ const diffFileArg = Args.text({ name: "file" }).pipe(Args.optional);
57
+ export const diffCommand = Command.make("diff", { staged: diffStagedOption, commit: diffCommitOption, file: diffFileArg }, ({ commit, file, staged }) => Effect.gen(function* () {
58
+ const git = yield* GitService;
59
+ const opts = {
60
+ staged,
61
+ ...(Option.isSome(commit) ? { commit: commit.value } : {}),
62
+ ...(Option.isSome(file) ? { file: file.value } : {})
63
+ };
64
+ const diff = yield* git.diff(opts);
65
+ if (diff === "") {
66
+ yield* Console.log("No changes");
67
+ }
68
+ else {
69
+ yield* Console.log(diff);
70
+ }
71
+ })).pipe(Command.withDescription("Show changes in working directory"));
72
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CLI commands for confluence-to-markdown.
3
+ */
4
+ export { authCommand } from "./auth.js";
5
+ export { cloneCommand } from "./clone.js";
6
+ export { deleteCommand } from "./delete.js";
7
+ export { commitCommand, diffCommand, logCommand } from "./git.js";
8
+ export { newCommand } from "./new.js";
9
+ export { getAuth } from "./shared.js";
10
+ export { pullCommand, pushCommand, statusCommand } from "./sync.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CLI commands for confluence-to-markdown.
3
+ */
4
+ export { authCommand } from "./auth.js";
5
+ export { cloneCommand } from "./clone.js";
6
+ export { deleteCommand } from "./delete.js";
7
+ export { commitCommand, diffCommand, logCommand } from "./git.js";
8
+ export { newCommand } from "./new.js";
9
+ export { getAuth } from "./shared.js";
10
+ export { pullCommand, pushCommand, statusCommand } from "./sync.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Layer definitions for CLI commands.
3
+ */
4
+ import * as NodeContext from "@effect/platform-node/NodeContext";
5
+ import * as Layer from "effect/Layer";
6
+ import { ConfluenceAuth } from "../ConfluenceAuth.js";
7
+ import { ConfluenceClient } from "../ConfluenceClient.js";
8
+ import { ConfluenceConfig } from "../ConfluenceConfig.js";
9
+ import { GitService } from "../GitService.js";
10
+ import { SyncEngine } from "../SyncEngine.js";
11
+ /**
12
+ * Full app layer with all services.
13
+ */
14
+ export declare const AppLayer: Layer.Layer<ConfluenceAuth | import("@effect/platform/HttpClient").HttpClient | ConfluenceClient | ConfluenceConfig | GitService | NodeContext.NodeContext | import("../LocalFileSystem.js").LocalFileSystem | import("../MarkdownConverter.js").MarkdownConverter | import("../internal/userCache.js").UserCache | SyncEngine, import("../ConfluenceError.js").ConfigNotFoundError | import("../ConfluenceError.js").ConfigParseError | import("../ConfluenceError.js").AuthMissingError | import("../ConfluenceError.js").FileSystemError | import("../ConfluenceError.js").OAuthError, never>;
15
+ /**
16
+ * Auth-only layer for login/logout commands.
17
+ */
18
+ export declare const AuthOnlyLayer: Layer.Layer<ConfluenceAuth | import("@effect/platform/HttpClient").HttpClient | ConfluenceClient | ConfluenceConfig | GitService | NodeContext.NodeContext | import("../LocalFileSystem.js").LocalFileSystem | import("../MarkdownConverter.js").MarkdownConverter | import("../internal/userCache.js").UserCache | SyncEngine, never, never>;
19
+ /**
20
+ * Minimal layer for help - uses real GitService for clone.
21
+ */
22
+ export declare const MinimalLayer: Layer.Layer<ConfluenceAuth | ConfluenceClient | ConfluenceConfig | GitService | NodeContext.NodeContext | import("../LocalFileSystem.js").LocalFileSystem | import("../MarkdownConverter.js").MarkdownConverter | import("../internal/userCache.js").UserCache | SyncEngine, never, never>;
23
+ /**
24
+ * Clone layer - needs auth + git but builds SyncEngine dynamically.
25
+ */
26
+ export declare const CloneLayer: Layer.Layer<ConfluenceAuth | import("@effect/platform/HttpClient").HttpClient | ConfluenceClient | ConfluenceConfig | GitService | NodeContext.NodeContext | import("../LocalFileSystem.js").LocalFileSystem | import("../MarkdownConverter.js").MarkdownConverter | import("../internal/userCache.js").UserCache | SyncEngine, never, never>;
27
+ /**
28
+ * Determine which layer to use based on command.
29
+ */
30
+ export declare const getLayerType: () => "full" | "auth" | "clone" | "minimal";
31
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/commands/layers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,mCAAmC,CAAA;AAIhE,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,cAAc,EAAgC,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,gBAAgB,EAA+D,MAAM,wBAAwB,CAAA;AACtH,OAAO,EACL,gBAAgB,EAGjB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAA;AAIvE,OAAO,EAA4B,UAAU,EAAE,MAAM,kBAAkB,CAAA;AA+GvE;;GAEG;AACH,eAAO,MAAM,QAAQ,kkBAUpB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,+UAUzB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,4RAUxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,+UAWtB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,QAAO,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAe3D,CAAA"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Layer definitions for CLI commands.
3
+ */
4
+ import * as NodeContext from "@effect/platform-node/NodeContext";
5
+ import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
6
+ import * as NodeTerminal from "@effect/platform-node/NodeTerminal";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Layer from "effect/Layer";
9
+ import { ConfluenceAuth, layer as ConfluenceAuthLayer } from "../ConfluenceAuth.js";
10
+ import { ConfluenceClient, layer as ConfluenceClientLayer } from "../ConfluenceClient.js";
11
+ import { ConfluenceConfig, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "../ConfluenceConfig.js";
12
+ import { GitService, layer as GitServiceLayer } from "../GitService.js";
13
+ import { UserCacheLayer } from "../internal/userCache.js";
14
+ import { layer as LocalFileSystemLayer } from "../LocalFileSystem.js";
15
+ import { layer as MarkdownConverterLayer } from "../MarkdownConverter.js";
16
+ import { layer as SyncEngineLayer, SyncEngine } from "../SyncEngine.js";
17
+ import { getAuth } from "./shared.js";
18
+ // Dummy config layer for help/init
19
+ const DummyConfigLayer = ConfluenceConfigLayerFromValues({
20
+ rootPageId: "dummy",
21
+ baseUrl: "https://dummy.atlassian.net",
22
+ docsPath: ".confluence/docs",
23
+ excludePatterns: [],
24
+ saveSource: false,
25
+ trackedPaths: ["**/*.md"]
26
+ });
27
+ // Dummy client layer for help/init (will fail if actually used)
28
+ const DummyConfluenceClientLayer = Layer.succeed(ConfluenceClient, ConfluenceClient.of({
29
+ getPage: () => Effect.dieMessage("Not configured"),
30
+ getChildren: () => Effect.dieMessage("Not configured"),
31
+ getAllChildren: () => Effect.dieMessage("Not configured"),
32
+ createPage: () => Effect.dieMessage("Not configured"),
33
+ updatePage: () => Effect.dieMessage("Not configured"),
34
+ deletePage: () => Effect.dieMessage("Not configured"),
35
+ getPageVersions: () => Effect.dieMessage("Not configured"),
36
+ getUser: () => Effect.dieMessage("Not configured"),
37
+ getSpaceId: () => Effect.dieMessage("Not configured"),
38
+ setEditorVersion: () => Effect.dieMessage("Not configured")
39
+ }));
40
+ // Dummy sync engine that will fail if actually used
41
+ const DummySyncEngineLayer = Layer.succeed(SyncEngine, SyncEngine.of({
42
+ pull: () => Effect.dieMessage("Not configured - run 'confluence clone' first"),
43
+ push: (_options) => Effect.dieMessage("Not configured - run 'confluence clone' first"),
44
+ status: () => Effect.dieMessage("Not configured - run 'confluence clone' first")
45
+ }));
46
+ // Dummy git layer for auth/minimal
47
+ const notConfigured = () => Effect.dieMessage("Not configured - run 'confluence clone' first");
48
+ const DummyGitServiceLayer = Layer.succeed(GitService, GitService.of({
49
+ validateGit: notConfigured,
50
+ init: notConfigured,
51
+ isInitialized: () => Effect.succeed(false),
52
+ status: notConfigured,
53
+ commit: notConfigured,
54
+ log: notConfigured,
55
+ diff: notConfigured,
56
+ addAll: notConfigured,
57
+ hasConflicts: () => Effect.succeed(false),
58
+ mergeContinue: notConfigured,
59
+ syncFromDocs: notConfigured,
60
+ syncToDocs: notConfigured,
61
+ getHead: notConfigured,
62
+ getCurrentBranch: notConfigured,
63
+ createBranch: notConfigured,
64
+ checkout: notConfigured,
65
+ reset: notConfigured,
66
+ deleteBranch: notConfigured,
67
+ getParent: notConfigured,
68
+ cherryPick: (_ref, _options) => notConfigured(),
69
+ getChangedFiles: notConfigured,
70
+ showFile: notConfigured,
71
+ amend: notConfigured,
72
+ logRange: notConfigured,
73
+ branchExists: notConfigured,
74
+ updateBranch: notConfigured,
75
+ merge: notConfigured,
76
+ getDeletedFiles: notConfigured,
77
+ getFileContentAt: notConfigured
78
+ }));
79
+ // Dummy auth layer for init/help
80
+ const DummyConfluenceAuthLayer = Layer.succeed(ConfluenceAuth, ConfluenceAuth.of({
81
+ configure: () => Effect.dieMessage("Not configured"),
82
+ isConfigured: () => Effect.succeed(false),
83
+ login: () => Effect.dieMessage("Not configured"),
84
+ logout: () => Effect.dieMessage("Not configured"),
85
+ getAccessToken: () => Effect.dieMessage("Not configured"),
86
+ getCloudId: () => Effect.dieMessage("Not configured"),
87
+ getCurrentUser: () => Effect.succeed(null),
88
+ isLoggedIn: () => Effect.succeed(false)
89
+ }));
90
+ // Auth layer with HTTP client
91
+ const AuthLive = ConfluenceAuthLayer.pipe(Layer.provide(NodeHttpClient.layer));
92
+ // Build client layer dynamically based on auth
93
+ const ConfluenceClientLive = Layer.unwrapEffect(Effect.gen(function* () {
94
+ const auth = yield* getAuth();
95
+ const config = yield* ConfluenceConfig;
96
+ const clientConfig = {
97
+ baseUrl: config.baseUrl,
98
+ auth
99
+ };
100
+ return ConfluenceClientLayer(clientConfig);
101
+ }));
102
+ /**
103
+ * Full app layer with all services.
104
+ */
105
+ export const AppLayer = SyncEngineLayer.pipe(Layer.provideMerge(UserCacheLayer), Layer.provideMerge(GitServiceLayer), Layer.provideMerge(ConfluenceClientLive), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(ConfluenceConfigLayer()), Layer.provideMerge(AuthLive), Layer.provideMerge(NodeHttpClient.layer), Layer.provideMerge(NodeContext.layer));
106
+ /**
107
+ * Auth-only layer for login/logout commands.
108
+ */
109
+ export const AuthOnlyLayer = DummySyncEngineLayer.pipe(Layer.provideMerge(UserCacheLayer), Layer.provideMerge(DummyGitServiceLayer), Layer.provideMerge(DummyConfluenceClientLayer), Layer.provideMerge(AuthLive), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(DummyConfigLayer), Layer.provideMerge(NodeHttpClient.layer), Layer.provideMerge(NodeContext.layer));
110
+ /**
111
+ * Minimal layer for help - uses real GitService for clone.
112
+ */
113
+ export const MinimalLayer = DummySyncEngineLayer.pipe(Layer.provideMerge(UserCacheLayer), Layer.provideMerge(GitServiceLayer), Layer.provideMerge(DummyConfluenceClientLayer), Layer.provideMerge(DummyConfluenceAuthLayer), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(DummyConfigLayer), Layer.provideMerge(NodeTerminal.layer), Layer.provideMerge(NodeContext.layer));
114
+ /**
115
+ * Clone layer - needs auth + git but builds SyncEngine dynamically.
116
+ */
117
+ export const CloneLayer = DummySyncEngineLayer.pipe(Layer.provideMerge(UserCacheLayer), Layer.provideMerge(GitServiceLayer), Layer.provideMerge(DummyConfluenceClientLayer), Layer.provideMerge(AuthLive), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(DummyConfigLayer), Layer.provideMerge(NodeHttpClient.layer), Layer.provideMerge(NodeTerminal.layer), Layer.provideMerge(NodeContext.layer));
118
+ /**
119
+ * Determine which layer to use based on command.
120
+ */
121
+ export const getLayerType = () => {
122
+ const cmd = process.argv[2];
123
+ // auth commands need auth layer only
124
+ if (cmd === "auth") {
125
+ return "auth";
126
+ }
127
+ // clone needs auth + git but not config-dependent services
128
+ if (cmd === "clone") {
129
+ return "clone";
130
+ }
131
+ // --help, -h, --version don't need config
132
+ if (!cmd || cmd === "--help" || cmd === "-h" || cmd === "--version") {
133
+ return "minimal";
134
+ }
135
+ return "full";
136
+ };
137
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/commands/layers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * New page command for Confluence CLI.
3
+ */
4
+ import { Command } from "@effect/cli";
5
+ import * as Path from "@effect/platform/Path";
6
+ import { ConfluenceConfig } from "../ConfluenceConfig.js";
7
+ import { LocalFileSystem } from "../LocalFileSystem.js";
8
+ export declare const newCommand: Command.Command<"new", Path.Path | ConfluenceConfig | import("@effect/platform/Terminal").Terminal | LocalFileSystem, import("../ConfluenceError.js").FileSystemError | import("../ConfluenceError.js").FrontMatterError | import("@effect/platform/Terminal").QuitException, {}>;
9
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAU,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAA;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAYvD,eAAO,MAAM,UAAU,mRA8E4D,CAAA"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * New page command for Confluence CLI.
3
+ */
4
+ import { Command, Prompt } from "@effect/cli";
5
+ import * as Path from "@effect/platform/Path";
6
+ import * as Console from "effect/Console";
7
+ import * as Effect from "effect/Effect";
8
+ import { ConfluenceConfig } from "../ConfluenceConfig.js";
9
+ import { LocalFileSystem } from "../LocalFileSystem.js";
10
+ import { flattenPageTree } from "./pageTree.js";
11
+ /** Slugify a title for use as filename */
12
+ const slugify = (title) => title
13
+ .toLowerCase()
14
+ .replace(/[^a-z0-9\s-]/g, "")
15
+ .replace(/\s+/g, "-")
16
+ .replace(/-+/g, "-")
17
+ .replace(/^-|-$/g, "");
18
+ export const newCommand = Command.make("new", {}, () => Effect.gen(function* () {
19
+ const localFs = yield* LocalFileSystem;
20
+ const config = yield* ConfluenceConfig;
21
+ const pathService = yield* Path.Path;
22
+ const docsPath = pathService.join(process.cwd(), config.docsPath);
23
+ // Build page tree
24
+ yield* Console.log("Scanning page structure...");
25
+ const tree = yield* localFs.buildPageTree(docsPath, config.rootPageId, "Root");
26
+ // Check if we have any pages
27
+ const hasPages = tree.children.length > 0 || tree.pageId !== null;
28
+ if (!hasPages) {
29
+ yield* Console.log("No pages found. Run 'confluence clone' or 'confluence pull' first.");
30
+ return;
31
+ }
32
+ // Flatten to choices
33
+ const choices = flattenPageTree(tree);
34
+ // Show parent selector
35
+ const parent = yield* Prompt.select({
36
+ message: "Select parent page for the new page:",
37
+ choices
38
+ });
39
+ // Prompt for title
40
+ const title = yield* Prompt.text({
41
+ message: "Enter page title:"
42
+ });
43
+ if (!title.trim()) {
44
+ yield* Console.log("Title cannot be empty");
45
+ return;
46
+ }
47
+ // Generate filename
48
+ const filename = `${slugify(title.trim())}.md`;
49
+ // Determine file path
50
+ // If parent is root (path === ""), create in docsPath
51
+ // If parent has children, create in parent's directory
52
+ let filePath;
53
+ if (parent.path === "") {
54
+ // Root level
55
+ filePath = pathService.join(docsPath, filename);
56
+ }
57
+ else {
58
+ // Under a page - check if parent directory exists
59
+ const parentBasename = pathService.basename(parent.path, ".md");
60
+ const parentDir = pathService.dirname(parent.path);
61
+ const targetDir = parentDir === "." ? parentBasename : pathService.join(parentDir, parentBasename);
62
+ filePath = pathService.join(docsPath, targetDir, filename);
63
+ }
64
+ // Check if file already exists
65
+ const exists = yield* localFs.exists(filePath);
66
+ if (exists) {
67
+ yield* Console.log(`File already exists: ${filePath}`);
68
+ return;
69
+ }
70
+ // Write new page file with title-only front-matter
71
+ yield* localFs.writeNewPageFile(filePath, { title: title.trim() }, "\n<!-- Write your page content here -->\n");
72
+ const relativePath = pathService.relative(process.cwd(), filePath);
73
+ yield* Console.log(`Created new page: ${relativePath}`);
74
+ yield* Console.log("");
75
+ yield* Console.log("Next steps:");
76
+ yield* Console.log(" 1. Edit the file to add content");
77
+ yield* Console.log(" 2. Run 'confluence commit' to stage changes");
78
+ yield* Console.log(" 3. Run 'confluence push' to create on Confluence");
79
+ })).pipe(Command.withDescription("Create a new page to be pushed to Confluence"));
80
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared page tree utilities for CLI commands.
3
+ */
4
+ import type { PageTreeNode } from "../LocalFileSystem.js";
5
+ export interface PageChoice {
6
+ readonly title: string;
7
+ readonly value: {
8
+ readonly path: string;
9
+ readonly pageId: string | null;
10
+ readonly nodeTitle: string;
11
+ };
12
+ readonly description?: string;
13
+ }
14
+ /**
15
+ * Flatten page tree to choices with indentation for interactive prompts.
16
+ */
17
+ export declare const flattenPageTree: (node: PageTreeNode, depth?: number) => ReadonlyArray<PageChoice>;
18
+ //# sourceMappingURL=pageTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageTree.d.ts","sourceRoot":"","sources":["../../src/commands/pageTree.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAC3B,CAAA;IACD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,YAAY,EAClB,QAAO,MAAU,KAChB,aAAa,CAAC,UAAU,CAkB1B,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Flatten page tree to choices with indentation for interactive prompts.
3
+ */
4
+ export const flattenPageTree = (node, depth = 0) => {
5
+ const indent = " ".repeat(depth);
6
+ const prefix = depth === 0 ? "" : "├─ ";
7
+ const choices = [];
8
+ choices.push({
9
+ title: `${indent}${prefix}${node.title}`,
10
+ value: { path: node.path, pageId: node.pageId, nodeTitle: node.title },
11
+ description: node.pageId ? `Page ID: ${node.pageId}` : "Root"
12
+ });
13
+ for (const child of node.children) {
14
+ for (const choice of flattenPageTree(child, depth + 1)) {
15
+ choices.push(choice);
16
+ }
17
+ }
18
+ return choices;
19
+ };
20
+ //# sourceMappingURL=pageTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageTree.js","sourceRoot":"","sources":["../../src/commands/pageTree.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAkB,EAClB,QAAgB,CAAC,EACU,EAAE;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IACvC,MAAM,OAAO,GAAsB,EAAE,CAAA;IAErC,OAAO,CAAC,IAAI,CAAC;QACX,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;QACxC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE;QACtE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;KAC9D,CAAC,CAAA;IAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { ConfluenceAuth } from "../ConfluenceAuth.js";
3
+ /**
4
+ * Get authentication config from env vars or OAuth.
5
+ */
6
+ export declare const getAuth: () => Effect.Effect<{
7
+ type: "token";
8
+ email: string;
9
+ token: string;
10
+ } | {
11
+ type: "oauth2";
12
+ accessToken: string;
13
+ cloudId: string;
14
+ }, import("../ConfluenceError.js").AuthMissingError | import("../ConfluenceError.js").FileSystemError | import("../ConfluenceError.js").OAuthError, ConfluenceAuth>;
15
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAOrD;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;mKAkBhB,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Shared utilities for CLI commands.
3
+ */
4
+ import * as Config from "effect/Config";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Option from "effect/Option";
7
+ import { ConfluenceAuth } from "../ConfluenceAuth.js";
8
+ const AuthConfig = Config.all({
9
+ apiKey: Config.string("CONFLUENCE_API_KEY"),
10
+ email: Config.string("CONFLUENCE_EMAIL")
11
+ });
12
+ /**
13
+ * Get authentication config from env vars or OAuth.
14
+ */
15
+ export const getAuth = () => Effect.gen(function* () {
16
+ // 1. Try env vars first (backwards compat)
17
+ const envAuth = yield* AuthConfig.pipe(Effect.map(({ apiKey, email }) => ({ type: "token", email, token: apiKey })), Effect.option);
18
+ if (Option.isSome(envAuth)) {
19
+ return envAuth.value;
20
+ }
21
+ // 2. Try OAuth token
22
+ const auth = yield* ConfluenceAuth;
23
+ const accessToken = yield* auth.getAccessToken();
24
+ const cloudId = yield* auth.getCloudId();
25
+ return { type: "oauth2", accessToken, cloudId };
26
+ });
27
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC;CACzC,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,2CAA2C;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CACpC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EACrF,MAAM,CAAC,MAAM,CACd,CAAA;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,KAAK,CAAA;IACtB,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAA;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;IAExC,OAAO,EAAE,IAAI,EAAE,QAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;AAC1D,CAAC,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Sync commands (pull, push, status) for Confluence CLI.
3
+ */
4
+ import { Command } from "@effect/cli";
5
+ import { GitService } from "../GitService.js";
6
+ import { SyncEngine } from "../SyncEngine.js";
7
+ export declare const pullCommand: Command.Command<"pull", SyncEngine, import("../ConfluenceError.js").ApiError | import("../ConfluenceError.js").RateLimitError | import("../ConfluenceError.js").ConversionError | import("../ConfluenceError.js").FileSystemError | import("../ConfluenceError.js").FrontMatterError | import("../ConfluenceError.js").StructureError | import("../GitService.js").GitServiceError, {
8
+ readonly force: boolean;
9
+ readonly replayHistory: boolean;
10
+ }>;
11
+ export declare const pushCommand: Command.Command<"push", GitService | SyncEngine, import("../ConfluenceError.js").ApiError | import("../ConfluenceError.js").RateLimitError | import("../ConfluenceError.js").ConversionError | import("../ConfluenceError.js").FileSystemError | import("../ConfluenceError.js").FrontMatterError | import("../ConfluenceError.js").StructureError | import("../GitError.js").GitError | import("../GitError.js").GitNotInstalledError | import("../GitError.js").GitNoChangesError | import("../GitError.js").GitMergeConflictError | import("../GitError.js").GitNotInitializedError, {
12
+ readonly dryRun: boolean;
13
+ }>;
14
+ export declare const statusCommand: Command.Command<"status", GitService | SyncEngine, import("../ConfluenceError.js").ApiError | import("../ConfluenceError.js").RateLimitError | import("../ConfluenceError.js").ConversionError | import("../ConfluenceError.js").FileSystemError | import("../ConfluenceError.js").FrontMatterError | import("../ConfluenceError.js").StructureError | import("../GitError.js").GitError | import("../GitError.js").GitNotInstalledError | import("../GitError.js").GitNoChangesError | import("../GitError.js").GitMergeConflictError | import("../GitError.js").GitNotInitializedError, {}>;
15
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAW,MAAM,aAAa,CAAA;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAY7C,eAAO,MAAM,WAAW;;;EA0B2D,CAAA;AAQnF,eAAO,MAAM,WAAW;;EA0BsD,CAAA;AAG9E,eAAO,MAAM,aAAa,+jBA8C6B,CAAA"}