confluence-exporter 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.eslintrc.cjs +18 -0
  2. package/.github/copilot-instructions.md +3 -0
  3. package/.github/prompts/analyze.prompt.md +101 -0
  4. package/.github/prompts/clarify.prompt.md +158 -0
  5. package/.github/prompts/constitution.prompt.md +73 -0
  6. package/.github/prompts/implement.prompt.md +56 -0
  7. package/.github/prompts/plan.prompt.md +50 -0
  8. package/.github/prompts/specify.prompt.md +21 -0
  9. package/.github/prompts/tasks.prompt.md +69 -0
  10. package/LICENSE +21 -0
  11. package/README.md +332 -0
  12. package/agents.md +1174 -0
  13. package/dist/api.d.ts +73 -0
  14. package/dist/api.js +387 -0
  15. package/dist/api.js.map +1 -0
  16. package/dist/commands/download.command.d.ts +18 -0
  17. package/dist/commands/download.command.js +257 -0
  18. package/dist/commands/download.command.js.map +1 -0
  19. package/dist/commands/executor.d.ts +22 -0
  20. package/dist/commands/executor.js +52 -0
  21. package/dist/commands/executor.js.map +1 -0
  22. package/dist/commands/help.command.d.ts +8 -0
  23. package/dist/commands/help.command.js +68 -0
  24. package/dist/commands/help.command.js.map +1 -0
  25. package/dist/commands/index.command.d.ts +14 -0
  26. package/dist/commands/index.command.js +95 -0
  27. package/dist/commands/index.command.js.map +1 -0
  28. package/dist/commands/index.d.ts +13 -0
  29. package/dist/commands/index.js +13 -0
  30. package/dist/commands/index.js.map +1 -0
  31. package/dist/commands/plan.command.d.ts +54 -0
  32. package/dist/commands/plan.command.js +272 -0
  33. package/dist/commands/plan.command.js.map +1 -0
  34. package/dist/commands/registry.d.ts +12 -0
  35. package/dist/commands/registry.js +32 -0
  36. package/dist/commands/registry.js.map +1 -0
  37. package/dist/commands/transform.command.d.ts +69 -0
  38. package/dist/commands/transform.command.js +951 -0
  39. package/dist/commands/transform.command.js.map +1 -0
  40. package/dist/commands/types.d.ts +12 -0
  41. package/dist/commands/types.js +5 -0
  42. package/dist/commands/types.js.map +1 -0
  43. package/dist/commands/update.command.d.ts +10 -0
  44. package/dist/commands/update.command.js +201 -0
  45. package/dist/commands/update.command.js.map +1 -0
  46. package/dist/constants.d.ts +1 -0
  47. package/dist/constants.js +2 -0
  48. package/dist/constants.js.map +1 -0
  49. package/dist/index.d.ts +5 -0
  50. package/dist/index.js +110 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/logger.d.ts +15 -0
  53. package/dist/logger.js +52 -0
  54. package/dist/logger.js.map +1 -0
  55. package/dist/types.d.ts +167 -0
  56. package/dist/types.js +5 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/utils.d.ts +56 -0
  59. package/dist/utils.js +178 -0
  60. package/dist/utils.js.map +1 -0
  61. package/eslint.config.js +29 -0
  62. package/jest.config.cjs +25 -0
  63. package/migrate-meta.js +132 -0
  64. package/package.json +53 -0
  65. package/src/api.ts +469 -0
  66. package/src/commands/download.command.ts +324 -0
  67. package/src/commands/executor.ts +62 -0
  68. package/src/commands/help.command.ts +72 -0
  69. package/src/commands/index.command.ts +111 -0
  70. package/src/commands/index.ts +14 -0
  71. package/src/commands/plan.command.ts +318 -0
  72. package/src/commands/registry.ts +39 -0
  73. package/src/commands/transform.command.ts +1103 -0
  74. package/src/commands/types.ts +16 -0
  75. package/src/commands/update.command.ts +229 -0
  76. package/src/constants.ts +0 -0
  77. package/src/index.ts +120 -0
  78. package/src/logger.ts +60 -0
  79. package/src/test.sh +66 -0
  80. package/src/types.ts +176 -0
  81. package/src/utils.ts +204 -0
  82. package/tests/commands/README.md +123 -0
  83. package/tests/commands/download.command.test.ts +8 -0
  84. package/tests/commands/help.command.test.ts +8 -0
  85. package/tests/commands/index.command.test.ts +8 -0
  86. package/tests/commands/plan.command.test.ts +15 -0
  87. package/tests/commands/transform.command.test.ts +8 -0
  88. package/tests/fixtures/_index.yaml +38 -0
  89. package/tests/fixtures/mock-pages.ts +62 -0
  90. package/tsconfig.json +25 -0
  91. package/vite.config.ts +45 -0
