@knpkv/confluence-to-markdown 0.2.0 → 0.4.2

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 +73 -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 +366 -0
  7. package/dist/ConfluenceAuth.js.map +1 -0
  8. package/dist/ConfluenceClient.d.ts +26 -12
  9. package/dist/ConfluenceClient.d.ts.map +1 -1
  10. package/dist/ConfluenceClient.js +139 -97
  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 +99 -16
  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 +32 -21
  255. package/src/ConfluenceAuth.ts +581 -0
  256. package/src/ConfluenceClient.ts +230 -165
  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
@@ -26,7 +26,15 @@ import * as Data from "effect/Data"
26
26
  */
27
27
  export class ConfigNotFoundError extends Data.TaggedError("ConfigNotFoundError")<{
28
28
  readonly path: string
29
- }> {}
29
+ readonly message: string
30
+ }> {
31
+ constructor(params: { path: string }) {
32
+ super({
33
+ path: params.path,
34
+ message: `Config not found: ${params.path}\nRun 'confluence clone' to initialize.`
35
+ })
36
+ }
37
+ }
30
38
 
31
39
  /**
32
40
  * Error thrown when .confluence.json parsing fails.
@@ -36,7 +44,16 @@ export class ConfigNotFoundError extends Data.TaggedError("ConfigNotFoundError")
36
44
  export class ConfigParseError extends Data.TaggedError("ConfigParseError")<{
37
45
  readonly path: string
38
46
  readonly cause: unknown
39
- }> {}
47
+ readonly message: string
48
+ }> {
49
+ constructor(params: { path: string; cause: unknown }) {
50
+ super({
51
+ path: params.path,
52
+ cause: params.cause,
53
+ message: `Invalid config file: ${params.path}`
54
+ })
55
+ }
56
+ }
40
57
 
41
58
  /**
42
59
  * Error thrown when configuration validation fails.
@@ -58,8 +75,8 @@ export class ConfigError extends Data.TaggedError("ConfigError")<{
58
75
  * Effect.gen(function* () {
59
76
  * // ... operation that needs auth
60
77
  * }).pipe(
61
- * Effect.catchTag("AuthMissingError", () =>
62
- * Effect.sync(() => console.error("Set CONFLUENCE_API_KEY or run: confluence auth login"))
78
+ * Effect.catchTag("AuthMissingError", (error) =>
79
+ * Effect.sync(() => console.error(error.message))
63
80
  * )
64
81
  * )
65
82
  * ```
@@ -69,8 +86,11 @@ export class ConfigError extends Data.TaggedError("ConfigError")<{
69
86
  export class AuthMissingError extends Data.TaggedError("AuthMissingError")<{
70
87
  readonly message: string
71
88
  }> {
72
- constructor() {
73
- super({ message: "CONFLUENCE_API_KEY env var or OAuth2 credentials required" })
89
+ constructor(params?: { message?: string }) {
90
+ super({
91
+ message: params?.message ??
92
+ "Not authenticated. Run 'confluence login' or set CONFLUENCE_API_KEY + CONFLUENCE_EMAIL"
93
+ })
74
94
  }
75
95
  }
76
96
 
@@ -92,8 +112,16 @@ export class ApiError extends Data.TaggedError("ApiError")<{
92
112
  * @category Errors
93
113
  */
94
114
  export class RateLimitError extends Data.TaggedError("RateLimitError")<{
95
- readonly retryAfter?: number
96
- }> {}
115
+ readonly retryAfter?: number | undefined
116
+ readonly message: string
117
+ }> {
118
+ constructor(params?: { retryAfter?: number }) {
119
+ const message = params?.retryAfter
120
+ ? `Rate limited. Retry after ${params.retryAfter}s.`
121
+ : "Rate limited. Please wait and try again."
122
+ super({ retryAfter: params?.retryAfter, message })
123
+ }
124
+ }
97
125
 
98
126
  /**
99
127
  * Error thrown when HTML/Markdown conversion fails.
@@ -103,7 +131,16 @@ export class RateLimitError extends Data.TaggedError("RateLimitError")<{
103
131
  export class ConversionError extends Data.TaggedError("ConversionError")<{
104
132
  readonly direction: "htmlToMarkdown" | "markdownToHtml"
105
133
  readonly cause: unknown
106
- }> {}
134
+ readonly message: string
135
+ }> {
136
+ constructor(params: { direction: "htmlToMarkdown" | "markdownToHtml"; cause: unknown }) {
137
+ super({
138
+ direction: params.direction,
139
+ cause: params.cause,
140
+ message: `Conversion failed (${params.direction}): ${params.cause}`
141
+ })
142
+ }
143
+ }
107
144
 
108
145
  /**
109
146
  * Error thrown when sync conflict is detected.
@@ -115,7 +152,15 @@ export class ConflictError extends Data.TaggedError("ConflictError")<{
115
152
  readonly localVersion: number
116
153
  readonly remoteVersion: number
117
154
  readonly path: string
118
- }> {}
155
+ readonly message: string
156
+ }> {
157
+ constructor(params: { pageId: string; localVersion: number; remoteVersion: number; path: string }) {
158
+ super({
159
+ ...params,
160
+ message: `Conflict: ${params.path} (local v${params.localVersion} vs remote v${params.remoteVersion})`
161
+ })
162
+ }
163
+ }
119
164
 
120
165
  /**
121
166
  * Error thrown when file system operation fails.
@@ -126,7 +171,15 @@ export class FileSystemError extends Data.TaggedError("FileSystemError")<{
126
171
  readonly operation: "read" | "write" | "delete" | "mkdir" | "rename"
127
172
  readonly path: string
128
173
  readonly cause: unknown
129
- }> {}
174
+ readonly message: string
175
+ }> {
176
+ constructor(params: { operation: "read" | "write" | "delete" | "mkdir" | "rename"; path: string; cause: unknown }) {
177
+ super({
178
+ ...params,
179
+ message: `File ${params.operation} failed: ${params.path}`
180
+ })
181
+ }
182
+ }
130
183
 
131
184
  /**
132
185
  * Error thrown when OAuth2 flow fails.
@@ -134,9 +187,17 @@ export class FileSystemError extends Data.TaggedError("FileSystemError")<{
134
187
  * @category Errors
135
188
  */
