@commandable/integration-data 0.0.6 → 0.1.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.
- package/dist/credentials-index.d.ts.map +1 -1
- package/dist/credentials-index.js +130 -0
- package/dist/credentials-index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +48 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +46 -4
- package/dist/loader.js.map +1 -1
- package/integrations/__tests__/liveHarness.ts +16 -3
- package/integrations/airtable/.env.test +9 -0
- package/integrations/airtable/.env.test.example +11 -0
- package/integrations/airtable/README.md +27 -0
- package/integrations/airtable/__tests__/get_handlers.test.ts +43 -5
- package/integrations/airtable/credentials.json +2 -1
- package/integrations/confluence/.env.test +25 -0
- package/integrations/confluence/.env.test.example +36 -0
- package/integrations/confluence/README.md +28 -0
- package/integrations/confluence/__tests__/get_handlers.test.ts +121 -0
- package/integrations/confluence/__tests__/usage_parity.test.ts +14 -0
- package/integrations/confluence/__tests__/write_handlers.test.ts +131 -0
- package/integrations/confluence/credentials.json +39 -0
- package/integrations/confluence/credentials_hint.md +4 -0
- package/integrations/confluence/credentials_hint_api_token.md +9 -0
- package/integrations/confluence/credentials_hint_oauth_token.md +8 -0
- package/integrations/confluence/handlers/add_comment.js +19 -0
- package/integrations/confluence/handlers/add_label.js +16 -0
- package/integrations/confluence/handlers/create_page.js +22 -0
- package/integrations/confluence/handlers/delete_page.js +17 -0
- package/integrations/confluence/handlers/get_comments.js +33 -0
- package/integrations/confluence/handlers/get_page_children.js +30 -0
- package/integrations/confluence/handlers/get_space.js +22 -0
- package/integrations/confluence/handlers/list_spaces.js +39 -0
- package/integrations/confluence/handlers/read_page.js +49 -0
- package/integrations/confluence/handlers/search_pages.js +42 -0
- package/integrations/confluence/handlers/update_page.js +42 -0
- package/integrations/confluence/manifest.json +85 -0
- package/integrations/confluence/prompt.md +55 -0
- package/integrations/confluence/schemas/add_comment.json +22 -0
- package/integrations/confluence/schemas/add_label.json +19 -0
- package/integrations/confluence/schemas/create_page.json +33 -0
- package/integrations/confluence/schemas/delete_page.json +23 -0
- package/integrations/confluence/schemas/empty.json +6 -0
- package/integrations/confluence/schemas/get_comments.json +24 -0
- package/integrations/confluence/schemas/get_page_children.json +28 -0
- package/integrations/confluence/schemas/get_space.json +18 -0
- package/integrations/confluence/schemas/list_spaces.json +36 -0
- package/integrations/confluence/schemas/read_page.json +28 -0
- package/integrations/confluence/schemas/search_pages.json +26 -0
- package/integrations/confluence/schemas/update_page.json +31 -0
- package/integrations/github/.env.test +16 -0
- package/integrations/github/.env.test.example +17 -0
- package/integrations/github/README.md +75 -0
- package/integrations/github/__tests__/get_handlers.test.ts +5 -5
- package/integrations/github/__tests__/write_handlers.test.ts +176 -58
- package/integrations/github/credentials.json +4 -2
- package/integrations/github/handlers/create_file.js +46 -0
- package/integrations/github/handlers/delete_file.js +14 -1
- package/integrations/github/handlers/edit_file.js +52 -0
- package/integrations/github/handlers/edit_files.js +107 -0
- package/integrations/github/manifest.json +74 -47
- package/integrations/github/prompt.md +36 -0
- package/integrations/github/schemas/create_file.json +13 -0
- package/integrations/github/schemas/delete_file.json +2 -2
- package/integrations/github/schemas/edit_file.json +26 -0
- package/integrations/github/schemas/edit_files.json +39 -0
- package/integrations/google-calendar/.env.test.example +11 -0
- package/integrations/google-calendar/README.md +41 -0
- package/integrations/google-calendar/__tests__/write_and_admin_handlers.test.ts +7 -7
- package/integrations/google-calendar/credentials.json +4 -2
- package/integrations/google-calendar/credentials_hint.md +1 -1
- package/integrations/google-calendar/manifest.json +27 -17
- package/integrations/google-docs/README.md +30 -0
- package/integrations/google-docs/credentials_hint.md +1 -1
- package/integrations/google-drive/README.md +26 -0
- package/integrations/google-drive/credentials.json +4 -2
- package/integrations/google-gmail/.env.test.example +11 -0
- package/integrations/google-gmail/README.md +49 -0
- package/integrations/google-gmail/credentials.json +4 -2
- package/integrations/google-gmail/handlers/create_draft_email.js +1 -1
- package/integrations/google-gmail/handlers/read_email.js +1 -1
- package/integrations/google-gmail/handlers/send_email.js +1 -1
- package/integrations/google-gmail/manifest.json +36 -25
- package/integrations/google-sheet/README.md +27 -0
- package/integrations/google-sheet/credentials_hint.md +1 -1
- package/integrations/google-slides/README.md +28 -0
- package/integrations/google-slides/credentials_hint.md +1 -1
- package/integrations/hubspot/.env.test.example +20 -0
- package/integrations/hubspot/README.md +48 -0
- package/integrations/hubspot/__tests__/get_handlers.test.ts +151 -0
- package/integrations/hubspot/__tests__/usage_parity.test.ts +10 -0
- package/integrations/hubspot/__tests__/write_handlers.test.ts +244 -0
- package/integrations/hubspot/credentials.json +50 -0
- package/integrations/hubspot/credentials_hint.md +20 -0
- package/integrations/hubspot/credentials_hint_oauth_token.md +16 -0
- package/integrations/hubspot/handlers/archive_company.js +13 -0
- package/integrations/hubspot/handlers/archive_contact.js +13 -0
- package/integrations/hubspot/handlers/archive_deal.js +13 -0
- package/integrations/hubspot/handlers/archive_ticket.js +13 -0
- package/integrations/hubspot/handlers/create_association.js +18 -0
- package/integrations/hubspot/handlers/create_company.js +13 -0
- package/integrations/hubspot/handlers/create_contact.js +14 -0
- package/integrations/hubspot/handlers/create_deal.js +16 -0
- package/integrations/hubspot/handlers/create_note.js +44 -0
- package/integrations/hubspot/handlers/create_task.js +48 -0
- package/integrations/hubspot/handlers/create_ticket.js +15 -0
- package/integrations/hubspot/handlers/get_associations.js +14 -0
- package/integrations/hubspot/handlers/get_company.js +18 -0
- package/integrations/hubspot/handlers/get_contact.js +18 -0
- package/integrations/hubspot/handlers/get_deal.js +18 -0
- package/integrations/hubspot/handlers/get_ticket.js +20 -0
- package/integrations/hubspot/handlers/list_owners.js +12 -0
- package/integrations/hubspot/handlers/list_pipelines.js +5 -0
- package/integrations/hubspot/handlers/list_properties.js +11 -0
- package/integrations/hubspot/handlers/remove_association.js +22 -0
- package/integrations/hubspot/handlers/search_companies.js +43 -0
- package/integrations/hubspot/handlers/search_contacts.js +43 -0
- package/integrations/hubspot/handlers/search_deals.js +43 -0
- package/integrations/hubspot/handlers/search_notes.js +43 -0
- package/integrations/hubspot/handlers/search_tasks.js +43 -0
- package/integrations/hubspot/handlers/search_tickets.js +43 -0
- package/integrations/hubspot/handlers/update_company.js +13 -0
- package/integrations/hubspot/handlers/update_contact.js +14 -0
- package/integrations/hubspot/handlers/update_deal.js +16 -0
- package/integrations/hubspot/handlers/update_task.js +17 -0
- package/integrations/hubspot/handlers/update_ticket.js +15 -0
- package/integrations/hubspot/manifest.json +230 -0
- package/integrations/hubspot/prompt.md +69 -0
- package/integrations/hubspot/schemas/archive_company.json +13 -0
- package/integrations/hubspot/schemas/archive_contact.json +13 -0
- package/integrations/hubspot/schemas/archive_deal.json +9 -0
- package/integrations/hubspot/schemas/archive_ticket.json +9 -0
- package/integrations/hubspot/schemas/create_association.json +24 -0
- package/integrations/hubspot/schemas/create_company.json +14 -0
- package/integrations/hubspot/schemas/create_contact.json +15 -0
- package/integrations/hubspot/schemas/create_deal.json +20 -0
- package/integrations/hubspot/schemas/create_note.json +37 -0
- package/integrations/hubspot/schemas/create_task.json +51 -0
- package/integrations/hubspot/schemas/create_ticket.json +16 -0
- package/integrations/hubspot/schemas/empty.json +6 -0
- package/integrations/hubspot/schemas/get_associations.json +30 -0
- package/integrations/hubspot/schemas/get_company.json +27 -0
- package/integrations/hubspot/schemas/get_contact.json +27 -0
- package/integrations/hubspot/schemas/get_deal.json +20 -0
- package/integrations/hubspot/schemas/get_ticket.json +20 -0
- package/integrations/hubspot/schemas/list_owners.json +25 -0
- package/integrations/hubspot/schemas/list_pipelines.json +13 -0
- package/integrations/hubspot/schemas/list_properties.json +17 -0
- package/integrations/hubspot/schemas/remove_association.json +24 -0
- package/integrations/hubspot/schemas/search_companies.json +56 -0
- package/integrations/hubspot/schemas/search_contacts.json +56 -0
- package/integrations/hubspot/schemas/search_deals.json +43 -0
- package/integrations/hubspot/schemas/search_notes.json +43 -0
- package/integrations/hubspot/schemas/search_tasks.json +43 -0
- package/integrations/hubspot/schemas/search_tickets.json +43 -0
- package/integrations/hubspot/schemas/update_company.json +20 -0
- package/integrations/hubspot/schemas/update_contact.json +21 -0
- package/integrations/hubspot/schemas/update_deal.json +19 -0
- package/integrations/hubspot/schemas/update_task.json +31 -0
- package/integrations/hubspot/schemas/update_ticket.json +18 -0
- package/integrations/jira/.env.test +46 -0
- package/integrations/jira/.env.test.example +41 -0
- package/integrations/jira/README.md +46 -0
- package/integrations/jira/__tests__/get_handlers.test.ts +193 -0
- package/integrations/jira/__tests__/usage_parity.test.ts +14 -0
- package/integrations/jira/__tests__/write_handlers.test.ts +157 -0
- package/integrations/jira/credentials.json +39 -0
- package/integrations/jira/credentials_hint.md +4 -0
- package/integrations/jira/credentials_hint_api_token.md +6 -0
- package/integrations/jira/credentials_hint_oauth_token.md +6 -0
- package/integrations/jira/handlers/add_comment.js +9 -0
- package/integrations/jira/handlers/assign_issue.js +11 -0
- package/integrations/jira/handlers/create_issue.js +37 -0
- package/integrations/jira/handlers/create_sprint.js +19 -0
- package/integrations/jira/handlers/delete_issue.js +10 -0
- package/integrations/jira/handlers/get_backlog_issues.js +13 -0
- package/integrations/jira/handlers/get_board.js +6 -0
- package/integrations/jira/handlers/get_issue.js +63 -0
- package/integrations/jira/handlers/get_issue_comments.js +31 -0
- package/integrations/jira/handlers/get_myself.js +14 -0
- package/integrations/jira/handlers/get_project.js +28 -0
- package/integrations/jira/handlers/get_sprint.js +5 -0
- package/integrations/jira/handlers/get_sprint_issues.js +13 -0
- package/integrations/jira/handlers/get_transitions.js +23 -0
- package/integrations/jira/handlers/list_boards.js +34 -0
- package/integrations/jira/handlers/list_projects.js +29 -0
- package/integrations/jira/handlers/list_sprints.js +29 -0
- package/integrations/jira/handlers/move_issues_to_sprint.js +11 -0
- package/integrations/jira/handlers/search_issues.js +43 -0
- package/integrations/jira/handlers/search_users.js +21 -0
- package/integrations/jira/handlers/transition_issue.js +44 -0
- package/integrations/jira/handlers/update_issue.js +40 -0
- package/integrations/jira/handlers/update_sprint.js +20 -0
- package/integrations/jira/manifest.json +204 -0
- package/integrations/jira/prompt.md +80 -0
- package/integrations/jira/schemas/add_comment.json +16 -0
- package/integrations/jira/schemas/assign_issue.json +16 -0
- package/integrations/jira/schemas/create_issue.json +49 -0
- package/integrations/jira/schemas/create_sprint.json +29 -0
- package/integrations/jira/schemas/delete_issue.json +12 -0
- package/integrations/jira/schemas/empty.json +6 -0
- package/integrations/jira/schemas/get_backlog_issues.json +33 -0
- package/integrations/jira/schemas/get_board.json +13 -0
- package/integrations/jira/schemas/get_issue.json +23 -0
- package/integrations/jira/schemas/get_issue_comments.json +23 -0
- package/integrations/jira/schemas/get_project.json +17 -0
- package/integrations/jira/schemas/get_sprint.json +13 -0
- package/integrations/jira/schemas/get_sprint_issues.json +33 -0
- package/integrations/jira/schemas/get_transitions.json +12 -0
- package/integrations/jira/schemas/list_boards.json +27 -0
- package/integrations/jira/schemas/list_projects.json +22 -0
- package/integrations/jira/schemas/list_sprints.json +29 -0
- package/integrations/jira/schemas/move_issues_to_sprint.json +19 -0
- package/integrations/jira/schemas/search_issues.json +28 -0
- package/integrations/jira/schemas/search_users.json +18 -0
- package/integrations/jira/schemas/transition_issue.json +38 -0
- package/integrations/jira/schemas/update_issue.json +47 -0
- package/integrations/jira/schemas/update_sprint.json +33 -0
- package/integrations/new_integration_prompt.md +173 -2
- package/integrations/notion/.env.test +10 -0
- package/integrations/notion/.env.test.example +13 -0
- package/integrations/notion/README.md +42 -0
- package/integrations/notion/credentials.json +2 -1
- package/integrations/notion/manifest.json +64 -35
- package/integrations/trello/.env.test +6 -0
- package/integrations/trello/.env.test.example +9 -0
- package/integrations/trello/README.md +50 -0
- package/integrations/trello/credentials.json +2 -1
- package/package.json +7 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const pageId = encodeURIComponent(String(input.pageId))
|
|
3
|
+
const params = new URLSearchParams()
|
|
4
|
+
|
|
5
|
+
const limit = typeof input.limit === 'number' ? input.limit : undefined
|
|
6
|
+
if (limit) params.set('limit', String(limit))
|
|
7
|
+
if (input.cursor) params.set('cursor', String(input.cursor))
|
|
8
|
+
if (typeof input.sort === 'string' && input.sort) params.set('sort', input.sort)
|
|
9
|
+
|
|
10
|
+
const res = await integration.fetch(`/wiki/api/v2/pages/${pageId}/children${params.toString() ? `?${params}` : ''}`)
|
|
11
|
+
const data = await res.json()
|
|
12
|
+
|
|
13
|
+
const results = Array.isArray(data?.results)
|
|
14
|
+
? data.results.map((c) => ({
|
|
15
|
+
id: c.id,
|
|
16
|
+
type: c.type,
|
|
17
|
+
status: c.status,
|
|
18
|
+
title: c.title,
|
|
19
|
+
parentId: c.parentId,
|
|
20
|
+
spaceId: c.spaceId,
|
|
21
|
+
links: c?._links || {},
|
|
22
|
+
}))
|
|
23
|
+
: []
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
results,
|
|
27
|
+
links: data?._links || {},
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const spaceId = encodeURIComponent(String(input.spaceId))
|
|
3
|
+
const params = new URLSearchParams()
|
|
4
|
+
if (input.includePermissions) params.set('include-permissions', 'true')
|
|
5
|
+
|
|
6
|
+
const path = `/wiki/api/v2/spaces/${spaceId}${params.toString() ? `?${params}` : ''}`
|
|
7
|
+
const res = await integration.fetch(path)
|
|
8
|
+
const data = await res.json()
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
id: data?.id,
|
|
12
|
+
key: data?.key,
|
|
13
|
+
name: data?.name,
|
|
14
|
+
type: data?.type,
|
|
15
|
+
status: data?.status,
|
|
16
|
+
homepageId: data?.homepageId,
|
|
17
|
+
description: data?.description,
|
|
18
|
+
links: data?._links || {},
|
|
19
|
+
raw: data,
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const params = new URLSearchParams()
|
|
3
|
+
|
|
4
|
+
if (Array.isArray(input.ids))
|
|
5
|
+
for (const id of input.ids) params.append('ids', String(id))
|
|
6
|
+
if (Array.isArray(input.keys))
|
|
7
|
+
for (const key of input.keys) params.append('keys', String(key))
|
|
8
|
+
if (typeof input.type === 'string' && input.type)
|
|
9
|
+
params.set('type', input.type)
|
|
10
|
+
if (typeof input.status === 'string' && input.status)
|
|
11
|
+
params.set('status', input.status)
|
|
12
|
+
|
|
13
|
+
const limit = typeof input.limit === 'number' ? input.limit : undefined
|
|
14
|
+
if (limit) params.set('limit', String(limit))
|
|
15
|
+
|
|
16
|
+
if (input.cursor) params.set('cursor', String(input.cursor))
|
|
17
|
+
|
|
18
|
+
const path = `/wiki/api/v2/spaces${params.toString() ? `?${params}` : ''}`
|
|
19
|
+
const res = await integration.fetch(path)
|
|
20
|
+
const data = await res.json()
|
|
21
|
+
|
|
22
|
+
const results = Array.isArray(data?.results)
|
|
23
|
+
? data.results.map((s) => ({
|
|
24
|
+
id: s.id,
|
|
25
|
+
key: s.key,
|
|
26
|
+
name: s.name,
|
|
27
|
+
type: s.type,
|
|
28
|
+
status: s.status,
|
|
29
|
+
homepageId: s.homepageId,
|
|
30
|
+
webui: s?._links?.webui,
|
|
31
|
+
}))
|
|
32
|
+
: []
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
results,
|
|
36
|
+
links: data?._links || {},
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const buildWebUrl = (links) => {
|
|
3
|
+
const base = links?.base
|
|
4
|
+
const webui = links?.webui
|
|
5
|
+
if (!webui) return null
|
|
6
|
+
if (/^https?:\/\//.test(webui)) return webui
|
|
7
|
+
if (base && /^https?:\/\//.test(base)) {
|
|
8
|
+
try { return new URL(webui, base).toString() } catch {}
|
|
9
|
+
}
|
|
10
|
+
return webui
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const pageId = encodeURIComponent(String(input.pageId))
|
|
14
|
+
|
|
15
|
+
const params = new URLSearchParams()
|
|
16
|
+
params.set('body-format', 'storage')
|
|
17
|
+
if (input.includeLabels) params.set('include-labels', 'true')
|
|
18
|
+
if (input.includeProperties) params.set('include-properties', 'true')
|
|
19
|
+
|
|
20
|
+
const res = await integration.fetch(`/wiki/api/v2/pages/${pageId}?${params}`)
|
|
21
|
+
const data = await res.json()
|
|
22
|
+
|
|
23
|
+
const storage = data?.body?.storage
|
|
24
|
+
const storageValue = typeof storage === 'string'
|
|
25
|
+
? storage
|
|
26
|
+
: (typeof storage?.value === 'string' ? storage.value : '')
|
|
27
|
+
|
|
28
|
+
const meta = {
|
|
29
|
+
id: data?.id,
|
|
30
|
+
title: data?.title,
|
|
31
|
+
spaceId: data?.spaceId,
|
|
32
|
+
parentId: data?.parentId,
|
|
33
|
+
status: data?.status,
|
|
34
|
+
version: data?.version?.number,
|
|
35
|
+
createdAt: data?.createdAt,
|
|
36
|
+
webUrl: buildWebUrl(data?._links),
|
|
37
|
+
labels: data?.labels?.results,
|
|
38
|
+
links: data?._links || {},
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (input.outputMarkdown) {
|
|
42
|
+
const md = storageValue ? (utils.html?.toMarkdown(storageValue) || '') : ''
|
|
43
|
+
const note = '\n\n---\n_System note: this is a Markdown representation of the page. If you intend to edit it, re-fetch without `outputMarkdown` to get the storage XHTML and avoid accidentally deleting macros or hidden content._'
|
|
44
|
+
return { ...meta, contentMarkdown: md ? md + note : null }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return { ...meta, contentStorage: storageValue || null }
|
|
48
|
+
}
|
|
49
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const limit = typeof input.limit === 'number' ? input.limit : 10
|
|
3
|
+
const start = typeof input.start === 'number' ? input.start : 0
|
|
4
|
+
|
|
5
|
+
const params = new URLSearchParams()
|
|
6
|
+
params.set('cql', String(input.cql))
|
|
7
|
+
params.set('limit', String(limit))
|
|
8
|
+
params.set('start', String(start))
|
|
9
|
+
params.set('expand', 'content.space,content.version')
|
|
10
|
+
|
|
11
|
+
const res = await integration.fetch(`/wiki/rest/api/search?${params}`)
|
|
12
|
+
const data = await res.json()
|
|
13
|
+
|
|
14
|
+
const results = Array.isArray(data?.results)
|
|
15
|
+
? data.results
|
|
16
|
+
.map((r) => {
|
|
17
|
+
const c = r?.content || {}
|
|
18
|
+
return {
|
|
19
|
+
id: c.id,
|
|
20
|
+
type: c.type,
|
|
21
|
+
title: c.title,
|
|
22
|
+
spaceKey: c?.space?.key,
|
|
23
|
+
version: c?.version?.number,
|
|
24
|
+
lastModified: c?.version?.when,
|
|
25
|
+
excerpt: r?.excerpt,
|
|
26
|
+
webui: c?._links?.webui,
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
.filter((x) => x.id)
|
|
30
|
+
: []
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
cql: input.cql,
|
|
34
|
+
start: data?.start ?? start,
|
|
35
|
+
limit: data?.limit ?? limit,
|
|
36
|
+
size: data?.size ?? results.length,
|
|
37
|
+
totalSize: data?.totalSize,
|
|
38
|
+
results,
|
|
39
|
+
links: data?._links || {},
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const pageId = encodeURIComponent(String(input.pageId))
|
|
3
|
+
|
|
4
|
+
// Fetch current page to get current version and preserve defaults.
|
|
5
|
+
const currentRes = await integration.fetch(`/wiki/api/v2/pages/${pageId}`)
|
|
6
|
+
const current = await currentRes.json()
|
|
7
|
+
|
|
8
|
+
const currentVersion = Number(current?.version?.number || 0)
|
|
9
|
+
if (!currentVersion)
|
|
10
|
+
throw new Error('Unable to determine current Confluence page version.')
|
|
11
|
+
|
|
12
|
+
const nextVersion = currentVersion + 1
|
|
13
|
+
const title = input.title ? String(input.title) : String(current?.title || '')
|
|
14
|
+
if (!title)
|
|
15
|
+
throw new Error('Missing page title (current page has no title and no new title was provided).')
|
|
16
|
+
|
|
17
|
+
const body = {
|
|
18
|
+
id: String(current?.id || input.pageId),
|
|
19
|
+
status: String(current?.status || 'current'),
|
|
20
|
+
title,
|
|
21
|
+
body: {
|
|
22
|
+
representation: 'storage',
|
|
23
|
+
value: String(input.bodyStorage),
|
|
24
|
+
},
|
|
25
|
+
version: {
|
|
26
|
+
number: nextVersion,
|
|
27
|
+
message: input.versionMessage ? String(input.versionMessage) : undefined,
|
|
28
|
+
minorEdit: Boolean(input.minorEdit),
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Remove undefined version message to keep payload clean.
|
|
33
|
+
if (body.version.message === undefined)
|
|
34
|
+
delete body.version.message
|
|
35
|
+
|
|
36
|
+
const res = await integration.fetch(`/wiki/api/v2/pages/${pageId}`, {
|
|
37
|
+
method: 'PUT',
|
|
38
|
+
body,
|
|
39
|
+
})
|
|
40
|
+
return await res.json()
|
|
41
|
+
}
|
|
42
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "confluence",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"utils": ["html"],
|
|
5
|
+
"tools": [
|
|
6
|
+
{
|
|
7
|
+
"name": "list_spaces",
|
|
8
|
+
"description": "List Confluence spaces you can access. Use this to discover `spaceId`/`spaceKey` before searching or creating pages. Pagination uses `cursor` from the previous response.",
|
|
9
|
+
"inputSchema": "schemas/list_spaces.json",
|
|
10
|
+
"handler": "handlers/list_spaces.js",
|
|
11
|
+
"scope": "read"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "get_space",
|
|
15
|
+
"description": "Get a Confluence space by `spaceId`, including its homepage and basic metadata.",
|
|
16
|
+
"inputSchema": "schemas/get_space.json",
|
|
17
|
+
"handler": "handlers/get_space.js",
|
|
18
|
+
"scope": "read"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "search_pages",
|
|
22
|
+
"description": "Search for pages using CQL (Confluence Query Language). Use this as the primary discovery tool to find page IDs. Example CQL: `space = \"ENG\" AND type = page AND text ~ \"onboarding\" ORDER BY lastmodified DESC`.",
|
|
23
|
+
"inputSchema": "schemas/search_pages.json",
|
|
24
|
+
"handler": "handlers/search_pages.js",
|
|
25
|
+
"scope": "read"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "read_page",
|
|
29
|
+
"description": "Read a page and return its content in Confluence storage format (XHTML). Set `outputMarkdown: true` to get Markdown instead — useful for quick reading or summarisation but lossy, do not use it if you plan to edit the page.",
|
|
30
|
+
"inputSchema": "schemas/read_page.json",
|
|
31
|
+
"handler": "handlers/read_page.js",
|
|
32
|
+
"scope": "read"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "get_page_children",
|
|
36
|
+
"description": "List child content under a page (typically child pages). Use this to navigate page hierarchies and build a table-of-contents workflow.",
|
|
37
|
+
"inputSchema": "schemas/get_page_children.json",
|
|
38
|
+
"handler": "handlers/get_page_children.js",
|
|
39
|
+
"scope": "read"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "get_comments",
|
|
43
|
+
"description": "List footer comments for a page, optionally including their child replies. Use this to review discussion threads on a page.",
|
|
44
|
+
"inputSchema": "schemas/get_comments.json",
|
|
45
|
+
"handler": "handlers/get_comments.js",
|
|
46
|
+
"scope": "read"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "create_page",
|
|
50
|
+
"description": "Create a new Confluence page. Provide the body as Confluence storage format (XHTML). For simple pages you can use basic HTML like `<h1>`, `<p>`, `<ul>`, `<li>`, `<code>`, and links.",
|
|
51
|
+
"inputSchema": "schemas/create_page.json",
|
|
52
|
+
"handler": "handlers/create_page.js",
|
|
53
|
+
"scope": "write"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "update_page",
|
|
57
|
+
"description": "Update an existing Confluence page. This tool auto-fetches the current version number and increments it, so you don't need to manage versioning. Provide the body as Confluence storage format (XHTML).",
|
|
58
|
+
"inputSchema": "schemas/update_page.json",
|
|
59
|
+
"handler": "handlers/update_page.js",
|
|
60
|
+
"scope": "write"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "delete_page",
|
|
64
|
+
"description": "Delete a Confluence page (moves it to trash by default). Use carefully.",
|
|
65
|
+
"inputSchema": "schemas/delete_page.json",
|
|
66
|
+
"handler": "handlers/delete_page.js",
|
|
67
|
+
"scope": "write"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "add_comment",
|
|
71
|
+
"description": "Add a footer comment to a Confluence page. Provide the body as Confluence storage format (XHTML). Optionally set `parentCommentId` to create a threaded reply.",
|
|
72
|
+
"inputSchema": "schemas/add_comment.json",
|
|
73
|
+
"handler": "handlers/add_comment.js",
|
|
74
|
+
"scope": "write"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "add_label",
|
|
78
|
+
"description": "Add one or more labels to a Confluence page. Labels are useful for discovery via CQL (`label = \"...\"`).",
|
|
79
|
+
"inputSchema": "schemas/add_label.json",
|
|
80
|
+
"handler": "handlers/add_label.js",
|
|
81
|
+
"scope": "write"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Confluence usage guide
|
|
2
|
+
|
|
3
|
+
## Recommended workflow
|
|
4
|
+
|
|
5
|
+
1. Use `list_spaces` (or `search_pages`) to discover where content lives.
|
|
6
|
+
2. Use `search_pages` with CQL to find the right page ID(s).
|
|
7
|
+
3. Use `read_page` to get the page content as Confluence storage format (XHTML).
|
|
8
|
+
4. For edits, use `update_page` with storage XHTML in `bodyStorage` (it automatically handles version increments).
|
|
9
|
+
|
|
10
|
+
## Content format
|
|
11
|
+
|
|
12
|
+
All content is exchanged in **Confluence storage format (XHTML)**. This applies to both reads (`contentStorage` field in `read_page`) and writes (`bodyStorage` field in `create_page`, `update_page`, `add_comment`).
|
|
13
|
+
|
|
14
|
+
Common markup:
|
|
15
|
+
|
|
16
|
+
- Headings: `<h1>Title</h1>`, `<h2>Section</h2>`
|
|
17
|
+
- Paragraphs: `<p>Text</p>`
|
|
18
|
+
- Lists: `<ul><li>Item</li></ul>`, `<ol><li>Item</li></ol>`
|
|
19
|
+
- Inline code: `<code>const x = 1</code>`
|
|
20
|
+
- Code blocks: `<pre><code>...</code></pre>`
|
|
21
|
+
- Links: `<a href="https://example.com">Example</a>`
|
|
22
|
+
- Tables: `<table><tr><th>A</th></tr><tr><td>1</td></tr></table>`
|
|
23
|
+
- Macros: `<ac:structured-macro ac:name="info"><ac:rich-text-body><p>Note</p></ac:rich-text-body></ac:structured-macro>`
|
|
24
|
+
|
|
25
|
+
Using XHTML natively means round-tripping pages preserves all formatting, macros, and Confluence-specific markup.
|
|
26
|
+
|
|
27
|
+
`read_page` accepts `outputMarkdown: true` to return content as Markdown instead of XHTML.
|
|
28
|
+
|
|
29
|
+
## CQL (Confluence Query Language) quick reference
|
|
30
|
+
|
|
31
|
+
Common patterns for `search_pages.cql`:
|
|
32
|
+
|
|
33
|
+
- Restrict to a space:
|
|
34
|
+
- `space = "ENG" AND type = page`
|
|
35
|
+
- Title match:
|
|
36
|
+
- `title ~ "runbook" AND type = page`
|
|
37
|
+
- Full-text match:
|
|
38
|
+
- `text ~ "oncall" AND type = page`
|
|
39
|
+
- Label match:
|
|
40
|
+
- `label = "runbook" AND type = page`
|
|
41
|
+
- Combine filters:
|
|
42
|
+
- `space = "ENG" AND type = page AND (title ~ "onboarding" OR text ~ "onboarding")`
|
|
43
|
+
- Sort:
|
|
44
|
+
- `... ORDER BY lastmodified DESC`
|
|
45
|
+
|
|
46
|
+
Tips:
|
|
47
|
+
- Prefer small `limit` (e.g. 10) and paginate with `start`.
|
|
48
|
+
- Use labels as a stable way to group pages for later discovery.
|
|
49
|
+
|
|
50
|
+
## Page hierarchy
|
|
51
|
+
|
|
52
|
+
- Spaces contain pages.
|
|
53
|
+
- Pages can be nested under a parent page (`parentId`).
|
|
54
|
+
- Use `get_page_children` to traverse a documentation tree (e.g. a handbook or runbook index).
|
|
55
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"pageId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Page ID",
|
|
7
|
+
"description": "The Confluence page ID to comment on."
|
|
8
|
+
},
|
|
9
|
+
"bodyStorage": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"title": "Comment body (storage XHTML)",
|
|
12
|
+
"description": "Confluence storage format (XHTML) comment body."
|
|
13
|
+
},
|
|
14
|
+
"parentCommentId": {
|
|
15
|
+
"type": ["string", "null"],
|
|
16
|
+
"description": "Optional parent footer comment ID to create a threaded reply."
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"required": ["pageId", "bodyStorage"],
|
|
20
|
+
"additionalProperties": false
|
|
21
|
+
}
|
|
22
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"pageId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Page ID",
|
|
7
|
+
"description": "The Confluence page ID."
|
|
8
|
+
},
|
|
9
|
+
"labels": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"minItems": 1,
|
|
12
|
+
"items": { "type": "string" },
|
|
13
|
+
"description": "Labels to add (without the `global:` prefix). Example: `design-doc`, `runbook`."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"required": ["pageId", "labels"],
|
|
17
|
+
"additionalProperties": false
|
|
18
|
+
}
|
|
19
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"spaceId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Space ID",
|
|
7
|
+
"description": "The space ID where the page will be created."
|
|
8
|
+
},
|
|
9
|
+
"title": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"title": "Title",
|
|
12
|
+
"description": "Page title."
|
|
13
|
+
},
|
|
14
|
+
"bodyStorage": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"title": "Body (storage XHTML)",
|
|
17
|
+
"description": "Confluence storage format (XHTML) body value."
|
|
18
|
+
},
|
|
19
|
+
"parentId": {
|
|
20
|
+
"type": ["string", "null"],
|
|
21
|
+
"description": "Optional parent page ID to create this page under."
|
|
22
|
+
},
|
|
23
|
+
"status": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"enum": ["current", "draft"],
|
|
26
|
+
"default": "current",
|
|
27
|
+
"description": "Create as published (current) or as a draft."
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"required": ["spaceId", "title", "bodyStorage"],
|
|
31
|
+
"additionalProperties": false
|
|
32
|
+
}
|
|
33
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"pageId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Page ID",
|
|
7
|
+
"description": "The Confluence page ID."
|
|
8
|
+
},
|
|
9
|
+
"purge": {
|
|
10
|
+
"type": "boolean",
|
|
11
|
+
"default": false,
|
|
12
|
+
"description": "If true, permanently purge the page (only works for trashed pages with admin permission)."
|
|
13
|
+
},
|
|
14
|
+
"draft": {
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"default": false,
|
|
17
|
+
"description": "If true, delete a draft page."
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"required": ["pageId"],
|
|
21
|
+
"additionalProperties": false
|
|
22
|
+
}
|
|
23
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"pageId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Page ID",
|
|
7
|
+
"description": "The Confluence page ID."
|
|
8
|
+
},
|
|
9
|
+
"limit": {
|
|
10
|
+
"type": "integer",
|
|
11
|
+
"minimum": 1,
|
|
12
|
+
"maximum": 250,
|
|
13
|
+
"default": 50,
|
|
14
|
+
"description": "Maximum number of comments to return."
|
|
15
|
+
},
|
|
16
|
+
"cursor": {
|
|
17
|
+
"type": ["string", "null"],
|
|
18
|
+
"description": "Pagination cursor from a previous response."
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"required": ["pageId"],
|
|
22
|
+
"additionalProperties": false
|
|
23
|
+
}
|
|
24
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"pageId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Page ID",
|
|
7
|
+
"description": "The Confluence page ID."
|
|
8
|
+
},
|
|
9
|
+
"limit": {
|
|
10
|
+
"type": "integer",
|
|
11
|
+
"minimum": 1,
|
|
12
|
+
"maximum": 250,
|
|
13
|
+
"default": 50,
|
|
14
|
+
"description": "Maximum number of children to return."
|
|
15
|
+
},
|
|
16
|
+
"cursor": {
|
|
17
|
+
"type": ["string", "null"],
|
|
18
|
+
"description": "Pagination cursor from a previous response."
|
|
19
|
+
},
|
|
20
|
+
"sort": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Optional sort key (API-specific)."
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"required": ["pageId"],
|
|
26
|
+
"additionalProperties": false
|
|
27
|
+
}
|
|
28
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"spaceId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Space ID",
|
|
7
|
+
"description": "The Confluence space ID."
|
|
8
|
+
},
|
|
9
|
+
"includePermissions": {
|
|
10
|
+
"type": "boolean",
|
|
11
|
+
"default": false,
|
|
12
|
+
"description": "If true, include permissions in the response (may be verbose)."
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"required": ["spaceId"],
|
|
16
|
+
"additionalProperties": false
|
|
17
|
+
}
|
|
18
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"ids": {
|
|
5
|
+
"type": "array",
|
|
6
|
+
"items": { "type": "string" },
|
|
7
|
+
"description": "Optional list of space IDs to filter by."
|
|
8
|
+
},
|
|
9
|
+
"keys": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"items": { "type": "string" },
|
|
12
|
+
"description": "Optional list of space keys to filter by."
|
|
13
|
+
},
|
|
14
|
+
"type": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Optional space type filter (e.g. global, personal)."
|
|
17
|
+
},
|
|
18
|
+
"status": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Optional space status filter (e.g. current, archived)."
|
|
21
|
+
},
|
|
22
|
+
"limit": {
|
|
23
|
+
"type": "integer",
|
|
24
|
+
"minimum": 1,
|
|
25
|
+
"maximum": 250,
|
|
26
|
+
"default": 50,
|
|
27
|
+
"description": "Maximum number of spaces to return."
|
|
28
|
+
},
|
|
29
|
+
"cursor": {
|
|
30
|
+
"type": ["string", "null"],
|
|
31
|
+
"description": "Pagination cursor from a previous response."
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"additionalProperties": false
|
|
35
|
+
}
|
|
36
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"pageId": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "Page ID",
|
|
7
|
+
"description": "The Confluence page ID."
|
|
8
|
+
},
|
|
9
|
+
"includeLabels": {
|
|
10
|
+
"type": "boolean",
|
|
11
|
+
"default": true,
|
|
12
|
+
"description": "Include labels in the response."
|
|
13
|
+
},
|
|
14
|
+
"includeProperties": {
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"default": false,
|
|
17
|
+
"description": "Include content properties (may be verbose)."
|
|
18
|
+
},
|
|
19
|
+
"outputMarkdown": {
|
|
20
|
+
"type": "boolean",
|
|
21
|
+
"default": false,
|
|
22
|
+
"description": "Return content as Markdown instead of Confluence storage XHTML. Useful for quick reading or summarisation. Lossy — macros and rich formatting are stripped. Do not use this format if you intend to edit the page."
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"required": ["pageId"],
|
|
26
|
+
"additionalProperties": false
|
|
27
|
+
}
|
|
28
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"properties": {
|
|
4
|
+
"cql": {
|
|
5
|
+
"type": "string",
|
|
6
|
+
"title": "CQL",
|
|
7
|
+
"description": "Confluence Query Language string. Example: `space = \"ENG\" AND type = page AND text ~ \"onboarding\" ORDER BY lastmodified DESC`."
|
|
8
|
+
},
|
|
9
|
+
"limit": {
|
|
10
|
+
"type": "integer",
|
|
11
|
+
"minimum": 1,
|
|
12
|
+
"maximum": 50,
|
|
13
|
+
"default": 10,
|
|
14
|
+
"description": "Maximum results to return."
|
|
15
|
+
},
|
|
16
|
+
"start": {
|
|
17
|
+
"type": "integer",
|
|
18
|
+
"minimum": 0,
|
|
19
|
+
"default": 0,
|
|
20
|
+
"description": "Offset into results for pagination (v1 search)."
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"required": ["cql"],
|
|
24
|
+
"additionalProperties": false
|
|
25
|
+
}
|
|
26
|
+
|