@knpkv/confluence-to-markdown 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +62 -0
  3. package/dist/Brand.d.ts +77 -0
  4. package/dist/Brand.d.ts.map +1 -0
  5. package/dist/Brand.js +44 -0
  6. package/dist/Brand.js.map +1 -0
  7. package/dist/ConfluenceClient.d.ts +140 -0
  8. package/dist/ConfluenceClient.d.ts.map +1 -0
  9. package/dist/ConfluenceClient.js +195 -0
  10. package/dist/ConfluenceClient.js.map +1 -0
  11. package/dist/ConfluenceConfig.d.ts +83 -0
  12. package/dist/ConfluenceConfig.d.ts.map +1 -0
  13. package/dist/ConfluenceConfig.js +122 -0
  14. package/dist/ConfluenceConfig.js.map +1 -0
  15. package/dist/ConfluenceError.d.ts +178 -0
  16. package/dist/ConfluenceError.d.ts.map +1 -0
  17. package/dist/ConfluenceError.js +131 -0
  18. package/dist/ConfluenceError.js.map +1 -0
  19. package/dist/LocalFileSystem.d.ts +85 -0
  20. package/dist/LocalFileSystem.d.ts.map +1 -0
  21. package/dist/LocalFileSystem.js +101 -0
  22. package/dist/LocalFileSystem.js.map +1 -0
  23. package/dist/MarkdownConverter.d.ts +50 -0
  24. package/dist/MarkdownConverter.d.ts.map +1 -0
  25. package/dist/MarkdownConverter.js +151 -0
  26. package/dist/MarkdownConverter.js.map +1 -0
  27. package/dist/Schemas.d.ts +225 -0
  28. package/dist/Schemas.d.ts.map +1 -0
  29. package/dist/Schemas.js +164 -0
  30. package/dist/Schemas.js.map +1 -0
  31. package/dist/SyncEngine.d.ts +132 -0
  32. package/dist/SyncEngine.d.ts.map +1 -0
  33. package/dist/SyncEngine.js +267 -0
  34. package/dist/SyncEngine.js.map +1 -0
  35. package/dist/bin.d.ts +3 -0
  36. package/dist/bin.d.ts.map +1 -0
  37. package/dist/bin.js +163 -0
  38. package/dist/bin.js.map +1 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +16 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/internal/frontmatter.d.ts +38 -0
  44. package/dist/internal/frontmatter.d.ts.map +1 -0
  45. package/dist/internal/frontmatter.js +69 -0
  46. package/dist/internal/frontmatter.js.map +1 -0
  47. package/dist/internal/hashUtils.d.ts +11 -0
  48. package/dist/internal/hashUtils.d.ts.map +1 -0
  49. package/dist/internal/hashUtils.js +17 -0
  50. package/dist/internal/hashUtils.js.map +1 -0
  51. package/dist/internal/pathUtils.d.ts +41 -0
  52. package/dist/internal/pathUtils.d.ts.map +1 -0
  53. package/dist/internal/pathUtils.js +69 -0
  54. package/dist/internal/pathUtils.js.map +1 -0
  55. package/package.json +113 -0
  56. package/src/Brand.ts +104 -0
  57. package/src/ConfluenceClient.ts +387 -0
  58. package/src/ConfluenceConfig.ts +184 -0
  59. package/src/ConfluenceError.ts +193 -0
  60. package/src/LocalFileSystem.ts +225 -0
  61. package/src/MarkdownConverter.ts +187 -0
  62. package/src/Schemas.ts +235 -0
  63. package/src/SyncEngine.ts +429 -0
  64. package/src/bin.ts +269 -0
  65. package/src/index.ts +35 -0
  66. package/src/internal/frontmatter.ts +98 -0
  67. package/src/internal/hashUtils.ts +19 -0
  68. package/src/internal/pathUtils.ts +77 -0
  69. package/test/Brand.test.ts +72 -0
  70. package/test/MarkdownConverter.test.ts +108 -0
  71. package/test/Schemas.test.ts +99 -0
  72. package/tsconfig.json +32 -0
  73. package/vitest.config.integration.ts +12 -0
  74. package/vitest.config.ts +13 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Sync engine for bidirectional Confluence <-> Markdown synchronization.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Path from "@effect/platform/Path";