package/dist/api.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Minimal Confluence API client
3
+ */
4
+ import type { Page, PageMetadata, PaginatedResponse, ConfluenceConfig, User } from './types.js';
5
+ export declare class ConfluenceApi {
6
+ private baseUrl;
7
+ private authHeader;
8
+ private userCache;
9
+ private cacheFile;
10
+ private DEFAULT_TIMEOUT;
11
+ constructor(config: ConfluenceConfig);
12
+ /**
13
+ * Load user cache from filesystem
14
+ */
15
+ private loadCache;
16
+ /**
17
+ * Save user cache to filesystem
18
+ */
19
+ private saveCache;
20
+ /**
21
+ * Helper to perform fetch with a timeout using AbortController
22
+ */
23
+ private fetchWithTimeout;
24
+ /**
25
+ * Fetch a page with its content
26
+ */
27
+ getPage(pageId: string): Promise<Page>;
28
+ /**
29
+ * List all pages in a space
30
+ */
31
+ listPages(spaceKey: string, start?: number, limit?: number): Promise<PaginatedResponse<Page>>;
32
+ /**
33
+ * Search pages using CQL query (metadata only, no body content)
34
+ * Useful for finding pages modified after a specific date
35
+ */
36
+ searchPages(cql: string, pageSize?: number): Promise<PageMetadata[]>;
37
+ /**
38
+ * List pages metadata only (no body content) - more efficient for checking updates
39
+ */
40
+ listPagesMetadata(spaceKey: string, start?: number, limit?: number): Promise<PaginatedResponse<PageMetadata>>;
41
+ /**
42
+ * Fetch all pages metadata from a space (handles pagination) - no body content
43
+ */
44
+ getAllPagesMetadata(spaceKey: string, pageSize?: number): AsyncGenerator<PageMetadata & {
45
+ apiPageNumber: number;
46
+ }>;
47
+ /**
48
+ * Fetch all pages from a space (handles pagination)
49
+ */
50
+ getAllPages(spaceKey: string, pageSize?: number, startFrom?: number): AsyncGenerator<Page & {
51
+ apiPageNumber: number;
52
+ }>;
53
+ /**
54
+ * Get a page by its title in a space
55
+ */
56
+ getPageByTitle(spaceKey: string, title: string): Promise<Page | null>;
57
+ /**
58
+ * Get child pages of a parent page
59
+ */
60
+ getChildPages(pageId: string): Promise<Page[]>;
61
+ /**
62
+ * Download an attachment from a page
63
+ */
64
+ downloadAttachment(pageId: string, filename: string): Promise<Buffer | null>;
65
+ /**
66
+ * Get user information by username (with caching)
67
+ */
68
+ getUserByUsername(username: string): Promise<User | null>;
69
+ /**
70
+ * Get user information by user key (with caching)
71
+ */
72
+ getUserByKey(userKey: string): Promise<User | null>;
73
+ }
package/dist/api.js ADDED
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Minimal Confluence API client
3
+ */
4
+ import { logger } from './logger.js';
5
+ import fs from 'fs/promises';
6
+ import path from 'path';
7
+ import { readFileSync } from 'fs';
8
+ export class ConfluenceApi {
9
+ baseUrl;
10
+ authHeader;
11
+ userCache = new Map();
12
+ cacheFile;
13
+ // Default network timeout for fetch requests (ms)
14
+ DEFAULT_TIMEOUT = 15000;
15
+ constructor(config) {
16
+ this.baseUrl = config.baseUrl.replace(/\/$/, ''); // Remove trailing slash
17
+ const credentials = Buffer.from(`${config.username}:${config.password}`).toString('base64');
18
+ this.authHeader = `Basic ${credentials}`;
19
+ // Set up user cache file
20
+ this.cacheFile = path.join(config.outputDir, '_user_cache.json');
21
+ this.loadCache();
22
+ }
23
+ /**
24
+ * Load user cache from filesystem
25
+ */
26
+ loadCache() {
27
+ try {
28
+ const data = readFileSync(this.cacheFile, 'utf8');
29
+ const parsed = JSON.parse(data);
30
+ this.userCache = new Map(Object.entries(parsed));
31
+ logger.debug(`Loaded ${this.userCache.size} users from cache`);
32
+ }
33
+ catch (err) {
34
+ // Ignore if file doesn't exist or is invalid
35
+ logger.debug('No existing user cache found, starting fresh');
36
+ }
37
+ }
38
+ /**
39
+ * Save user cache to filesystem
40
+ */
41
+ async saveCache() {
42
+ try {
43
+ const obj = Object.fromEntries(this.userCache);
44
+ await fs.writeFile(this.cacheFile, JSON.stringify(obj, null, 2));
45
+ logger.debug(`Saved ${this.userCache.size} users to cache`);
46
+ }
47
+ catch (err) {
48
+ logger.warn('Failed to save user cache:', err);
49
+ }
50
+ }
51
+ /**
52
+ * Helper to perform fetch with a timeout using AbortController
53
+ */
54
+ async fetchWithTimeout(input, init, timeoutMs) {
55
+ const timeout = typeof timeoutMs === 'number' ? timeoutMs : this.DEFAULT_TIMEOUT;
56
+ const controller = new AbortController();
57
+ const id = setTimeout(() => controller.abort(), timeout);
58
+ try {
59
+ logger.debug('fetchWithTimeout ->', input, 'timeoutMs=', timeout);
60
+ const res = await fetch(input, { ...(init || {}), signal: controller.signal });
61
+ logger.debug('fetchWithTimeout <-', input, 'status=', res.status);
62
+ return res;
63
+ }
64
+ finally {
65
+ clearTimeout(id);
66
+ }
67
+ }
68
+ /**
69
+ * Fetch a page with its content
70
+ */
71
+ async getPage(pageId) {
72
+ const url = `${this.baseUrl}/rest/api/content/${pageId}?expand=body.storage,version,history.lastUpdated`;
73
+ const response = await this.fetchWithTimeout(url, {
74
+ headers: {
75
+ 'Authorization': this.authHeader,
76
+ 'Accept': 'application/json'
77
+ }
78
+ });
79
+ if (!response.ok) {
80
+ throw new Error(`Failed to fetch page ${pageId}: ${response.status} ${response.statusText}`);
81
+ }
82
+ const data = await response.json();
83
+ return {
84
+ id: data.id,
85
+ title: data.title,
86
+ body: data.body?.storage?.value || '',
87
+ version: data.version?.number,
88
+ parentId: data.ancestors?.[data.ancestors.length - 1]?.id,
89
+ modifiedDate: data.version?.when || data.history?.lastUpdated?.when
90
+ };
91
+ }
92
+ /**
93
+ * List all pages in a space
94
+ */
95
+ async listPages(spaceKey, start = 0, limit = 100) {
96
+ const url = `${this.baseUrl}/rest/api/content?spaceKey=${spaceKey}&type=page&expand=body.storage,version,history.lastUpdated,ancestors&start=${start}&limit=${limit}`;
97
+ const response = await this.fetchWithTimeout(url, {
98
+ headers: {
99
+ 'Authorization': this.authHeader,
100
+ 'Accept': 'application/json'
101
+ }
102
+ });
103
+ if (!response.ok) {
104
+ throw new Error(`Failed to list pages (${url}): ${response.status} ${response.statusText}`);
105
+ }
106
+ const data = await response.json();
107
+ return {
108
+ results: data.results.map((item) => ({
109
+ id: item.id,
110
+ title: item.title,
111
+ body: item.body?.storage?.value || '',
112
+ version: item.version?.number,
113
+ parentId: item.ancestors?.[item.ancestors.length - 1]?.id,
114
+ modifiedDate: item.version?.when || item.history?.lastUpdated?.when
115
+ })),
116
+ start: data.start,
117
+ limit: data.limit,
118
+ size: data.size,
119
+ _links: data._links
120
+ };
121
+ }
122
+ /**
123
+ * Search pages using CQL query (metadata only, no body content)
124
+ * Useful for finding pages modified after a specific date
125
+ */
126
+ async searchPages(cql, pageSize = 100) {
127
+ const results = [];
128
+ let start = 0;
129
+ while (true) {
130
+ const url = `${this.baseUrl}/rest/api/content/search?cql=${encodeURIComponent(cql)}&expand=version,history.lastUpdated,ancestors&start=${start}&limit=${pageSize}`;
131
+ logger.debug('downloadAttachment: metadata URL ->', url);
132
+ const response = await this.fetchWithTimeout(url, {
133
+ headers: {
134
+ 'Authorization': this.authHeader,
135
+ 'Accept': 'application/json'
136
+ }
137
+ });
138
+ if (!response.ok) {
139
+ throw new Error(`Failed to search pages (${url}): ${response.status} ${response.statusText}`);
140
+ }
141
+ const data = await response.json();
142
+ for (const item of data.results) {
143
+ results.push({
144
+ id: item.id,
145
+ title: item.title,
146
+ version: item.version?.number,
147
+ parentId: item.ancestors?.[item.ancestors.length - 1]?.id,
148
+ modifiedDate: item.version?.when || item.history?.lastUpdated?.when
149
+ });
150
+ }
151
+ // Check if there are more pages
152
+ if (data.results.length < pageSize || !data._links?.next) {
153
+ break;
154
+ }
155
+ start += pageSize;
156
+ }
157
+ return results;
158
+ }
159
+ /**
160
+ * List pages metadata only (no body content) - more efficient for checking updates
161
+ */
162
+ async listPagesMetadata(spaceKey, start = 0, limit = 100) {
163
+ const url = `${this.baseUrl}/rest/api/content?spaceKey=${spaceKey}&type=page&expand=version,history.lastUpdated,ancestors&start=${start}&limit=${limit}`;
164
+ const response = await this.fetchWithTimeout(url, {
165
+ headers: {
166
+ 'Authorization': this.authHeader,
167
+ 'Accept': 'application/json'
168
+ }
169
+ });
170
+ if (!response.ok) {
171
+ throw new Error(`Failed to list pages metadata (${url}): ${response.status} ${response.statusText}`);
172
+ }
173
+ const data = await response.json();
174
+ return {
175
+ results: data.results.map((item) => ({
176
+ id: item.id,
177
+ title: item.title,
178
+ version: item.version?.number,
179
+ parentId: item.ancestors?.[item.ancestors.length - 1]?.id,
180
+ modifiedDate: item.version?.when || item.history?.lastUpdated?.when
181
+ })),
182
+ start: data.start,
183
+ limit: data.limit,
184
+ size: data.size,
185
+ _links: data._links
186
+ };
187
+ }
188
+ /**
189
+ * Fetch all pages metadata from a space (handles pagination) - no body content
190
+ */
191
+ async *getAllPagesMetadata(spaceKey, pageSize = 100) {
192
+ let start = 0;
193
+ const limit = pageSize;
194
+ let apiPageNumber = 1;
195
+ while (true) {
196
+ const response = await this.listPagesMetadata(spaceKey, start, limit);
197
+ for (const page of response.results) {
198
+ yield { ...page, apiPageNumber };
199
+ }
200
+ // Check if there are more pages
201
+ if (response.results.length < limit || !response._links?.next) {
202
+ break;
203
+ }
204
+ start += limit;
205
+ apiPageNumber++;
206
+ }
207
+ }
208
+ /**
209
+ * Fetch all pages from a space (handles pagination)
210
+ */
211
+ async *getAllPages(spaceKey, pageSize = 25, startFrom = 0) {
212
+ let start = startFrom;
213
+ const limit = pageSize;
214
+ let apiPageNumber = Math.floor(startFrom / pageSize) + 1;
215
+ while (true) {
216
+ const response = await this.listPages(spaceKey, start, limit);
217
+ for (const page of response.results) {
218
+ yield { ...page, apiPageNumber };
219
+ }
220
+ // Check if there are more pages
221
+ if (response.results.length < limit || !response._links?.next) {
222
+ break;
223
+ }
224
+ start += limit;
225
+ apiPageNumber++;
226
+ }
227
+ }
228
+ /**
229
+ * Get a page by its title in a space
230
+ */
231
+ async getPageByTitle(spaceKey, title) {
232
+ const url = `${this.baseUrl}/rest/api/content?spaceKey=${spaceKey}&title=${encodeURIComponent(title)}&expand=body.storage,version`;
233
+ const response = await this.fetchWithTimeout(url, {
234
+ headers: {
235
+ 'Authorization': this.authHeader,
236
+ 'Accept': 'application/json'
237
+ }
238
+ });
239
+ if (!response.ok) {
240
+ logger.warn(`Failed to fetch page by title "${title}": ${response.status}`);
241
+ return null;
242
+ }
243
+ const data = await response.json();
244
+ if (data.results.length === 0) {
245
+ return null;
246
+ }
247
+ const page = data.results[0];
248
+ return {
249
+ id: page.id,
250
+ title: page.title,
251
+ body: page.body?.storage?.value || '',
252
+ version: page.version?.number,
253
+ };
254
+ }
255
+ /**
256
+ * Get child pages of a parent page
257
+ */
258
+ async getChildPages(pageId) {
259
+ const url = `${this.baseUrl}/rest/api/content/${pageId}/child/page?expand=version`;
260
+ const response = await fetch(url, {
261
+ headers: {
262
+ 'Authorization': this.authHeader,
263
+ 'Accept': 'application/json'
264
+ }
265
+ });
266
+ if (!response.ok) {
267
+ logger.warn(`Failed to fetch child pages for ${pageId}: ${response.status}`);
268
+ return [];
269
+ }
270
+ const data = await response.json();
271
+ return data.results.map(child => ({
272
+ id: child.id,
273
+ title: child.title,
274
+ body: '', // Don't fetch body for child page lists
275
+ version: child.version?.number,
276
+ }));
277
+ }
278
+ /**
279
+ * Download an attachment from a page
280
+ */
281
+ async downloadAttachment(pageId, filename) {
282
+ try {
283
+ // First, get the attachment metadata to get the download URL
284
+ const url = `${this.baseUrl}/rest/api/content/${pageId}/child/attachment?filename=${encodeURIComponent(filename)}`;
285
+ const response = await this.fetchWithTimeout(url, {
286
+ headers: {
287
+ 'Authorization': this.authHeader,
288
+ 'Accept': 'application/json'
289
+ }
290
+ });
291
+ if (!response.ok) {
292
+ logger.warn(`Failed to fetch attachment metadata for ${filename}: ${response.status}`);
293
+ return null;
294
+ }
295
+ const data = await response.json();
296
+ logger.debug('downloadAttachment: metadata results length ->', data.results.length);
297
+ if (data.results.length === 0) {
298
+ logger.warn(`Attachment not found: ${filename}`);
299
+ return null;
300
+ }
301
+ // Download the actual file
302
+ const downloadUrl = `${this.baseUrl}${data.results[0]._links.download}`;
303
+ logger.debug('downloadAttachment: download URL ->', downloadUrl);
304
+ const downloadResponse = await this.fetchWithTimeout(downloadUrl, {
305
+ headers: {
306
+ 'Authorization': this.authHeader
307
+ }
308
+ });
309
+ if (!downloadResponse.ok) {
310
+ logger.warn(`Failed to download attachment ${filename}: ${downloadResponse.status}`);
311
+ return null;
312
+ }
313
+ const arrayBuffer = await downloadResponse.arrayBuffer();
314
+ return Buffer.from(arrayBuffer);
315
+ }
316
+ catch (error) {
317
+ logger.warn(`Error downloading attachment ${filename}:`, error);
318
+ return null;
319
+ }
320
+ }
321
+ /**
322
+ * Get user information by username (with caching)
323
+ */
324
+ async getUserByUsername(username) {
325
+ // Check cache first
326
+ const cached = this.userCache.get(username);
327
+ if (cached) {
328
+ return cached;
329
+ }
330
+ try {
331
+ const url = `${this.baseUrl}/rest/api/user?username=${encodeURIComponent(username)}&expand=details.personal`;
332
+ const response = await this.fetchWithTimeout(url, {
333
+ headers: {
334
+ 'Authorization': this.authHeader,
335
+ 'Accept': 'application/json'
336
+ }
337
+ });
338
+ if (!response.ok) {
339
+ logger.warn(`Failed to fetch user ${username}: ${response.status}`);
340
+ return null;
341
+ }
342
+ const data = await response.json();
343
+ // Cache the result
344
+ this.userCache.set(username, data);
345
+ await this.saveCache();
346
+ return data;
347
+ }
348
+ catch (error) {
349
+ logger.warn(`Error fetching user ${username}:`, error);
350
+ return null;
351
+ }
352
+ }
353
+ /**
354
+ * Get user information by user key (with caching)
355
+ */
356
+ async getUserByKey(userKey) {
357
+ // Check cache first
358
+ const cacheKey = `key:${userKey}`;
359
+ const cached = this.userCache.get(cacheKey);
360
+ if (cached) {
361
+ return cached;
362
+ }
363
+ try {
364
+ const url = `${this.baseUrl}/rest/api/user?key=${encodeURIComponent(userKey)}&expand=details.personal`;
365
+ const response = await this.fetchWithTimeout(url, {
366
+ headers: {
367
+ 'Authorization': this.authHeader,
368
+ 'Accept': 'application/json'
369
+ }
370
+ });
371
+ if (!response.ok) {
372
+ logger.warn(`Failed to fetch user by key ${userKey}: ${response.status}`);
373
+ return null;
374
+ }
375
+ const data = await response.json();
376
+ // Cache the result
377
+ this.userCache.set(cacheKey, data);
378
+ await this.saveCache();
379
+ return data;
380
+ }
381
+ catch (error) {
382
+ logger.warn(`Error fetching user by key ${userKey}:`, error);
383
+ return null;
384
+ }
385
+ }
386
+ }
387
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Download command handler - Downloads HTML pages from _queue.yaml
3
+ */
4
+ import type { CommandHandler, CommandContext } from './types.js';
5
+ import type { ConfluenceConfig } from '../types.js';
6
+ export declare class DownloadCommand implements CommandHandler {
7
+ private config;
8
+ name: string;
9
+ description: string;
10
+ constructor(config: ConfluenceConfig);
11
+ execute(context: CommandContext): Promise<void>;
12
+ private downloadFromQueueWithHierarchy;
13
+ private downloadBatch;
14
+ private savePageToFile;
15
+ private displayPathAsTree;
16
+ private downloadPage;
17
+ private slugify;
18
+ }