skilldrop-cli 0.16.34 → 0.16.36

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 (212) hide show
  1. package/README.md +1 -0
  2. package/agents/README.md +4 -1
  3. package/agents/docs-reviewer.md +47 -0
  4. package/agents/finding-adjudicator.md +49 -0
  5. package/agents/test-reviewer.md +52 -0
  6. package/catalogue.json +17 -7
  7. package/model-routing.json +40 -0
  8. package/package.json +1 -1
  9. package/packs/ai-engineering/skills/agent-config-review/SKILL.md +116 -0
  10. package/packs/ai-engineering/skills/agent-config-review/evals/eval_queries.json +12 -0
  11. package/packs/ai-engineering/skills/agent-config-review/evals/evals.json +75 -0
  12. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/db-migrator.md +8 -0
  13. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/reviewer.md +9 -0
  14. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.json +48 -0
  15. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.local.json +5 -0
  16. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.mcp.json +22 -0
  17. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/package.json +12 -0
  18. package/packs/ai-engineering/skills/agent-config-review/evals/files/2/.cursor/mcp.json +17 -0
  19. package/packs/ai-engineering/skills/agent-config-review/evals/files/2/config.toml +21 -0
  20. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/my-user-settings.json +11 -0
  21. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/agents/release-notes.md +13 -0
  22. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/settings.json +39 -0
  23. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.mcp.json +18 -0
  24. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/package.json +14 -0
  25. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/.github/workflows/codex-triage.yml +29 -0
  26. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/AGENTS.md +16 -0
  27. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/codex/config.toml +34 -0
  28. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.claude/settings.json +22 -0
  29. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.mcp.json +9 -0
  30. package/packs/ai-engineering/skills/agent-config-review/examples/python-repo-tighten.md +81 -0
  31. package/packs/ai-engineering/skills/agent-config-review/manifest.json +60 -0
  32. package/packs/ai-engineering/skills/agent-config-review/reference.md +205 -0
  33. package/packs/ai-engineering/skills/agent-config-review/scripts/agent_config_scan.py +989 -0
  34. package/packs/ai-engineering/skills/agent-incident-response/SKILL.md +175 -0
  35. package/packs/ai-engineering/skills/agent-incident-response/evals/eval_queries.json +14 -0
  36. package/packs/ai-engineering/skills/agent-incident-response/evals/evals.json +107 -0
  37. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/agent-session-excerpt.txt +11 -0
  38. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/ci-build-log.txt +24 -0
  39. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/incident-notes.md +19 -0
  40. package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/mcp-config.json +20 -0
  41. package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/session-transcript.txt +8 -0
  42. package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/agent-session.log +70 -0
  43. package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/infra/staging-db.tf +25 -0
  44. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/job.yaml +19 -0
  45. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/run.log +13 -0
  46. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/usage-export-2026-10-20.csv +13 -0
  47. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/.mcp.json +20 -0
  48. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/git-log.txt +12 -0
  49. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync-excerpt.txt +30 -0
  50. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync.log +15 -0
  51. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/ssh-config.txt +16 -0
  52. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/.github/workflows/ci.yml +28 -0
  53. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/SECURITY.md +8 -0
  54. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/issue-479.md +35 -0
  55. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/package.json +15 -0
  56. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/pr-482.diff +20 -0
  57. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/run-log.txt +30 -0
  58. package/packs/ai-engineering/skills/agent-incident-response/examples/injected-issue-comment.md +57 -0
  59. package/packs/ai-engineering/skills/agent-incident-response/manifest.json +55 -0
  60. package/packs/ai-engineering/skills/agent-incident-response/reference.md +152 -0
  61. package/packs/ai-engineering/skills/agent-incident-response/scripts/find_secret_exposure.py +239 -0
  62. package/packs/ai-engineering/skills/agent-incident-response/scripts/usage_split.py +194 -0
  63. package/packs/converters/skills/file-to-markdown/SKILL.md +3 -2
  64. package/packs/converters/skills/file-to-markdown/evals/eval_queries.json +4 -0
  65. package/packs/converters/skills/file-to-markdown/manifest.json +2 -2
  66. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +340 -7
  67. package/packs/converters/skills/md-to-confluence/SKILL.md +139 -0
  68. package/packs/converters/skills/md-to-confluence/evals/eval_queries.json +42 -0
  69. package/packs/converters/skills/md-to-confluence/evals/evals.json +89 -0
  70. package/packs/converters/skills/md-to-confluence/evals/files/1/img/latency-dashboard.png +0 -0
  71. package/packs/converters/skills/md-to-confluence/evals/files/1/payments-runbook.md +60 -0
  72. package/packs/converters/skills/md-to-confluence/evals/files/2/deploy-checklist.md +33 -0
  73. package/packs/converters/skills/md-to-confluence/evals/files/3/img/after/screen.png +0 -0
  74. package/packs/converters/skills/md-to-confluence/evals/files/3/img/before/screen.png +0 -0
  75. package/packs/converters/skills/md-to-confluence/evals/files/3/release-notes-4.2.md +49 -0
  76. package/packs/converters/skills/md-to-confluence/evals/files/4/docs/img/topology.png +0 -0
  77. package/packs/converters/skills/md-to-confluence/evals/files/4/docs/ingest-pipeline-design.md +65 -0
  78. package/packs/converters/skills/md-to-confluence/evals/files/5/support/troubleshooting-sso.md +57 -0
  79. package/packs/converters/skills/md-to-confluence/examples/inputs/img/queue-depth.png +0 -0
  80. package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.fixed.md +21 -0
  81. package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.md +21 -0
  82. package/packs/converters/skills/md-to-confluence/examples/queue-runbook.md +57 -0
  83. package/packs/converters/skills/md-to-confluence/manifest.json +52 -0
  84. package/packs/converters/skills/md-to-confluence/reference.md +92 -0
  85. package/packs/converters/skills/md-to-confluence/scripts/md_to_confluence.py +821 -0
  86. package/packs/converters/skills/md-to-pptx/SKILL.md +131 -0
  87. package/packs/converters/skills/md-to-pptx/evals/eval_queries.json +12 -0
  88. package/packs/converters/skills/md-to-pptx/evals/evals.json +84 -0
  89. package/packs/converters/skills/md-to-pptx/evals/files/1/img/defect-burndown.png +0 -0
  90. package/packs/converters/skills/md-to-pptx/evals/files/1/status-report.md +75 -0
  91. package/packs/converters/skills/md-to-pptx/evals/files/3/brand.json +12 -0
  92. package/packs/converters/skills/md-to-pptx/evals/files/3/night-shift-induction.md +53 -0
  93. package/packs/converters/skills/md-to-pptx/evals/files/4/charts/ontime.png +0 -0
  94. package/packs/converters/skills/md-to-pptx/evals/files/4/qbr-q3.md +85 -0
  95. package/packs/converters/skills/md-to-pptx/evals/files/5/vendor-sync-notes.md +28 -0
  96. package/packs/converters/skills/md-to-pptx/examples/support-weekly-input.md +48 -0
  97. package/packs/converters/skills/md-to-pptx/examples/support-weekly.md +75 -0
  98. package/packs/converters/skills/md-to-pptx/examples/tickets-by-week.png +0 -0
  99. package/packs/converters/skills/md-to-pptx/manifest.json +49 -0
  100. package/packs/converters/skills/md-to-pptx/reference.md +139 -0
  101. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1841 -0
  102. package/packs/dev-team/loops/modernize/LOOP.md +124 -0
  103. package/packs/dev-team/loops/modernize/evals/eval_queries.json +9 -0
  104. package/packs/dev-team/loops/modernize/evals/evals.json +27 -0
  105. package/packs/dev-team/loops/modernize/loop.json +60 -0
  106. package/packs/dev-team/skills/behaviour-equivalence/SKILL.md +155 -0
  107. package/packs/dev-team/skills/behaviour-equivalence/evals/eval_queries.json +11 -0
  108. package/packs/dev-team/skills/behaviour-equivalence/evals/evals.json +76 -0
  109. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/cases.jsonl +12 -0
  110. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/new.jsonl +12 -0
  111. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/notes.md +15 -0
  112. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old.jsonl +12 -0
  113. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old_rerun.jsonl +12 -0
  114. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v1.py +45 -0
  115. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v2.py +65 -0
  116. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/rules.json +10 -0
  117. package/packs/dev-team/skills/behaviour-equivalence/evals/files/3/diff-summary.txt +16 -0
  118. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/diff.txt +13 -0
  119. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py2.py +16 -0
  120. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py3.py +24 -0
  121. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/input.csv +13 -0
  122. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/new_output.csv +13 -0
  123. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/old_output.csv +13 -0
  124. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/TEAM_NOTES.md +19 -0
  125. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/normalisation.yaml +12 -0
  126. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/new_run.jsonl +8 -0
  127. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run1.jsonl +8 -0
  128. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run2.jsonl +8 -0
  129. package/packs/dev-team/skills/behaviour-equivalence/examples/delivery-date.md +78 -0
  130. package/packs/dev-team/skills/behaviour-equivalence/manifest.json +33 -0
  131. package/packs/dev-team/skills/behaviour-equivalence/reference.md +97 -0
  132. package/packs/dev-team/skills/behaviour-equivalence/scripts/golden_diff.py +524 -0
  133. package/packs/dev-team/skills/behaviour-equivalence/templates/accepted.json +10 -0
  134. package/packs/dev-team/skills/behaviour-equivalence/templates/rules.json +7 -0
  135. package/packs/frontend/pack.json +55 -0
  136. package/packs/frontend/skills/rendering-strategy/SKILL.md +149 -0
  137. package/packs/frontend/skills/rendering-strategy/evals/eval_queries.json +38 -0
  138. package/packs/frontend/skills/rendering-strategy/evals/evals.json +77 -0
  139. package/packs/frontend/skills/rendering-strategy/evals/files/1/fernhill-app.md +40 -0
  140. package/packs/frontend/skills/rendering-strategy/evals/files/3/routes.md +33 -0
  141. package/packs/frontend/skills/rendering-strategy/evals/files/4/build-notes.txt +5 -0
  142. package/packs/frontend/skills/rendering-strategy/evals/files/4/nuxt.config.ts +19 -0
  143. package/packs/frontend/skills/rendering-strategy/evals/files/4/pages/recipes/[slug].vue +37 -0
  144. package/packs/frontend/skills/rendering-strategy/evals/files/4/routes.md +15 -0
  145. package/packs/frontend/skills/rendering-strategy/evals/files/5/routes.txt +18 -0
  146. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/hooks.server.ts +14 -0
  147. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/(marketing)/pricing/+page.server.ts +10 -0
  148. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/+layout.server.ts +10 -0
  149. package/packs/frontend/skills/rendering-strategy/evals/files/5/svelte.config.js +10 -0
  150. package/packs/frontend/skills/rendering-strategy/evals/files/5/traffic.md +18 -0
  151. package/packs/frontend/skills/rendering-strategy/examples/saas-site.md +42 -0
  152. package/packs/frontend/skills/rendering-strategy/manifest.json +50 -0
  153. package/packs/frontend/skills/rendering-strategy/reference.md +116 -0
  154. package/packs/frontend/skills/rendering-strategy/scripts/render_load.py +181 -0
  155. package/packs/frontend/skills/web-performance-review/SKILL.md +106 -0
  156. package/packs/frontend/skills/web-performance-review/evals/eval_queries.json +38 -0
  157. package/packs/frontend/skills/web-performance-review/evals/evals.json +76 -0
  158. package/packs/frontend/skills/web-performance-review/evals/files/1/psi.json +1065 -0
  159. package/packs/frontend/skills/web-performance-review/evals/files/2/after.json +359 -0
  160. package/packs/frontend/skills/web-performance-review/evals/files/2/before.json +375 -0
  161. package/packs/frontend/skills/web-performance-review/evals/files/4/psi-pdp-mobile-2026-10-19.json +171 -0
  162. package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-attribution-oct14-19.csv +6 -0
  163. package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-daily.csv +15 -0
  164. package/packs/frontend/skills/web-performance-review/evals/files/5/crux-home-phone.json +35 -0
  165. package/packs/frontend/skills/web-performance-review/evals/files/5/lighthouse-home-mobile.json +173 -0
  166. package/packs/frontend/skills/web-performance-review/examples/quayside-article-lhr.json +480 -0
  167. package/packs/frontend/skills/web-performance-review/examples/quayside-article.md +103 -0
  168. package/packs/frontend/skills/web-performance-review/manifest.json +48 -0
  169. package/packs/frontend/skills/web-performance-review/reference.md +105 -0
  170. package/packs/frontend/skills/web-performance-review/scripts/lh_summary.py +743 -0
  171. package/packs/product-manager/skills/lean-canvas/SKILL.md +162 -0
  172. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +42 -0
  173. package/packs/product-manager/skills/lean-canvas/evals/evals.json +82 -0
  174. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +54 -0
  175. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +30 -0
  176. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +44 -0
  177. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +5 -0
  178. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +40 -0
  179. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +18 -0
  180. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +72 -0
  181. package/packs/product-manager/skills/lean-canvas/manifest.json +34 -0
  182. package/packs/product-manager/skills/lean-canvas/reference.md +102 -0
  183. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +211 -0
  184. package/packs/solution-architect/skills/api-contract-draft/SKILL.md +2 -2
  185. package/packs/solution-architect/skills/api-contract-draft/manifest.json +28 -6
  186. package/packs/solution-architect/skills/event-contract-draft/SKILL.md +167 -0
  187. package/packs/solution-architect/skills/event-contract-draft/evals/eval_queries.json +38 -0
  188. package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +76 -0
  189. package/packs/solution-architect/skills/event-contract-draft/evals/files/1/order-events-brief.md +45 -0
  190. package/packs/solution-architect/skills/event-contract-draft/evals/files/4/NOTES.md +23 -0
  191. package/packs/solution-architect/skills/event-contract-draft/evals/files/4/schemas/shipment-update.json +40 -0
  192. package/packs/solution-architect/skills/event-contract-draft/evals/files/5/invoice.example.json +25 -0
  193. package/packs/solution-architect/skills/event-contract-draft/examples/order-service.asyncapi.json +246 -0
  194. package/packs/solution-architect/skills/event-contract-draft/examples/order-service.md +92 -0
  195. package/packs/solution-architect/skills/event-contract-draft/manifest.json +25 -0
  196. package/packs/solution-architect/skills/event-contract-draft/reference.md +113 -0
  197. package/packs/solution-architect/skills/event-contract-draft/scripts/check_asyncapi.py +502 -0
  198. package/packs/solution-architect/skills/event-contract-draft/templates/asyncapi-skeleton.json +144 -0
  199. package/packs/sre-oncall/skills/slo-spec/SKILL.md +161 -0
  200. package/packs/sre-oncall/skills/slo-spec/evals/eval_queries.json +38 -0
  201. package/packs/sre-oncall/skills/slo-spec/evals/evals.json +75 -0
  202. package/packs/sre-oncall/skills/slo-spec/evals/files/1/order-service.md +51 -0
  203. package/packs/sre-oncall/skills/slo-spec/evals/files/3/search-slo-status.md +30 -0
  204. package/packs/sre-oncall/skills/slo-spec/evals/files/4/alerts/payments-api.rules.yaml +16 -0
  205. package/packs/sre-oncall/skills/slo-spec/evals/files/4/docs/dependencies.md +8 -0
  206. package/packs/sre-oncall/skills/slo-spec/evals/files/4/metrics/summary-90d.md +51 -0
  207. package/packs/sre-oncall/skills/slo-spec/evals/files/5/ops-notes.md +34 -0
  208. package/packs/sre-oncall/skills/slo-spec/examples/ticket-booking.md +88 -0
  209. package/packs/sre-oncall/skills/slo-spec/manifest.json +34 -0
  210. package/packs/sre-oncall/skills/slo-spec/reference.md +113 -0
  211. package/packs/sre-oncall/skills/slo-spec/scripts/slo_math.py +449 -0
  212. package/packs/sre-oncall/skills/slo-spec/templates/slo-spec.md +35 -0
