99problems is an AI-native CLI tool for issue and pull-request context retrieval across GitHub, GitLab, Jira, and Bitbucket.
It supports structured output for AI agents and direct human usage, with machine-readable formats (json, yaml, jsonl/ndjson) and a human-readable text format.
Software tasks often depend on decisions made in earlier issues and pull requests.
99problems helps recover that history in a consistent shape so current work can be grounded in prior context.
This is useful for Agentic Engineering workflows and for humans doing direct investigation in terminals or scripts.
Install the CLI:
npm install -g @mbe24/99problems
# or
cargo install problems99Initialize the canonical 99problems Agent Skill scaffold:
# initialize the canonical 99problems skill in the current project
99problems skill init
# or use the global skill location (shared across projects)
99problems skill init --path ~/.agents/skillsThere are two primary ways to use 99problems. Refer to Agentic Use for AI-assisted workflows, or Manual Use for direct CLI usage.
Now that the skill is installed, start your agent session. Use it to retrieve cross-system context for concrete engineering tasks like topic mapping, bug triage, and progress estimation.
To map work related to a topic across issues and PRs (with explicit skill invocation):
llm-prompt> Use $99problems find related issues and PRs for topic "architectural redesign"
To produce a bug-focused status overview for a repository (with implicit skill invocation):
llm-prompt> Create an overview of open bugs and cross-reference them with active PRs in owner/repo.
To estimate delivery progress from linked tracker and PR state:
llm-prompt> Estimate progress for topic "build modernization" based on linked issues and PR states.
Use this when you run 99problems directly in a terminal to fetch context from specific providers.
# Fetch one GitHub issue
99problems get --repo schemaorg/schemaorg --id 1842
# Fetch one PR with inline review comments
99problems get --repo github/gitignore --id 2402 --type pr --include-review-comments
# Search GitLab issues
99problems get --platform gitlab -q "repo:veloren/veloren is:issue state:closed terrain"
# Fetch Jira issue by key
99problems get --platform jira --id CLOUD-12817
# Fetch Bitbucket Cloud PR by ID
99problems get --platform bitbucket --deployment cloud --repo workspace/repo_slug --id 1 --type pr
# Fetch Bitbucket Data Center PR by ID
99problems get --platform bitbucket --deployment selfhosted --url https://bitbucket.mycompany.com --repo PROJECT/repo_slug --id 1
# Stream as JSON Lines for pipelines
99problems get -q "repo:github/gitignore is:issue state:open" --output-mode stream --format jsonl99problems get [OPTIONS] Fetch issue and pull request conversations
99problems skill init [OPTIONS] Scaffold the canonical Agent Skill
99problems config <SUBCOMMAND> Inspect and edit .99problems configuration
99problems completions <SHELL> Generate shell completion scripts
99problems man [OPTIONS] Generate man pages (stdout or files)
Global options:
-v, --verbose Increase diagnostics (-v, -vv, -vvv)
-Q, --quiet Show errors only
--error-format <FMT> Error output: text|json (default: text)
-h, --help Print help
-V, --version Print version
99problems uses instance-based TOML config from:
~/.99problems./.99problems
Example:
default_instance = "work-gitlab"
[instances.github]
platform = "github"
repo = "owner/repo"
token = "ghp_your_token"
[instances.work-gitlab]
platform = "gitlab"
url = "https://gitlab.mycompany.com"
repo = "group/project"
token = "glpat_your_token"
[instances.work-jira]
platform = "jira"
url = "https://jira.mycompany.com"
repo = "project"
token = "atlassian_api_token"
account_email = "user@example.com"
[instances.bitbucket-cloud]
platform = "bitbucket"
deployment = "cloud"
repo = "workspace/repo_slug"
token = "username:app_password"
[instances.bitbucket-dc]
platform = "bitbucket"
deployment = "selfhosted"
url = "https://bitbucket.mycompany.com"
repo = "project/repo_slug"
token = "pat_or_bearer_token"Bitbucket support is pull-request only; when --type is omitted, 99problems defaults to PRs.
For Bitbucket Cloud, use an app-password, repository access token, or workspace-level access token (premium feature) in token.
Selection order: --instance -> single configured instance -> default_instance.
[telemetry]
enabled = true
otlp_endpoint = "http://localhost:4318/v1/traces"
exclude_targets = ["h2", "hyper", "hyper_util", "rustls"]Telemetry is best-effort and traces 99problems get without changing normal command behavior or exit codes. For quick local OpenTelemetry backend setup, use Grafana LGTM (Docker image: grafana/otel-lgtm).
Use telemetry.exclude_targets to suppress noisy span-target prefixes (prefix match). Equivalent config command:
99problems config set telemetry.exclude_targets h2,hyper,hyper_util,rustlsNote that telemetry export requires a build with the telemetry-otel feature enabled:
telemetry-otelcontrols whether OTEL support is compiled in.- Default builds include it.
- Use
--no-default-featuresfor telemetry-free release binaries.
get supports two orthogonal controls:
--format:json,yaml,jsonl,ndjson(alias ofjsonl),text--output-mode:auto,batch,stream(or--stream)
Payload controls:
--no-comments: skip issue/PR comments--include-review-comments: include inline review comments (for PRs)--no-links: skip linked-issue/PR metadata
Defaults:
- TTY stdout:
--format text,--output-mode auto(resolved to streaming) - piped stdout / file output:
--format jsonl,--output-mode auto(resolved to streaming)
Use --output-mode batch when you want all-or-nothing output at the end.
99problems completions bash
99problems completions zsh
99problems completions powershellProject documentation is available at 99problems.readthedocs.io.
Public docs source lives in docs/. Internal-only notes belong in docs/internal/ and are excluded from the published site.
Generate and print root man page:
99problems manGenerate all pages to disk:
99problems man --output docs/man --section 1If 99problems saves you time, you can support ongoing maintenance via GitHub Sponsors or Ko-fi.
See CONTRIBUTING.md.
See LICENSE.
Copyright (c) 2026 Mikael Beyene