7
+ import * as Context from "effect/Context";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Layer from "effect/Layer";
10
+ import { ConfluenceClient } from "./ConfluenceClient.js";
11
+ import { ConfluenceConfig } from "./ConfluenceConfig.js";
12
+ import type { ApiError, ConflictError, ConversionError, FileSystemError, FrontMatterError, RateLimitError } from "./ConfluenceError.js";
13
+ import { LocalFileSystem } from "./LocalFileSystem.js";
14
+ import { MarkdownConverter } from "./MarkdownConverter.js";
15
+ import type { PageResponse } from "./Schemas.js";
16
+ /**
17
+ * Sync status for a single page.
18
+ */
19
+ export type SyncStatus = {
20
+ readonly _tag: "Synced";
21
+ readonly path: string;
22
+ } | {
23
+ readonly _tag: "LocalOnly";
24
+ readonly path: string;
25
+ readonly title: string;
26
+ } | {
27
+ readonly _tag: "RemoteOnly";
28
+ readonly page: PageResponse;
29
+ } | {
30
+ readonly _tag: "LocalModified";
31
+ readonly path: string;
32
+ readonly page: PageResponse;
33
+ } | {
34
+ readonly _tag: "RemoteModified";
35
+ readonly path: string;
36
+ readonly page: PageResponse;
37
+ } | {
38
+ readonly _tag: "Conflict";
39
+ readonly path: string;
40
+ readonly page: PageResponse;
41
+ readonly localVersion: number;
42
+ readonly remoteVersion: number;
43
+ };
44
+ /**
45
+ * Result of a pull operation.
46
+ */
47
+ export interface PullResult {
48
+ readonly pulled: number;
49
+ readonly skipped: number;
50
+ readonly errors: ReadonlyArray<string>;
51
+ }
52
+ /**
53
+ * Result of a push operation.
54
+ */
55
+ export interface PushResult {
56
+ readonly pushed: number;
57
+ readonly created: number;
58
+ readonly skipped: number;
59
+ readonly errors: ReadonlyArray<string>;
60
+ }
61
+ /**
62
+ * Result of a sync operation.
63
+ */
64
+ export interface SyncResult {
65
+ readonly pulled: number;
66
+ readonly pushed: number;
67
+ readonly created: number;
68
+ readonly conflicts: number;
69
+ readonly errors: ReadonlyArray<string>;
70
+ }
71
+ /**
72
+ * Result of a status operation.
73
+ */
74
+ export interface StatusResult {
75
+ readonly synced: number;
76
+ readonly localModified: number;
77
+ readonly remoteModified: number;
78
+ readonly conflicts: number;
79
+ readonly localOnly: number;
80
+ readonly remoteOnly: number;
81
+ readonly files: ReadonlyArray<SyncStatus>;
82
+ }
83
+ type SyncError = ApiError | RateLimitError | ConversionError | FileSystemError | FrontMatterError;
84
+ declare const SyncEngine_base: Context.TagClass<SyncEngine, "@knpkv/confluence-to-markdown/SyncEngine", {
85
+ /**
86
+ * Pull pages from Confluence to local markdown.
87
+ */
88
+ readonly pull: (options: {
89
+ force: boolean;
90
+ }) => Effect.Effect<PullResult, SyncError>;
91
+ /**
92
+ * Push local markdown changes to Confluence.
93
+ */
94
+ readonly push: (options: {
95
+ dryRun: boolean;
96
+ }) => Effect.Effect<PushResult, SyncError>;
97
+ /**
98
+ * Bidirectional sync with conflict detection.
99
+ */
100
+ readonly sync: () => Effect.Effect<SyncResult, SyncError | ConflictError>;
101
+ /**
102
+ * Get sync status for all files.
103
+ */
104
+ readonly status: () => Effect.Effect<StatusResult, SyncError>;
105
+ }>;
106
+ /**
107
+ * Sync engine service for Confluence <-> Markdown operations.
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * import { SyncEngine } from "@knpkv/confluence-to-markdown/SyncEngine"
112
+ * import { Effect } from "effect"
113
+ *
114
+ * const program = Effect.gen(function* () {
115
+ * const engine = yield* SyncEngine
116
+ * const result = yield* engine.pull({ force: false })
117
+ * console.log(`Pulled ${result.pulled} pages`)
118
+ * })
119
+ * ```
120
+ *
121
+ * @category Sync
122
+ */
123
+ export declare class SyncEngine extends SyncEngine_base {
124
+ }
125
+ /**
126
+ * Layer that provides SyncEngine.
127
+ *
128
+ * @category Layers
129
+ */
130
+ export declare const layer: Layer.Layer<SyncEngine, never, ConfluenceClient | ConfluenceConfig | MarkdownConverter | LocalFileSystem | Path.Path>;
131
+ export {};
132
+ //# sourceMappingURL=SyncEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncEngine.d.ts","sourceRoot":"","sources":["../src/SyncEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Sync engine for bidirectional Confluence <-> Markdown synchronization.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Path from "@effect/platform/Path";
7
+ import * as Context from "effect/Context";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Layer from "effect/Layer";
10
+ import { ConfluenceClient } from "./ConfluenceClient.js";
11
+ import { ConfluenceConfig } from "./ConfluenceConfig.js";
12
+ import { computeHash } from "./internal/hashUtils.js";
13
+ import { LocalFileSystem } from "./LocalFileSystem.js";
14
+ import { MarkdownConverter } from "./MarkdownConverter.js";
15
+ /**
16
+ * Sync engine service for Confluence <-> Markdown operations.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { SyncEngine } from "@knpkv/confluence-to-markdown/SyncEngine"
21
+ * import { Effect } from "effect"
22
+ *
23
+ * const program = Effect.gen(function* () {
24
+ * const engine = yield* SyncEngine
25
+ * const result = yield* engine.pull({ force: false })
26
+ * console.log(`Pulled ${result.pulled} pages`)
27
+ * })
28
+ * ```
29
+ *
30
+ * @category Sync
31
+ */
32
+ export class SyncEngine extends Context.Tag("@knpkv/confluence-to-markdown/SyncEngine")() {
33
+ }
34
+ /**
35
+ * Layer that provides SyncEngine.
36
+ *
37
+ * @category Layers
38
+ */
39
+ export const layer = Layer.effect(SyncEngine, Effect.gen(function* () {
40
+ const client = yield* ConfluenceClient;
41
+ const config = yield* ConfluenceConfig;
42
+ const converter = yield* MarkdownConverter;
43
+ const localFs = yield* LocalFileSystem;
44
+ const pathService = yield* Path.Path;
45
+ const docsPath = pathService.join(process.cwd(), config.docsPath);
46
+ /**
47
+ * Pull a single page and its children recursively.
48
+ */
49
+ const pullPage = (page, parentPath, force) => Effect.gen(function* () {
50
+ // Get children to determine if this is a folder
51
+ const children = yield* client.getAllChildren(page.id);
52
+ const hasChildren = children.length > 0;
53
+ const filePath = localFs.getPagePath(page.title, hasChildren, parentPath);
54
+ const dirPath = hasChildren ? localFs.getPageDir(page.title, parentPath) : parentPath;
55
+ // Get page content
56
+ const fullPage = yield* client.getPage(page.id);
57
+ const htmlContent = fullPage.body?.storage?.value ?? "";
58
+ let markdown = yield* converter.htmlToMarkdown(htmlContent);
59
+ // Add child page links for index pages
60
+ if (hasChildren && config.spaceKey) {
61
+ const childLinks = children
62
+ .map((child) => {
63
+ const pageUrl = `${config.baseUrl}/wiki/spaces/${config.spaceKey}/pages/${child.id}`;
64
+ return `- [${child.title}](${pageUrl})`;
65
+ })
66
+ .join("\n");
67
+ markdown = markdown.trim() + "\n\n## Child Pages\n\n" + childLinks + "\n";
68
+ }
69
+ const contentHash = computeHash(markdown);
70
+ // Check if we need to update
71
+ if (!force) {
72
+ const exists = yield* localFs.exists(filePath);
73
+ if (exists) {
74
+ const localFile = yield* localFs.readMarkdownFile(filePath);
75
+ if (localFile.frontMatter &&
76
+ localFile.frontMatter.version === fullPage.version.number &&
77
+ localFile.frontMatter.contentHash === contentHash) {
78
+ // Skip - already in sync
79
+ let count = 0;
80
+ for (const child of children) {
81
+ count += yield* pullPage(child, dirPath, force);
82
+ }
83
+ return count;
84
+ }
85
+ }
86
+ }
87
+ // Ensure directory exists
88
+ if (hasChildren) {
89
+ yield* localFs.ensureDir(dirPath);
90
+ }
91
+ // Write file
92
+ const frontMatter = {
93
+ pageId: page.id,
94
+ version: fullPage.version.number,
95
+ title: fullPage.title,
96
+ updated: fullPage.version.createdAt ? new Date(fullPage.version.createdAt) : new Date(),
97
+ ...(page.parentId ? { parentId: page.parentId } : {}),
98
+ ...(page.position !== undefined ? { position: page.position } : {}),
99
+ contentHash
100
+ };
101
+ yield* localFs.writeMarkdownFile(filePath, frontMatter, markdown);
102
+ // Pull children
103
+ let count = 1;
104
+ for (const child of children) {
105
+ count += yield* pullPage(child, dirPath, force);
106
+ }
107
+ return count;
108
+ });
109
+ const pull = (options) => Effect.gen(function* () {
110
+ yield* localFs.ensureDir(docsPath);
111
+ const rootPage = yield* client.getPage(config.rootPageId);
112
+ const pulled = yield* pullPage(rootPage, docsPath, options.force);
113
+ return {
114
+ pulled,
115
+ skipped: 0,
116
+ errors: []
117
+ };
118
+ });
119
+ const push = (options) => Effect.gen(function* () {
120
+ const files = yield* localFs.listMarkdownFiles(docsPath);
121
+ let pushed = 0;
122
+ let created = 0;
123
+ let skipped = 0;
124
+ const errors = [];
125
+ for (const filePath of files) {
126
+ yield* Effect.gen(function* () {
127
+ const localFile = yield* localFs.readMarkdownFile(filePath);
128
+ if (localFile.isNew || !localFile.frontMatter) {
129
+ // New file - create page
130
+ if (!options.dryRun) {
131
+ // For now, skip page creation - need space ID in config
132
+ errors.push(`Page creation requires space ID in config (not yet supported): ${filePath}`);
133
+ }
134
+ created++;
135
+ return;
136
+ }
137
+ const fm = localFile.frontMatter;
138
+ const currentHash = computeHash(localFile.content);
139
+ if (currentHash === fm.contentHash) {
140
+ skipped++;
141
+ return;
142
+ }
143
+ if (!options.dryRun) {
144
+ // Fetch current version to avoid conflicts
145
+ const remotePage = yield* client.getPage(fm.pageId);
146
+ const html = yield* converter.markdownToHtml(localFile.content);
147
+ const updatedPage = yield* client.updatePage({
148
+ id: fm.pageId,
149
+ title: fm.title,
150
+ status: "current",
151
+ version: {
152
+ number: remotePage.version.number + 1,
153
+ message: "Updated via confluence-to-markdown"
154
+ },
155
+ body: {
156
+ representation: "storage",
157
+ value: html
158
+ }
159
+ });
160
+ // Update front-matter with new version
161
+ const newFrontMatter = {
162
+ ...fm,
163
+ version: updatedPage.version.number,
164
+ updated: new Date(),
165
+ contentHash: currentHash
166
+ };
167
+ yield* localFs.writeMarkdownFile(filePath, newFrontMatter, localFile.content);
168
+ }
169
+ pushed++;
170
+ }).pipe(Effect.catchAll((error) => Effect.sync(() => {
171
+ errors.push(`Failed to push ${filePath}: ${error._tag === "ApiError" ? error.message : error._tag}`);
172
+ })));
173
+ }
174
+ return { pushed, created, skipped, errors: errors };
175
+ });
176
+ const sync = () => Effect.gen(function* () {
177
+ // First, check for conflicts
178
+ const statusResult = yield* status();
179
+ const conflictErrors = [];
180
+ if (statusResult.conflicts > 0) {
181
+ for (const file of statusResult.files) {
182
+ if (file._tag === "Conflict") {
183
+ conflictErrors.push(`Conflict in ${file.path}: local v${file.localVersion} vs remote v${file.remoteVersion}`);
184
+ }
185
+ }
186
+ }
187
+ // Pull remote changes
188
+ const pullResult = yield* pull({ force: false });
189
+ // Push local changes
190
+ const pushResult = yield* push({ dryRun: false });
191
+ return {
192
+ pulled: pullResult.pulled,
193
+ pushed: pushResult.pushed,
194
+ created: pushResult.created,
195
+ conflicts: statusResult.conflicts,
196
+ errors: [...conflictErrors, ...pullResult.errors, ...pushResult.errors]
197
+ };
198
+ });
199
+ const status = () => Effect.gen(function* () {
200
+ const files = yield* localFs.listMarkdownFiles(docsPath);
201
+ const statuses = [];
202
+ let synced = 0;
203
+ let localModified = 0;
204
+ let remoteModified = 0;
205
+ let conflicts = 0;
206
+ let localOnly = 0;
207
+ const remoteOnly = 0;
208
+ for (const filePath of files) {
209
+ const localFile = yield* localFs.readMarkdownFile(filePath);
210
+ if (localFile.isNew || !localFile.frontMatter) {
211
+ statuses.push({ _tag: "LocalOnly", path: filePath, title: pathService.basename(filePath, ".md") });
212
+ localOnly++;
213
+ continue;
214
+ }
215
+ const fm = localFile.frontMatter;
216
+ const currentHash = computeHash(localFile.content);
217
+ // Fetch remote page
218
+ const remotePage = yield* Effect.either(client.getPage(fm.pageId));
219
+ if (remotePage._tag === "Left") {
220
+ statuses.push({ _tag: "LocalOnly", path: filePath, title: fm.title });
221
+ localOnly++;
222
+ continue;
223
+ }
224
+ const page = remotePage.right;
225
+ const localChanged = currentHash !== fm.contentHash;
226
+ const remoteChanged = page.version.number > fm.version;
227
+ if (localChanged && remoteChanged) {
228
+ statuses.push({
229
+ _tag: "Conflict",
230
+ path: filePath,
231
+ page,
232
+ localVersion: fm.version,
233
+ remoteVersion: page.version.number
234
+ });
235
+ conflicts++;
236
+ }
237
+ else if (localChanged) {
238
+ statuses.push({ _tag: "LocalModified", path: filePath, page });
239
+ localModified++;
240
+ }
241
+ else if (remoteChanged) {
242
+ statuses.push({ _tag: "RemoteModified", path: filePath, page });
243
+ remoteModified++;
244
+ }
245
+ else {
246
+ statuses.push({ _tag: "Synced", path: filePath });
247
+ synced++;
248
+ }
249
+ }
250
+ return {
251
+ synced,
252
+ localModified,
253
+ remoteModified,
254
+ conflicts,
255
+ localOnly,
256
+ remoteOnly,
257
+ files: statuses
258
+ };
259
+ });
260
+ return SyncEngine.of({
261
+ pull,
262
+ push,
263
+ sync,
264
+ status
265
+ });
266
+ }));
267
+ //# sourceMappingURL=SyncEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncEngine.js","sourceRoot":"","sources":["../src/SyncEngine.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for confluence-to-markdown.
4
+ */
5
+ import { Command, Options, Prompt } from "@effect/cli";
6
+ import * as NodeContext from "@effect/platform-node/NodeContext";
7
+ import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
8
+ import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
9
+ import * as NodeTerminal from "@effect/platform-node/NodeTerminal";
10
+ import * as Config from "effect/Config";
11
+ import * as Console from "effect/Console";
12
+ import * as Effect from "effect/Effect";
13
+ import * as Layer from "effect/Layer";
14
+ import * as Option from "effect/Option";
15
+ import pkg from "../package.json" with { type: "json" };
16
+ import { ConfluenceClient, layer as ConfluenceClientLayer } from "./ConfluenceClient.js";
17
+ import { ConfluenceConfig, createConfigFile, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "./ConfluenceConfig.js";
18
+ import { AuthMissingError } from "./ConfluenceError.js";
19
+ import { layer as LocalFileSystemLayer } from "./LocalFileSystem.js";
20
+ import { layer as MarkdownConverterLayer } from "./MarkdownConverter.js";
21
+ import { layer as SyncEngineLayer, SyncEngine } from "./SyncEngine.js";
22
+ // === Auth config ===
23
+ const AuthConfig = Config.all({
24
+ apiKey: Config.string("CONFLUENCE_API_KEY"),
25
+ email: Config.string("CONFLUENCE_EMAIL")
26
+ });
27
+ const getAuth = () => AuthConfig.pipe(Effect.map(({ apiKey, email }) => ({ type: "token", email, token: apiKey })), Effect.mapError(() => new AuthMissingError()));
28
+ // === Init command ===
29
+ const rootPageIdOption = Options.text("root-page-id").pipe(Options.withDescription("Confluence root page ID to sync from"), Options.optional);
30
+ const baseUrlOption = Options.text("base-url").pipe(Options.withDescription("Confluence Cloud base URL (e.g., https://yoursite.atlassian.net)"), Options.optional);
31
+ const initCommand = Command.make("init", { rootPageId: rootPageIdOption, baseUrl: baseUrlOption }, ({ baseUrl, rootPageId }) => Effect.gen(function* () {
32
+ const pageId = Option.isSome(rootPageId)
33
+ ? rootPageId.value
34
+ : yield* Prompt.text({ message: "Enter Confluence root page ID:" });
35
+ const url = Option.isSome(baseUrl)
36
+ ? baseUrl.value
37
+ : yield* Prompt.text({ message: "Enter Confluence base URL (e.g., https://yoursite.atlassian.net):" });
38
+ const path = yield* createConfigFile(pageId, url);
39
+ yield* Console.log(`Created configuration file: ${path}`);
40
+ })).pipe(Command.withDescription("Initialize .confluence.json configuration"));
41
+ // === Pull command ===
42
+ const forceOption = Options.boolean("force").pipe(Options.withAlias("f"), Options.withDescription("Overwrite local changes"));
43
+ const pullCommand = Command.make("pull", { force: forceOption }, ({ force }) => Effect.gen(function* () {
44
+ const engine = yield* SyncEngine;
45
+ yield* Console.log("Pulling pages from Confluence...");
46
+ const result = yield* engine.pull({ force });
47
+ yield* Console.log(`Pulled ${result.pulled} pages`);
48
+ if (result.errors.length > 0) {
49
+ yield* Console.error("Errors:", result.errors.join("\n"));
50
+ }
51
+ })).pipe(Command.withDescription("Download pages from Confluence to local markdown"));
52
+ // === Push command ===
53
+ const dryRunOption = Options.boolean("dry-run").pipe(Options.withAlias("n"), Options.withDescription("Show changes without applying"));
54
+ const pushCommand = Command.make("push", { dryRun: dryRunOption }, ({ dryRun }) => Effect.gen(function* () {
55
+ const engine = yield* SyncEngine;
56
+ yield* Console.log(dryRun ? "Dry run - showing changes..." : "Pushing changes to Confluence...");
57
+ const result = yield* engine.push({ dryRun });
58
+ yield* Console.log(`Pushed: ${result.pushed}, Created: ${result.created}, Skipped: ${result.skipped}`);
59
+ if (result.errors.length > 0) {
60
+ yield* Console.error("Errors:", result.errors.join("\n"));
61
+ }
62
+ })).pipe(Command.withDescription("Upload local markdown changes to Confluence"));
63
+ // === Sync command ===
64
+ const syncCommand = Command.make("sync", {}, () => Effect.gen(function* () {
65
+ const engine = yield* SyncEngine;
66
+ yield* Console.log("Syncing with Confluence...");
67
+ const result = yield* engine.sync();
68
+ yield* Console.log(`Pulled: ${result.pulled}, Pushed: ${result.pushed}, Created: ${result.created}`);
69
+ if (result.conflicts > 0) {
70
+ yield* Console.warn(`Conflicts: ${result.conflicts}`);
71
+ }
72
+ if (result.errors.length > 0) {
73
+ yield* Console.error("Errors:", result.errors.join("\n"));
74
+ }
75
+ })).pipe(Command.withDescription("Bidirectional sync with conflict detection"));
76
+ // === Status command ===
77
+ const statusCommand = Command.make("status", {}, () => Effect.gen(function* () {
78
+ const engine = yield* SyncEngine;
79
+ const result = yield* engine.status();
80
+ yield* Console.log(`
81
+ Sync Status:
82
+ Synced: ${result.synced}
83
+ Local Modified: ${result.localModified}
84
+ Remote Modified: ${result.remoteModified}
85
+ Conflicts: ${result.conflicts}
86
+ Local Only: ${result.localOnly}
87
+ Remote Only: ${result.remoteOnly}
88
+ `);
89
+ if (result.files.length > 0 && result.synced < result.files.length) {
90
+ yield* Console.log("Changed files:");
91
+ for (const file of result.files) {
92
+ if (file._tag !== "Synced" && file._tag !== "RemoteOnly") {
93
+ yield* Console.log(` [${file._tag}] ${file.path}`);
94
+ }
95
+ else if (file._tag === "RemoteOnly") {
96
+ yield* Console.log(` [${file._tag}] ${file.page.title}`);
97
+ }
98
+ }
99
+ }
100
+ })).pipe(Command.withDescription("Show sync status"));
101
+ // === Main command ===
102
+ const confluence = Command.make("confluence").pipe(Command.withDescription("Sync Confluence pages to local markdown"), Command.withSubcommands([initCommand, pullCommand, pushCommand, syncCommand, statusCommand]));
103
+ // === Build app layer ===
104
+ // Dummy config layer for help/init
105
+ const DummyConfigLayer = ConfluenceConfigLayerFromValues({
106
+ rootPageId: "dummy",
107
+ baseUrl: "https://dummy.atlassian.net",
108
+ docsPath: ".docs/confluence",
109
+ excludePatterns: []
110
+ });
111
+ // Dummy client layer for help/init (will fail if actually used)
112
+ const DummyConfluenceClientLayer = Layer.succeed(ConfluenceClient, ConfluenceClient.of({
113
+ getPage: () => Effect.dieMessage("Not configured"),
114
+ getChildren: () => Effect.dieMessage("Not configured"),
115
+ getAllChildren: () => Effect.dieMessage("Not configured"),
116
+ createPage: () => Effect.dieMessage("Not configured"),
117
+ updatePage: () => Effect.dieMessage("Not configured"),
118
+ deletePage: () => Effect.dieMessage("Not configured")
119
+ }));
120
+ // Dummy sync engine that will fail if actually used
121
+ const DummySyncEngineLayer = Layer.succeed(SyncEngine, SyncEngine.of({
122
+ pull: () => Effect.dieMessage("Not configured - run 'confluence init' first"),
123
+ push: () => Effect.dieMessage("Not configured - run 'confluence init' first"),
124
+ sync: () => Effect.dieMessage("Not configured - run 'confluence init' first"),
125
+ status: () => Effect.dieMessage("Not configured - run 'confluence init' first")
126
+ }));
127
+ // Build client layer dynamically based on auth
128
+ const ConfluenceClientLive = Layer.unwrapEffect(Effect.gen(function* () {
129
+ const auth = yield* getAuth();
130
+ const config = yield* ConfluenceConfig;
131
+ const clientConfig = {
132
+ baseUrl: config.baseUrl,
133
+ auth
134
+ };
135
+ return ConfluenceClientLayer(clientConfig);
136
+ }));
137
+ // Full app layer with all services
138
+ const AppLayer = SyncEngineLayer.pipe(Layer.provideMerge(ConfluenceClientLive), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(ConfluenceConfigLayer()), Layer.provideMerge(NodeHttpClient.layer), Layer.provideMerge(NodeContext.layer));
139
+ // Minimal layer for init/help (dummy services, won't be invoked)
140
+ const MinimalLayer = DummySyncEngineLayer.pipe(Layer.provideMerge(DummyConfluenceClientLayer), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(DummyConfigLayer), Layer.provideMerge(NodeTerminal.layer), Layer.provideMerge(NodeContext.layer));
141
+ // === Run CLI ===
142
+ const cli = Command.run(confluence, {
143
+ name: pkg.name,
144
+ version: pkg.version
145
+ });
146
+ // Check if we need the full layer based on command
147
+ const needsFullLayer = () => {
148
+ const args = process.argv;
149
+ const cmd = args[2];
150
+ // init, --help, -h, --version don't need config
151
+ if (!cmd || cmd === "init" || cmd === "--help" || cmd === "-h" || cmd === "--version") {
152
+ return false;
153
+ }
154
+ return true;
155
+ };
156
+ const main = Effect.suspend(() => cli(process.argv));
157
+ if (needsFullLayer()) {
158
+ main.pipe(Effect.provide(AppLayer), Effect.tapErrorCause(Effect.logError), NodeRuntime.runMain);
159
+ }
160
+ else {
161
+ main.pipe(Effect.provide(MinimalLayer), Effect.tapErrorCause(Effect.logError), NodeRuntime.runMain);
162
+ }
163
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @knpkv/confluence-to-markdown
3
+ *
4
+ * Sync Confluence Cloud pages to local GitHub Flavored Markdown files.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export * from "./Brand.js";
9
+ export { ConfluenceClient, type ConfluenceClientConfig, type CreatePageRequest, layer as ConfluenceClientLayer, type UpdatePageRequest } from "./ConfluenceClient.js";
10
+ export { ConfluenceConfig, createConfigFile, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "./ConfluenceConfig.js";
11
+ export * from "./ConfluenceError.js";
12
+ export { layer as LocalFileSystemLayer, type LocalFile, LocalFileSystem } from "./LocalFileSystem.js";
13
+ export { layer as MarkdownConverterLayer, MarkdownConverter } from "./MarkdownConverter.js";
14
+ export * from "./Schemas.js";
15
+ export { layer as SyncEngineLayer, type PullResult, type PushResult, type StatusResult, SyncEngine, type SyncResult, type SyncStatus } from "./SyncEngine.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,IAAI,qBAAqB,EAC9B,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,IAAI,qBAAqB,EAC9B,eAAe,IAAI,+BAA+B,EACnD,MAAM,uBAAuB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,KAAK,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACrG,OAAO,EAAE,KAAK,IAAI,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,cAAc,cAAc,CAAA;AAC5B,OAAO,EACL,KAAK,IAAI,eAAe,EACxB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,UAAU,EACV,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @knpkv/confluence-to-markdown
3
+ *
4
+ * Sync Confluence Cloud pages to local GitHub Flavored Markdown files.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export * from "./Brand.js";
9
+ export { ConfluenceClient, layer as ConfluenceClientLayer } from "./ConfluenceClient.js";
10
+ export { ConfluenceConfig, createConfigFile, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "./ConfluenceConfig.js";
11
+ export * from "./ConfluenceError.js";
12
+ export { layer as LocalFileSystemLayer, LocalFileSystem } from "./LocalFileSystem.js";
13
+ export { layer as MarkdownConverterLayer, MarkdownConverter } from "./MarkdownConverter.js";
14
+ export * from "./Schemas.js";
15
+ export { layer as SyncEngineLayer, SyncEngine } from "./SyncEngine.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,gBAAgB,EAGhB,KAAK,IAAI,qBAAqB,EAE/B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,IAAI,qBAAqB,EAC9B,eAAe,IAAI,+BAA+B,EACnD,MAAM,uBAAuB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAkB,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACrG,OAAO,EAAE,KAAK,IAAI,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,cAAc,cAAc,CAAA;AAC5B,OAAO,EACL,KAAK,IAAI,eAAe,EAIxB,UAAU,EAGX,MAAM,iBAAiB,CAAA"}