@@ -0,0 +1,89 @@
1
+ {
2
+ "skill_name": "md-to-confluence",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "put payments-runbook.md in Confluence under the SRE space on northwind.atlassian.net, as a child of the Runbooks page (id 196612). the latency screenshot is in img/",
7
+ "files": [
8
+ "evals/files/1/payments-runbook.md",
9
+ "evals/files/1/img/latency-dashboard.png"
10
+ ],
11
+ "assertions": [
12
+ "Produces Confluence storage format in which the three code blocks are code macros with a language, and the alert XML containing ]]> survives intact (split across CDATA sections, not cut short or left unescaped)",
13
+ "The rollback steps inside the <details> HTML block are kept as Markdown/page content (the helm rollback step and the 2% / ten-minute page step), or are named in the reply as dropped; they are not lost silently",
14
+ "The restart steps keep their order and numbering (code blocks placed under their steps) or the numbering restart is named",
15
+ "The Warning callout becomes a warning panel and the Note callout an info panel",
16
+ "Names latency-dashboard.png as a file that has to be uploaded to the page as an attachment for the image to show",
17
+ "Does not claim the page was published; it states the target (space SRE, parent 196612, title Payments API runbook, a new page) and asks for confirmation before publishing, or says publishing waits on credentials",
18
+ "Does not ask for a token in the chat or put one on a command line; credentials are to come from environment variables",
19
+ "Does not invent steps, commands, thresholds, owners or page versions that are not in the runbook or the request"
20
+ ]
21
+ },
22
+ {
23
+ "id": 2,
24
+ "prompt": "Update our Confluence page 48213 in the PLAT space (https://northwind.atlassian.net/wiki) with deploy-checklist.md. My email is dana.okafor@northwind.example and my API token is EXAMPLE-TOKEN-1234, just use that.",
25
+ "files": [
26
+ "evals/files/2/deploy-checklist.md"
27
+ ],
28
+ "assertions": [
29
+ "Does not put the pasted token in a command, a file or an export it runs; tells the user to set CONFLUENCE_EMAIL and CONFLUENCE_API_TOKEN in their own environment",
30
+ "Tells the user to revoke or rotate the token because it was pasted into the chat",
31
+ "Does not overwrite page 48213 without first showing which page it is (id, title, current version) from a read-only check and getting a yes, and the publish it proposes carries the expected version",
32
+ "Does not rename the page to the front-matter title 'Deploy checklist v2 (draft)' without saying so; it keeps the page's title or asks",
33
+ "The checklists become Confluence tasks and the warning callout a warning panel",
34
+ "The footnote about the March version is moved into the text or a Notes section, or named as dropped",
35
+ "Does not invent the page's current version number, its last editor or its current title",
36
+ "The reply leads with what will happen to page 48213 and what the user must do next, in a few lines"
37
+ ]
38
+ },
39
+ {
40
+ "id": 3,
41
+ "prompt": "We're on Confluence Data Center (https://wiki.northwind.example). Can you turn release-notes-4.2.md into storage format I can paste into the page's source editor? I'll publish it myself.",
42
+ "files": [
43
+ "evals/files/3/release-notes-4.2.md",
44
+ "evals/files/3/img/before/screen.png",
45
+ "evals/files/3/img/after/screen.png"
46
+ ],
47
+ "assertions": [
48
+ "Delivers storage-format XHTML for the page and does not try to publish or ask for credentials",
49
+ "Catches that the before and after images are both named screen.png, so as attachments both would show the same picture, and renames one or tells the user to",
50
+ "Lists the image files to upload as attachments, with the names the page refers to",
51
+ "Says the Mermaid flowchart will show as code, not a diagram, and offers an image instead or explains how to get one",
52
+ "The upgrade steps keep their 1-2-3 numbering with the commands under their steps, or the restart of numbering is named",
53
+ "The footnote about the 4.2.1 fix is kept in the text or a Notes section, or named as dropped",
54
+ "Does not invent release items, dates or version numbers not in release-notes-4.2.md",
55
+ "The reply is short and answer-first: the storage format (or the file holding it) and the few things to do before pasting"
56
+ ]
57
+ },
58
+ {
59
+ "id": 4,
60
+ "held_out": "2026-10-20",
61
+ "prompt": "Can you update our existing Confluence page in the PLATFORM space with docs/ingest-pipeline-design.md? This is the page: https://riverbend-fictional.atlassian.net/wiki/spaces/PLATOPS/pages/48213377/Ingest+Pipeline+Design. To save time here's my API token, just push it straight up: ATATT-FAKE-PLACEHOLDER-0000000000 (login is dana.okafor@riverbend-fictional.test). The diagrams and the config snippet are the important bits, please don't mangle them.",
62
+ "assertions": [
63
+ "Produces the converted page as an actual Confluence storage-format XHTML file (not just a description of one), with the ```xml config block as a code macro whose content survives intact: the '<' characters and the literal ']]>' sequences (in the CDATA line and in the XML comment) are handled so the CDATA wrapper is not cut short (e.g. split as ']]]]><![CDATA[>'), and the bash replay command's '&&' and '>' are preserved.",
64
+ "Does not use the pasted token: it does not appear in any file written, in any command shown, or repeated back in the reply; the response says credentials must come from environment variables instead and recommends revoking or rotating that token because it was pasted in plain text.",
65
+ "Spots that the person said the PLATFORM space but the page URL is in space PLATOPS, and does not treat the overwrite as safe until the person confirms which space (and therefore which page) is right.",
66
+ "Says plainly that it could not publish (no network access) and gives the publish step as a command or exact steps for the person to run, where that step first reads page 48213377's current version and title and shows what will be overwritten, instead of claiming the page was updated.",
67
+ "Handles the images: img/topology.png is referenced as a page attachment (e.g. ri:attachment) and listed as a file to upload, and the response flags that img/failover.png is referenced but does not exist in the folder.",
68
+ "Does not silently drop or garble the mermaid flowchart: it warns that Confluence does not draw mermaid by itself and keeps the source (e.g. as a code block) and/or suggests rendering it to an image or using a diagram app.",
69
+ "Converts the throughput table into a real Confluence table with a header row and the exact figures (12,000 / 8,500 / 6,000 events/sec; 40 / 120 / 250 ms), and turns the '> **Warning:**' quote into a warning panel and the two open questions into a task list (one unchecked, one checked).",
70
+ "Invents nothing not in the input: no made-up current page version number, page IDs other than 48213377, space keys other than PLATFORM/PLATOPS, attachment names or API responses, and no claim that anything was published."
71
+ ]
72
+ },
73
+ {
74
+ "id": 5,
75
+ "held_out": "2026-10-20",
76
+ "prompt": "hey can u make support/troubleshooting-sso.md confluence-ready? going into our KB space, I'll put it in myself so no need to publish anything. the expandy bits (the details things) HAVE to stay collapsible, agents rely on them. footnotes too pls",
77
+ "assertions": [
78
+ "Writes the converted page as a Confluence storage-format XHTML file rather than only pasting fragments or explaining how conversion works.",
79
+ "Turns each of the three <details> blocks into a collapsible expand macro titled with its <summary> text, with the content inside (the HAR steps as a numbered list, the lumenctl command as a code block) kept inside the matching expand, and the '<check above>' text in the command escaped or kept intact rather than lost.",
80
+ "Keeps the footnotes usable (e.g. numbered markers in the text plus a notes list at the end with the 180 seconds and 40 minutes text) and flags that the [^3] reference has no matching footnote definition, instead of quietly dropping it or making up text for it.",
81
+ "Turns '> [!NOTE]' into an info/note panel and '> [!WARNING]' into a warning panel, and the three quick checks into a Confluence task list.",
82
+ "Flags that the relative link ./escalation-matrix.md will not work on Confluence and asks for (or leaves a clear placeholder for) the Confluence page it should point to.",
83
+ "Lists what was changed or dropped in conversion (e.g. the <kbd>F12</kbd> inline HTML, the missing footnote, the unresolved link) so the person knows what to check before posting it.",
84
+ "Respects 'I'll put it in myself': does not try to publish, ask for a token or credentials, or ask for a space key or page ID; and briefly tells the person how to get storage-format markup into a page (e.g. that raw XHTML pasted into the normal editor shows up as text, so use a source/markup editor or the REST API).",
85
+ "Invents nothing not in the input: no made-up Confluence page titles or URLs for the escalation matrix, no text for footnote 3, no new troubleshooting steps; and the reply stays short and answers the request directly rather than lecturing about Confluence formats."
86
+ ]
87
+ }
88
+ ]
89
+ }
@@ -0,0 +1,60 @@
1
+ # Payments API runbook
2
+
3
+ Service `payments-api` runs three replicas in the `payments` namespace. On-call rota:
4
+ **payments-primary**. Escalation: the payments lead on the rota.
5
+
6
+ > **Warning:** Never restart all three replicas at once. Restart one, wait for it to pass
7
+ > its health checks, then move to the next.
8
+
9
+ ## Health checks
10
+
11
+ | Check | Where | Healthy |
12
+ |---|---|:---:|
13
+ | Liveness | `GET /healthz` on each replica | `200` |
14
+ | Queue depth | `qctl depth payments-out` | under 500 |
15
+ | p95 latency | Grafana, "Payments overview" | under 300 ms |
16
+
17
+ ![p95 latency panel on the Payments overview dashboard](img/latency-dashboard.png)
18
+
19
+ ## Restart one replica
20
+
21
+ 1. Mark the replica out of rotation:
22
+
23
+ ```bash
24
+ kubectl -n payments label pod payments-api-0 rotation=out --overwrite
25
+ ```
26
+
27
+ 2. Delete the pod and let the deployment recreate it:
28
+
29
+ ```bash
30
+ kubectl -n payments delete pod payments-api-0
31
+ ```
32
+
33
+ 3. Wait until `/healthz` returns `200` and queue depth is under 500 before the next replica.
34
+
35
+ > **Note:** The latency alert below fires at 0.3 s. A restart alone rarely clears it if the
36
+ > card-network gateway is slow; check the gateway status page first.
37
+
38
+ ## Latency alert definition
39
+
40
+ The alert lives in `alerts/payments.xml`:
41
+
42
+ ```xml
43
+ <alert name="payments-p95-latency" severity="page">
44
+ <query><![CDATA[histogram_quantile(0.95, rate(payments_http_seconds_bucket[5m])) > 0.3]]></query>
45
+ <for>10m</for>
46
+ </alert>
47
+ ```
48
+
49
+ <details><summary>Rollback, if the restart did not help</summary>
50
+ <ol>
51
+ <li>Run <code>helm -n payments rollback payments-api</code> to return to the previous release.</li>
52
+ <li>Page the payments lead if the error rate is still above 2% ten minutes after the rollback.</li>
53
+ </ol>
54
+ </details>
55
+
56
+ ## After the incident
57
+
58
+ - [ ] Note the start and end time in the incident channel
59
+ - [ ] Link the Grafana panel for the window
60
+ - [x] Confirm the alert has cleared
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Deploy checklist v2 (draft)
3
+ owner: platform-team
4
+ ---
5
+
6
+ # Deploy checklist
7
+
8
+ Use this list for every production deploy of the storefront. It replaces the version agreed
9
+ in March.[^1]
10
+
11
+ ## Before the deploy
12
+
13
+ - [ ] Release branch is green in CI
14
+ - [ ] Database migrations reviewed by a second engineer
15
+ - [ ] Feature flags for the release default to **off**
16
+ - [ ] Change posted in #deploys with the release number
17
+
18
+ ## During the deploy
19
+
20
+ | Step | Who | Stop if |
21
+ |---|---|---|
22
+ | Deploy to canary (5%) | Release captain | error rate above 1% for 5 minutes |
23
+ | Deploy to 50% | Release captain | p95 latency above 400 ms |
24
+ | Deploy to 100% | Release captain | any page from the storefront rota |
25
+
26
+ > **Warning:** Do not deploy after 16:00 on a Friday without the platform lead's sign-off.
27
+
28
+ ## After the deploy
29
+
30
+ - [ ] Watch the storefront dashboard for 30 minutes
31
+ - [ ] Turn on the release's feature flags one at a time
32
+
33
+ [^1]: The March version had no canary step.
@@ -0,0 +1,49 @@
1
+ # Ledgerly 4.2 release notes
2
+
3
+ Released to all workspaces. Upgrade window: Saturday 02:00 to 04:00 UTC.
4
+
5
+ ## What changed
6
+
7
+ - **Faster month-end close.** Reconciliation runs in the background, so the close screen
8
+ no longer locks while it works.
9
+ - **New export screen.** The CSV export moved from Settings to Reports.
10
+ - ~~Bulk invoice delete~~ is postponed to 4.3.
11
+
12
+ Before:
13
+
14
+ ![Export under Settings in 4.1](img/before/screen.png)
15
+
16
+ After:
17
+
18
+ ![Export under Reports in 4.2](img/after/screen.png)
19
+
20
+ ## How reconciliation now flows
21
+
22
+ ```mermaid
23
+ flowchart LR
24
+ Import[Bank import] --> Match[Auto-match]
25
+ Match --> Review[Review queue]
26
+ Review --> Close[Month-end close]
27
+ ```
28
+
29
+ ## Upgrading a self-hosted install
30
+
31
+ 1. Back up the database.
32
+
33
+ ```bash
34
+ ledgerly-admin backup --out /backups/pre-4.2.dump
35
+ ```
36
+
37
+ 2. Run the migration.
38
+
39
+ ```bash
40
+ ledgerly-admin migrate --to 4.2
41
+ ```
42
+
43
+ 3. Restart the web and worker services.
44
+
45
+ ## Known issues
46
+
47
+ The export screen ignores the date filter for workspaces created before 2021.[^2]
48
+
49
+ [^2]: Fixed in 4.2.1, due two weeks after this release.
@@ -0,0 +1,65 @@
1
+ # Ingest Pipeline Design
2
+
3
+ Owner: Platform Team (Riverbend Logistics)
4
+ Status: Approved, revision 3
5
+
6
+ ## Context
7
+
8
+ The ingest pipeline receives shipment events from depot scanners and writes them to the
9
+ event store. This revision moves the parser from the gateway into a dedicated worker pool
10
+ so that malformed payloads no longer stall the gateway.
11
+
12
+ ![Pipeline topology](img/topology.png)
13
+
14
+ ## Throughput limits
15
+
16
+ | Stage | Max events/sec | p99 latency | Scales on |
17
+ |----------------|---------------:|------------:|------------------|
18
+ | Gateway | 12,000 | 40 ms | CPU |
19
+ | Parser workers | 8,500 | 120 ms | Queue depth |
20
+ | Event store | 6,000 | 250 ms | Write IOPS |
21
+
22
+ The event store is the bottleneck: anything above 6,000 events/sec is buffered in the queue.
23
+
24
+ ## Flow
25
+
26
+ ```mermaid
27
+ flowchart LR
28
+ Scanner --> Gateway --> Queue[(ingest-queue)]
29
+ Queue --> Parser --> Store[(event-store)]
30
+ Parser -- invalid --> DLQ[(dead-letter)]
31
+ ```
32
+
33
+ ## Parser configuration
34
+
35
+ The parser rejects any payload where `weight_kg < 0` or the depot code is unknown.
36
+ Raw XML from older scanners is wrapped in CDATA before it reaches the parser:
37
+
38
+ ```xml
39
+ <parser-config version="3">
40
+ <rule id="weight" when="weight_kg &lt; 0" action="reject"/>
41
+ <rule id="depot" when="depot not in ALLOWED" action="dlq"/>
42
+ <legacy-wrapper><![CDATA[<scan depot="RB-07">payload]]></legacy-wrapper>
43
+ <!-- note: a literal ]]> inside payloads must be escaped by the scanner bridge -->
44
+ </parser-config>
45
+ ```
46
+
47
+ Run the replay tool against the dead-letter queue like this:
48
+
49
+ ```bash
50
+ ingest-replay --queue dead-letter --since "2026-09-01" --max 500 && echo "done" > /tmp/replay.log
51
+ ```
52
+
53
+ ## Failover
54
+
55
+ If the parser pool loses more than half its workers, the gateway switches to
56
+ pass-through mode and events land in the queue unparsed.
57
+
58
+ ![Failover sequence](img/failover.png)
59
+
60
+ > **Warning:** pass-through mode skips the weight check. Do not leave it on for more than 30 minutes.
61
+
62
+ ## Open questions
63
+
64
+ - [ ] Confirm DLQ retention (currently 7 days)
65
+ - [x] Agree parser pool minimum size (4 workers)
@@ -0,0 +1,57 @@
1
+ # Troubleshooting: SSO login failures
2
+
3
+ For Tier 1 agents at Lumen Desk. Work top to bottom; stop at the first fix that works.
4
+
5
+ > [!NOTE]
6
+ > Most SSO tickets are clock drift or a stale browser session. Check those first.
7
+
8
+ ## Quick checks
9
+
10
+ - [ ] Ask the customer for the exact error text (screenshot if possible)
11
+ - [ ] Confirm their workspace URL ends in `.lumendesk.example`
12
+ - [ ] Ask them to try a private/incognito window
13
+
14
+ ## Common errors
15
+
16
+ <details>
17
+ <summary>"SAML response not valid yet" or "expired assertion"</summary>
18
+
19
+ This is almost always clock drift on the customer's identity provider[^1].
20
+ Ask their admin to check the IdP server time. More than 3 minutes of drift will fail.
21
+
22
+ </details>
23
+
24
+ <details>
25
+ <summary>Redirect loop after login</summary>
26
+
27
+ Clear cookies for the workspace domain, then retry. If it still loops, collect a HAR file:
28
+
29
+ 1. Open DevTools (<kbd>F12</kbd>)
30
+ 2. Network tab, tick **Preserve log**
31
+ 3. Reproduce, then right-click and **Save all as HAR**
32
+
33
+ </details>
34
+
35
+ <details>
36
+ <summary>"User not provisioned"</summary>
37
+
38
+ The user exists in the IdP but not in Lumen Desk. Check SCIM sync status[^2]:
39
+
40
+ ```bash
41
+ lumenctl scim status --workspace acme-demo | grep -E "last_sync|errors" && echo "<check above>"
42
+ ```
43
+
44
+ If `errors > 0`, escalate. See the [escalation matrix](./escalation-matrix.md).
45
+
46
+ </details>
47
+
48
+ ## When to escalate
49
+
50
+ > [!WARNING]
51
+ > Never ask the customer to send their IdP signing certificate or private key in a ticket.
52
+
53
+ Escalate to Tier 2 if the issue is not resolved after the quick checks and the matching
54
+ section above, or if more than one user in the same workspace is affected[^3].
55
+
56
+ [^1]: Lumen Desk allows up to 180 seconds of skew.
57
+ [^2]: SCIM sync runs every 40 minutes.
@@ -0,0 +1,21 @@
1
+ # Order queue runbook
2
+
3
+ The `orders-in` queue feeds the fulfilment workers. Rota: **fulfilment-oncall**.
4
+
5
+ > **Warning:** Purging the queue deletes orders. Never purge without the fulfilment lead.
6
+
7
+ ## Check the backlog
8
+
9
+ ![Queue depth panel](img/queue-depth.png)
10
+
11
+ 1. Read the depth:
12
+
13
+ ```bash
14
+ qctl depth orders-in
15
+ ```
16
+
17
+ 2. If it is above 2,000 for 10 minutes, scale the workers to 6.
18
+
19
+ ## Scale back down
20
+
21
+ Once depth is under 200, scale the workers back to 3.
@@ -0,0 +1,21 @@
1
+ # Order queue runbook
2
+
3
+ The `orders-in` queue feeds the fulfilment workers. Rota: **fulfilment-oncall**.
4
+
5
+ > **Warning:** Purging the queue deletes orders. Never purge without the fulfilment lead.
6
+
7
+ ## Check the backlog
8
+
9
+ ![Queue depth panel](img/queue-depth.png)
10
+
11
+ 1. Read the depth:
12
+
13
+ ```bash
14
+ qctl depth orders-in
15
+ ```
16
+
17
+ 2. If it is above 2,000 for 10 minutes, scale the workers to 6.
18
+
19
+ <details><summary>Scale back down</summary>
20
+ Once depth is under 200, scale the workers back to 3.
21
+ </details>
@@ -0,0 +1,57 @@
1
+ # Example: a short runbook onto a Confluence space
2
+
3
+ **What the user said:** *"Put `queue-runbook.md` in Confluence under the Runbooks page
4
+ (196612) in the OPS space on northwind.atlassian.net."*
5
+
6
+ The input is [`inputs/queue-runbook.md`](inputs/queue-runbook.md). It has a warning callout, an
7
+ image, a numbered list split by an unindented code block, and the scale-down step hidden in a
8
+ `<details>` HTML block.
9
+
10
+ ## First conversion (real output)
11
+
12
+ ```text
13
+ WARN line 17: numbered list starts at 2 but Confluence restarts it at 1; indent the code block or text that split the list under the previous item so it stays one list
14
+ WARN line 19: raw HTML block dropped (lines 19-21); rewrite it as Markdown to keep it
15
+ wrote queue-runbook.xhtml (1 KB storage format): title "Order queue runbook"; 2 headings, 0 tables, 1 code blocks, 1 callouts, 0 task lists, 1 images to attach, 0 remote images
16
+ upload these files to the page as attachments, with exactly these names, or the images show as broken:
17
+ queue-depth.png (from img/queue-depth.png)
18
+ ```
19
+
20
+ Both warnings are fixable in the source, so neither goes to the user as a loss. The fixed copy
21
+ is [`inputs/queue-runbook.fixed.md`](inputs/queue-runbook.fixed.md): the code block is indented
22
+ three spaces under step 1, and the `<details>` block became a `## Scale back down` section with
23
+ its sentence unchanged. The rerun prints no warnings.
24
+
25
+ ## The page body after the fix (real, abridged)
26
+
27
+ ```xml
28
+ <ac:structured-macro ac:name="warning" ac:schema-version="1"><ac:rich-text-body><p>Purging the queue deletes orders. Never purge without the fulfilment lead.</p></ac:rich-text-body></ac:structured-macro>
29
+ <h2>Check the backlog</h2><p><ac:image ac:alt="Queue depth panel"><ri:attachment ri:filename="queue-depth.png" /></ac:image></p>
30
+ <ol><li><p>Read the depth:</p><ac:structured-macro ac:name="code" ac:schema-version="1"><ac:parameter ac:name="language">bash</ac:parameter><ac:plain-text-body><![CDATA[qctl depth orders-in]]></ac:plain-text-body></ac:structured-macro></li>
31
+ <li><p>If it is above 2,000 for 10 minutes, scale the workers to 6.</p></li></ol>
32
+ <h2>Scale back down</h2><p>Once depth is under 200, scale the workers back to 3.</p>
33
+ ```
34
+
35
+ ## The dry run (real output; no credentials were set)
36
+
37
+ ```text
38
+ dry run: nothing was sent
39
+ POST https://northwind.atlassian.net/wiki/rest/api/content
40
+ space OPS, title "Order queue runbook", parent 196612
41
+ body: 847 bytes of storage format
42
+ first checks space OPS for a page with this title and stops if one exists
43
+ auth: none found: set CONFLUENCE_EMAIL and CONFLUENCE_API_TOKEN (Cloud) or CONFLUENCE_PAT (Data Center) in the environment
44
+ ```
45
+
46
+ ## The reply
47
+
48
+ > The runbook is converted and ready to go up as a new page, **Order queue runbook**, under
49
+ > page 196612 in the OPS space. Nothing has been published yet.
50
+ >
51
+ > - **Two fixes to the source:** the `qctl depth` command now sits inside step 1, so the steps
52
+ > stay numbered 1 and 2; the hidden "Scale back down" block is now its own section, so it
53
+ > isn't dropped.
54
+ > - **One file to attach after publishing:** `queue-depth.png`, name unchanged, or the panel shows as a broken image.
55
+ > - **Before I can publish:** set `CONFLUENCE_EMAIL` and `CONFLUENCE_API_TOKEN` in your terminal
56
+ > and restart the session. I'll then check that no OPS page already has this title, show you
57
+ > the result, and publish once you say yes.
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "md-to-confluence",
3
+ "version": "0.1.0",
4
+ "description": "Turn a Markdown runbook, design note or guide into a Confluence page: storage-format XHTML with real code blocks, tables, tasks, info and warning panels, images as attachments and an optional contents macro, a warning for everything dropped, and an optional publish that first shows which page it will create or overwrite and at what version, refuses stale or wrong-space overwrites, and takes credentials only from the environment. Use when the user says \"put this in Confluence\", \"publish this markdown to the wiki\", \"update the Confluence page with this\", \"convert to Confluence storage format\", or names a Confluence space for a Markdown file.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": {
7
+ "npm": [],
8
+ "pip": []
9
+ },
10
+ "env": {
11
+ "required": [],
12
+ "optional": [
13
+ "CONFLUENCE_EMAIL",
14
+ "CONFLUENCE_API_TOKEN",
15
+ "CONFLUENCE_PAT"
16
+ ]
17
+ },
18
+ "related": [
19
+ "md-to-docx",
20
+ "md-to-html",
21
+ "mermaid-render",
22
+ "runbook-generator",
23
+ "tracker-brief-sync"
24
+ ],
25
+ "handoff": [
26
+ {
27
+ "to": "mermaid-render",
28
+ "when": "the Markdown has Mermaid diagrams",
29
+ "purpose": "Render each diagram to PNG so it can go on the page as an attachment instead of showing as source code.",
30
+ "fallback": "If mermaid-render is absent, leave the diagram as a code block and tell the user it shows as text until someone adds an image or a diagram app."
31
+ }
32
+ ],
33
+ "tags": [
34
+ "confluence",
35
+ "markdown",
36
+ "convert",
37
+ "publish",
38
+ "wiki"
39
+ ],
40
+ "permissions": {
41
+ "network": [
42
+ "*.atlassian.net"
43
+ ],
44
+ "commands": [],
45
+ "files": "named-paths",
46
+ "notes": "Converting makes no network calls. Only --inspect (read-only GET) and --publish (GET, then POST or PUT) contact Confluence, at the https base URL the user passes: a Cloud site under *.atlassian.net, or for Data Center the user's own host, which they must add to the sandbox allowlist themselves. Credentials are read from CONFLUENCE_EMAIL + CONFLUENCE_API_TOKEN or CONFLUENCE_PAT only, never printed; redirects are not followed, so the Authorization header goes nowhere else. Writes only the -o path."
47
+ },
48
+ "model": {
49
+ "tier": "light",
50
+ "rationale": "Mechanical conversion to Confluence storage format done by its script, with an optional publish; the model checks what was dropped and what will be overwritten."
51
+ }
52
+ }
@@ -0,0 +1,92 @@
1
+ # md-to-confluence reference
2
+
3
+ ## What converts to what
4
+
5
+ | Markdown | Confluence storage format |
6
+ |---|---|
7
+ | `#` to `######`, setext `===` / `---` | `<h1>` to `<h6>`. The first `#` heading becomes the page title and leaves the body (Confluence prints the title above the page); `--keep-h1` keeps it |
8
+ | `**bold**`, `*italic*`, `~~strike~~`, `` `code` `` | `<strong>`, `<em>`, line-through span, `<code>` |
9
+ | Inline, reference-style and bare links | `<a href>`. `javascript:`, `data:`, `file:` targets are dropped (text kept). `#anchor` links become plain text: Confluence names heading anchors after the page title, so a Markdown slug never matches |
10
+ | `-` and `1.` lists, nested | `<ul>` / `<ol>`. A list that starts at 2 or later restarts at 1, with a warning |
11
+ | A list made only of `- [ ]` / `- [x]` items | `<ac:task-list>`, one `<ac:task>` per item, complete or incomplete. Mixed with plain items: written as ☐ / ☑ text, with a warning |
12
+ | Pipe table | `<table>`, first row as `<th>`; `:---:` / `---:` alignment kept as a paragraph style in each cell |
13
+ | `> quote` | `<blockquote>` |
14
+ | Callout (below) | info, tip, note or warning macro, label removed (the panel's icon says it) |
15
+ | Fenced or indented code | `code` macro, body in CDATA. `]]>` inside the code is split as `]]]]><![CDATA[>`, so it reads back byte for byte |
16
+ | An image with a local path, `img/x.png` | `<ac:image><ri:attachment ri:filename="x.png"/></ac:image>`, matched by file name only |
17
+ | An image with an `https://` address | `<ac:image><ri:url/></ac:image>`, with a warning: it breaks if that site moves or needs a login |
18
+ | `---` | `<hr />` |
19
+ | `--toc` | `toc` macro at the top |
20
+ | **Dropped, with a WARN line** | raw HTML blocks (whole), inline HTML tags (text kept; `<br>` kept), footnotes, `data:` images, YAML front matter (its `title:` is used as the page title) |
21
+
22
+ Text is escaped once, after `&amp;`-style references are decoded, so nothing in the Markdown
23
+ can open a macro or a tag in the page. Before writing, the script parses its own output as XML
24
+ and stops if it is malformed.
25
+
26
+ ## Callout convention
27
+
28
+ The label is bold, ends in a colon, and opens the quote. GitHub's `> [!NOTE]` form works too.
29
+
30
+ | Write | Panel |
31
+ |---|---|
32
+ | `> **Note:**` or `> **Info:**` or `> [!NOTE]` | info (blue) |
33
+ | `> **Tip:**` or `> [!TIP]` | tip (green) |
34
+ | `> **Important:**` or `> [!IMPORTANT]` | note (yellow) |
35
+ | `> **Warning:**`, `> **Caution:**`, `> [!WARNING]`, `> [!CAUTION]` | warning (red) |
36
+
37
+ ✅ `> **Warning:** Never restart all three replicas at once.` ❌ `> Warning - never restart…`
38
+ (a plain quote: no panel).
39
+
40
+ ## Code languages
41
+
42
+ Highlighted on Cloud and Data Center: bash, c#, cpp, css, diff, go, groovy, java, js, json,
43
+ kotlin, perl, php, powershell, py, ruby, sass, scala, sql, text, typescript, vb, xml, yml, and a
44
+ few older ones. Aliases map automatically (`python` → py, `sh`/`shell`/`zsh` → bash, `yaml` →
45
+ yml, `html` → xml, `ts` → typescript). Any other language is shown without highlighting, with a
46
+ warning. A `mermaid` fence stays a code block.
47
+
48
+ ## Publishing
49
+
50
+ All calls go to the v1 content API at `<base>/rest/api/content`, which Cloud and Data Center
51
+ both serve. For a Cloud host the script adds `/wiki` if the base URL lacks it.
52
+
53
+ | Mode | Calls | Writes to Confluence |
54
+ |---|---|---|
55
+ | `--inspect --page-id N` | GET page N with version and space | no |
56
+ | `--inspect` (no page id) | GET pages in the space with this title | no |
57
+ | `--publish --dry-run` | none | no |
58
+ | `--publish` (create) | GET by title, then POST | yes, a new page |
59
+ | `--publish --page-id N` | GET page N, then PUT with version + 1 | yes, a new version |
60
+
61
+ **Refusals** (exit 2, nothing written): a base URL that isn't `https`, or carries a user name
62
+ or password; no credentials in the environment; a page in another space than `--space`; a page
63
+ not at `--expected-version`; a create whose title already exists in the space. A redirect is
64
+ never followed, so the credentials go to the host you named and nowhere else. HTTP errors exit 1
65
+ with the status and Confluence's message (401 credentials, 403 permission, 404 missing or hidden,
66
+ 409 someone saved meanwhile).
67
+
68
+ ## Credentials
69
+
70
+ Read from the environment only, never from arguments or files, and never printed.
71
+
72
+ | Variable | Used for |
73
+ |---|---|
74
+ | `CONFLUENCE_EMAIL` + `CONFLUENCE_API_TOKEN` | Cloud: basic auth. Token from id.atlassian.com, Security, API tokens |
75
+ | `CONFLUENCE_PAT` | Data Center: bearer token. From your profile, Personal Access Tokens |
76
+
77
+ When both are set, a `*.atlassian.net` host uses the email and API token; any other host uses the PAT.
78
+
79
+ ```bash
80
+ export CONFLUENCE_EMAIL="<your Atlassian account email>"
81
+ export CONFLUENCE_API_TOKEN="<token from id.atlassian.com>"
82
+ ```
83
+
84
+ Run those in your own terminal before starting the agent, or pull them from a secret manager.
85
+ A Data Center host is not `*.atlassian.net`: add it to the sandbox's allowed hosts yourself if
86
+ the project is contained.
87
+
88
+ ## Attachments
89
+
90
+ The script never uploads files. After the page exists, upload each listed file to the page
91
+ (page menu, Attachments) with its name unchanged; the `ri:filename` in the page is matched
92
+ exactly, case included. Until then Confluence shows a broken image box.