Best for
- Use when the user wants to mirror, export, or ingest Confluence content.
eugenelim/agent-ready-repo/packs/atlassian/.apm/skills/confluence-crawler/SKILL.md
Crawl an authenticated Confluence space (Atlassian Cloud or on-prem Server/Data Center) by page hierarchy and convert each page to clean Markdown with frontmatter. Handles macros, attachments, internal link rewriting, depth limits, and idempotent re-crawling. Use when the user wants to mirror, export, or ingest Confluence content.
Decision brief
Crawl a Confluence space (Cloud or Server/Data Center) and write each page as Markdown with YAML frontmatter.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/eugenelim/agent-ready-repo --skill "packs/atlassian/.apm/skills/confluence-crawler"Inspect the Agent Skill "confluence-crawler" from https://github.com/eugenelim/agent-ready-repo/blob/9563bc93aa5b0750b327be2fd95676ff2a5ec63b/packs/atlassian/.apm/skills/confluence-crawler/SKILL.md at commit 9563bc93aa5b0750b327be2fd95676ff2a5ec63b. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
You are a Confluence export agent. The heavy lifting — authentication, REST pagination, macro conversion, link rewriting, idempotency — lives in scripts/. Do not re-implement any of that logic; just invoke the scripts with the right arguments and report the result.
Check Python dependencies are installed. If not, install them:
Invoke the crawler with the user's arguments. Only these flags are supported:
The final log line reports wrote N pages (failed: X, skipped: Y). Relay this to the user. If any pages failed, check the log for which IDs — usually permission issues on specific pages.
The script is idempotent. On re-run:
Permission review
The documentation asks the agent to read local files, directories, or repositories.
*Never** read that file, print it, or echo the token.The documentation asks the agent to read local files, directories, or repositories.
the bytes. **Never** read the jar file directly, print its contents, or echoThe documentation asks the agent to run terminal commands or scripts.
python -m pip install -r requirements.txtThe documentation asks the agent to run terminal commands or scripts.
python scripts/crawl_space.py --checkEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 86/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 15 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Crawl a Confluence space (Cloud or Server/Data Center) and write each page as Markdown with YAML frontmatter.
Key–value / one record — For a single record's fields, use an aligned key: value list, not a two-row table.
You are a Confluence export agent. The heavy lifting — authentication, REST pagination, macro conversion, link rewriting, idempotency — lives in scripts/. Do not re-implement any of that logic; just invoke the scripts with the right arguments and report the result.
The skill works against both:
*.atlassian.net) — Basic auth with email + API token from id.atlassian.com. Base URL must include /wiki (setup adds it automatically).Flavor is auto-detected from the base URL. Override via CONFLUENCE_FLAVOR=cloud|server if needed.
Credentials are resolved by the build-projected credentials_shim.load_credentials
through Tier 1 (env) → Tier 2 (OS keyring) → Tier 3 dotfile. The dotfile
lives at ~/.agentbundle/credentials.env. The declared schema is in
references/creds-schema.toml:
| Key | Required | Notes |
|---|---|---|
CONFLUENCE_BASE_URL | yes | Cloud: https://<site>.atlassian.net/wiki. Server: https://confluence.corp.example.com. |
CONFLUENCE_API_TOKEN | yes | Cloud API token or Server PAT. |
CONFLUENCE_EMAIL | Cloud only | Atlassian account email. |
CONFLUENCE_FLAVOR | no | cloud or server. Auto-detected from URL host when unset. |
Populate any tier by running credential-setup skill.
~/.agentbundle/credentials.env
(mode 0600 on POSIX; DACL-restricted on Windows), the OS keyring,
or process environment variables.
Never read that file, print it, or echo the token.--token / --api-token / --bearer /
--pat / --password and exits — do not work around it.--check reports missing or invalid creds, tell the user to run
credential-setup skill themselves.
It's interactive — do not run it for them.CONFLUENCE_BASE_URL is user-configured. Before invoking the
crawler, verify the configured URL resolves to a known Confluence
host (e.g. *.atlassian.net for Cloud, the organisation's known
on-premises host for Server) — not to a private IP range
(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8)
or a cloud-metadata endpoint (169.254.0.0/16). If the user
supplies an unexpected host, stop and ask them to confirm before
running. This is an agent pre-flight check: the scripts validate
only the URL scheme (http:// or https://), not the resolved host
or IP range. On the token path follow_redirects=True is active, so
verify the initial host before invoking.This skill is dual-auth (auth: sso-cookie with a creds fallback): on a
Data Center instance behind corporate SSO it authenticates by a captured web
session (cookie jar) resolved through the sso-broker; everywhere else it uses
the token (creds) path above. On the SSO-cookie path:
0600 store; the skill
reads it in-process via the credbroker resolver, which returns a path, not
the bytes. Never read the jar file directly, print its contents, or echo
cookie values.Authorization header on this path.python scripts/setup_sso.py (which drives sso-broker register) themselves —
it opens a browser for interactive sign-in, so do not run any setup helper for
them.Check Python dependencies are installed. If not, install them:
python -m pip install -r requirements.txt
Then verify connectivity:
python scripts/crawl_space.py --check
credential-setup skill (interactive — they run it, not you). Stop here.The CLI uses a banded exit-code contract; read the stderr message for the specific cause, then act on the band:
| Exit | Band | What to do |
|---|---|---|
| 0 | success | proceed |
| 1 | functional error — bad/missing args, server 5xx, transport, a partial crawl (some pages failed), keychain hard-fail, unexpected | surface the message; for a partial crawl the per-page failures are in the log — report them, don't loop |
| 2 | user must act — credentials missing/invalid/expired, 401/403 | tell the user to run credential-setup themselves (do not run it for them), then re-run --check |
| 130 | interrupted (Ctrl-C) | the run was cancelled; nothing to fix |
Tier2HardFailError (OS keyring unavailable) or an unprojected shim surface as
exit 1 with a message naming the cause.
Invoke the crawler with the user's arguments. Only these flags are supported:
| Flag | Meaning |
|---|---|
--space KEY | Space key, e.g. ENG. Required. |
--root PAGE_ID | Start from a specific page (default: space homepage). |
--depth N | Max hierarchy depth from root (default: unlimited). |
--output DIR | Output directory (default: ./confluence-out). |
--force | Re-fetch and overwrite all pages, ignoring frontmatter version. |
--no-attachments | Skip attachment downloads. |
--concurrency N | Parallel requests (default: 4). |
--min-delay-ms N | Minimum ms between requests (default: 100). |
--insecure | Disable TLS verification. Only if the user explicitly asks. |
--verbose | Debug logging. |
Example:
python scripts/crawl_space.py --space ENG --depth 3 --output ./out
The script writes:
<output>/<slug>.md per page, flat layout. Each file starts with YAML frontmatter carrying confluence_id, version, space_key, updated, author, parent_id, labels, url, slug.<output>/attachments/<page_id>/<filename> for downloaded attachments.The final log line reports wrote N pages (failed: X, skipped: Y). Relay this to the user. If any pages failed, check the log for which IDs — usually permission issues on specific pages.
The script is idempotent. On re-run:
version.number against the version field in the existing .md frontmatter.--force to bypass the version check and re-fetch everything.code, info, warning, note, tip, panel, expand, status) are converted to Markdown equivalents. Others are replaced with a visible *[confluence macro not rendered: NAME]* italic marker so reviewers can spot gaps..md paths. Links to pages outside the crawl set remain absolute Confluence URLs.~/.agentbundle/credentials.env from skill body.credential-setup skill non-interactively or pipe the PAT into it.--insecure is safe to add by default. Only when the user explicitly says they accept it./wiki: if the user's config somehow has https://foo.atlassian.net without /wiki, API calls will 404. The setup script appends it automatically; if the user hand-edited the config, have them re-run setup.--root PAGE_ID. Relay this to the user.--root for each, or request a future "full-space" mode.<old-slug>.md file remains on disk — the new run writes <new-slug>.md because slugs derive from the current title. Warn the user that old files may linger and let them clean up..part tempfile pattern prevents half-written .md files. Re-running resumes cleanly.