Providers
PABLO talks to GitHub, Jira, Confluence and Linear through each service's own command-line tool. No API keys, no tokens in the configuration: every tool handles its own login, and when one isn't ready PABLO shows that tool's own message.
GitHub: gh#
Always required: pull requests and CI always go through GitHub, whatever the issue tracker. Log in once with gh auth login.
| Used for | Command |
|---|---|
| Issues | gh issue view/list --json, matched against the repository's remote |
| Finding the pull request | gh pr list --head <branch> --json number,title,state,isDraft,mergedAt,url |
| CI status | gh pr view <n> --json statusCheckRollup |
| Reviews and the “ready for review” time | gh api graphql (reviews, and READY_FOR_REVIEW_EVENT timeline items) |
| Draft / ready | gh pr ready <n>, gh pr ready <n> --undo |
| QA labels | gh api repos/<owner>/<repo>/issues/<pr>/events --paginate (labeled events) |
| Re-running CI | gh run list, gh run rerun |
| Login check | gh auth status |
Jira: acli#
Atlassian's own CLI. Log in once with acli auth login (a browser login); the same login covers Jira and Confluence. Run it again if Atlassian ever revokes access.
| Used for | Command |
|---|---|
| An issue | acli jira workitem view <KEY> --json --fields 'summary,status' |
| Your issues | acli jira workitem search --jql "project = <KEY> AND assignee = currentUser() ORDER BY updated DESC" --json --limit 50 |
| Comments (QA feedback) | acli jira workitem comment list --key <KEY> --json |
| Login check | acli jira auth status |
Every call has a 30-second timeout and shows acli's own error text when it fails.
Confluence: acli confluence#
Same tool, same login. Agents use it to read documentation pages an issue links to.
- A page:
acli confluence page view --id <id> --json --body-format storage. The body is Confluence's XHTML, passed as is: agents read it fine. - Spaces:
acli confluence space list --json. A project's optionalconfluence.spacetells agents where to look. - Both page URL shapes are understood (
…/wiki/spaces/<KEY>/pages/<id>and…/wiki?pageId=<id>), as well as a bare page id. - Login check:
acli confluence auth status, separate from Jira's so the doctor can tell you which one isn't ready.
Linear: linear#
Using schpet/linear-cli: linear issue view <KEY> --json, linear issue list --assignee <id> --json; the QA signal is a transition into your testing.failure_signal status in the issue's history; login check: linear auth status.
The doctor#
pablo system:doctor checks that each required tool is installed (on your PATH) and ready (logged in, using the tool's own status command), one line per check, and exits with an error if anything fails. Which tools are required depends on your projects:
| Tool | Required when | In the background job |
|---|---|---|
gh | always | hard: a failure stops the run |
opencode | agent_runtime is opencode (the default); checked with opencode --version | hard |
claude | agent_runtime is claude-code; checked with claude auth status | hard |
copilot | agent_runtime is copilot; checked with copilot --version (Copilot has no non-interactive login check) | hard |
orca | agent_backend is orca (the default) | soft: a warning |
openchamber | agent_backend is openchamber | soft |
acli (Jira) | a project uses Jira | soft |
acli (Confluence) | a project sets confluence.space | soft |
linear | a project uses Linear | soft |
In the background job, a soft failure only affects the projects using that tool; the others carry on. Each check is limited to 30 seconds, since orca can hang outside an interactive session.
Before the tools, the doctor checks that the agent settings can work at all: an unknown agent_runtime, or agent_backend: openchamber with agent_runtime: claude-code or copilot, is a ❌ config line, and the background job refuses to run with it.
The doctor also compares each installed agent in ~/.config/opencode/agents/ (or, under Claude Code, ~/.pablo/claude/agents.json, the agents, the command and the skill in ~/.claude/; under Copilot, the agent files and skills in ~/.copilot/) with a fresh render: ✅ fresh, ⚠️ stale (run pablo system:generate-agents), ❌ missing, broken link, or a file PABLO doesn't manage.