136
189
  export class OAuthError extends Data.TaggedError("OAuthError")<{
137
- readonly step: "authorize" | "token" | "refresh"
190
+ readonly step: "authorize" | "token" | "refresh" | "revoke"
138
191
  readonly cause: unknown
139
- }> {}
192
+ readonly message: string
193
+ }> {
194
+ constructor(params: { step: "authorize" | "token" | "refresh" | "revoke"; cause: unknown }) {
195
+ super({
196
+ ...params,
197
+ message: `OAuth ${params.step} failed: ${params.cause}`
198
+ })
199
+ }
200
+ }
140
201
 
141
202
  /**
142
203
  * Error thrown when front-matter parsing fails.
@@ -146,6 +207,39 @@ export class OAuthError extends Data.TaggedError("OAuthError")<{
146
207
  export class FrontMatterError extends Data.TaggedError("FrontMatterError")<{
147
208
  readonly path: string
148
209
  readonly cause: unknown
210
+ readonly message: string
211
+ }> {
212
+ constructor(params: { path: string; cause: unknown }) {
213
+ super({
214
+ ...params,
215
+ message: `Invalid front-matter in: ${params.path}`
216
+ })
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Error thrown when directory structure is inconsistent.
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * import { Effect } from "effect"
226
+ * import { StructureError } from "@knpkv/confluence-to-markdown/ConfluenceError"
227
+ *
228
+ * Effect.gen(function* () {
229
+ * // ... validate structure
230
+ * }).pipe(
231
+ * Effect.catchTag("StructureError", (error) =>
232
+ * Effect.sync(() => console.error(`${error.message}\nAdvice: ${error.advice}`))
233
+ * )
234
+ * )
235
+ * ```
236
+ *
237
+ * @category Errors
238
+ */
239
+ export class StructureError extends Data.TaggedError("StructureError")<{
240
+ readonly path: string
241
+ readonly advice: string
242
+ readonly message: string
149
243
  }> {}
150
244
 
151
245
  /**
@@ -165,6 +259,7 @@ export type ConfluenceError =
165
259
  | FileSystemError
166
260
  | OAuthError
167
261
  | FrontMatterError
262
+ | StructureError
168
263
 
169
264
  /**
170
265
  * Type guard to check if error is a ConfluenceError.
@@ -189,5 +284,6 @@ export const isConfluenceError = (error: unknown): error is ConfluenceError =>
189
284
  "ConflictError",
190
285
  "FileSystemError",
191
286
  "OAuthError",
192
- "FrontMatterError"
287
+ "FrontMatterError",
288
+ "StructureError"
193
289
  ].includes((error as { _tag: string })._tag)
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Git-specific error types.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Data from "effect/Data"
7
+
8
+ /**
9
+ * Base git error for command execution failures.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { GitError } from "@knpkv/confluence-to-markdown/GitError"
14
+ *
15
+ * const error = new GitError({
16
+ * command: "git commit",
17
+ * message: "nothing to commit",
18
+ * exitCode: 1
19
+ * })
20
+ * ```
21
+ *
22
+ * @category Error
23
+ */
24
+ export class GitError extends Data.TaggedError("GitError")<{
25
+ readonly command: string
26
+ readonly message: string
27
+ readonly exitCode?: number
28
+ }> {}
29
+
30
+ /**
31
+ * Error when git is not installed on the system.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * import { GitNotInstalledError } from "@knpkv/confluence-to-markdown/GitError"
36
+ *
37
+ * const error = new GitNotInstalledError({
38
+ * message: "git command not found"
39
+ * })
40
+ * ```
41
+ *
42
+ * @category Error
43
+ */
44
+ export class GitNotInstalledError extends Data.TaggedError("GitNotInstalledError")<{
45
+ readonly message: string
46
+ }> {}
47
+
48
+ /**
49
+ * Error when there are no changes to commit.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * import { GitNoChangesError } from "@knpkv/confluence-to-markdown/GitError"
54
+ *
55
+ * const error = new GitNoChangesError({})
56
+ * ```
57
+ *
58
+ * @category Error
59
+ */
60
+ export class GitNoChangesError extends Data.TaggedError("GitNoChangesError")<{}> {}
61
+
62
+ /**
63
+ * Error when merge conflicts exist.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * import { GitMergeConflictError } from "@knpkv/confluence-to-markdown/GitError"
68
+ *
69
+ * const error = new GitMergeConflictError({
70
+ * files: ["docs/page1.md", "docs/page2.md"]
71
+ * })
72
+ * ```
73
+ *
74
+ * @category Error
75
+ */
76
+ export class GitMergeConflictError extends Data.TaggedError("GitMergeConflictError")<{
77
+ readonly files: ReadonlyArray<string>
78
+ }> {}
79
+
80
+ /**
81
+ * Error when git repository is not initialized.
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * import { GitNotInitializedError } from "@knpkv/confluence-to-markdown/GitError"
86
+ *
87
+ * const error = new GitNotInitializedError({})
88
+ * ```
89
+ *
90
+ * @category Error
91
+ */
92
+ export class GitNotInitializedError extends Data.TaggedError("GitNotInitializedError")<{}> {}