Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
bd3a4e4
feat(support): add support report command
zfarrell Sep 5, 2026
235fac8
docs: document support report command
zfarrell Sep 5, 2026
a70c509
fix(support): post to api_url, send workspace as a header
zfarrell Sep 5, 2026
2a14857
style(support): drop trailing period from fallback error message
zfarrell Sep 5, 2026
4009d95
fix(support): reject over-long subjects client-side
zfarrell Sep 5, 2026
113bc66
fix(util): mask_credential no longer panics on non-ASCII
zfarrell Sep 5, 2026
d6e8197
fix(support): redact a Bearer token anywhere on a log line
zfarrell Sep 5, 2026
78a0bd8
fix(support): surface server text on an uncoded error status
zfarrell Sep 5, 2026
2ad0cd0
fix(support): never probe the network to resolve a workspace default
zfarrell Sep 5, 2026
ddef38f
fix(support): persist an editor-composed report on a failed send
zfarrell Sep 5, 2026
1b51214
test(support): drive the retry test with a zero-delay seam
zfarrell Sep 5, 2026
0a2bc9a
fix(support): bound non-Bearer header redaction to the token only
zfarrell Sep 5, 2026
684f7a8
fix(support): don't interpolate user text into the re-file hint
zfarrell Sep 5, 2026
5506b93
test(support): rename a test fixture token flagged by aikido
zfarrell Sep 5, 2026
ba5a601
fix(support): never lose an editor-composed report
zfarrell Sep 6, 2026
e5aedc4
fix(support): confirm attached logs in the output
zfarrell Sep 6, 2026
9ebb139
fix(support): give each saved draft a unique name
zfarrell Sep 6, 2026
2c336d7
fix(support): show progress while filing a report
zfarrell Sep 6, 2026
f5f1903
fix(support): rescue a composed report with no body
zfarrell Sep 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,20 @@ Bring your own model with `hotdata search embeddings add`.
- `hotdata databases context push|show DATAMODEL` stores your data model as
shared, server-side Markdown so humans and agents query with the same map.

## Getting help

File a support ticket without leaving the terminal:

```sh
hotdata support report -m "Queries against work_abc have been timing out for an hour" --subject "Queries timing out"
hotdata support report --logs ./stderr.txt --context env=staging
```

Omit `-m` in an interactive terminal to compose the report in `$EDITOR` instead. Replies go to the email on your HotData account.

## Commands

The full command surface. The top level has eight groups — `auth`, `workspaces`, `databases`, `query`, `jobs`, `ingest`, `search`, and `manage`. Run `hotdata <command> --help` for full flags on any command.
The full command surface. The top level has nine groups — `auth`, `workspaces`, `databases`, `query`, `jobs`, `ingest`, `search`, `manage`, and `support`. Run `hotdata <command> --help` for full flags on any command.

| Command | What it does |
| :-- | :-- |
Expand Down Expand Up @@ -203,6 +214,7 @@ The full command surface. The top level has eight groups — `auth`, `workspaces
| `manage skills install` | Install/update the agent skill into agent directories |
| `manage skills status` | Show the agent skill's installation status |
| `manage skills list` | List installed skills (alias for `status`) |
| `support report` | File a support ticket with the HotData team |

## Configuration

Expand Down
10 changes: 9 additions & 1 deletion skills/hotdata/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ Catalog, skill decision tree, epic flows (onboard, chain, retrieval), and instan

## Available Commands

Top-level subcommands (each detailed below): **`auth`**, **`query`**, **`workspaces`**, **`databases`**, **`jobs`**, **`ingest`**, **`search`**, **`manage`**. Instant databases nest `databases tables`, `databases queries`, `databases results`, and `databases context`; `ingest` nests `ingest sources`, runs, and logs; `manage` nests `usage`, `completions`, `upgrade`, and `skills`. Search (bm25/vector), indexes, and embedding providers are documented in **`hotdata-search`**; query history, results, Chain, and OLAP patterns in **`hotdata-analytics`**.
Top-level subcommands (each detailed below): **`auth`**, **`query`**, **`workspaces`**, **`databases`**, **`jobs`**, **`ingest`**, **`search`**, **`manage`**, **`support`**. Instant databases nest `databases tables`, `databases queries`, `databases results`, and `databases context`; `ingest` nests `ingest sources`, runs, and logs; `manage` nests `usage`, `completions`, `upgrade`, and `skills`; `support` nests `report`. Search (bm25/vector), indexes, and embedding providers are documented in **`hotdata-search`**; query history, results, Chain, and OLAP patterns in **`hotdata-analytics`**.

Global CLI options: **`--api-key`**, **`-v` / `--version`**, **`-h` / `--help`**, **`--no-input`** (disable interactive prompts; commands that require input will error instead — useful in CI or non-TTY environments). Hidden developer flag: **`--debug`** (verbose HTTP logs).

Expand Down Expand Up @@ -424,6 +424,14 @@ hotdata auth logout # Remove saved auth for the default profile

`login` and `register` (both GitHub and `--email`) are **browser-based** PKCE flows: the CLI opens a browser and waits on a local callback to complete sign-in/sign-up — account details (email/password) are entered in the browser, not via CLI flags. They require a browser and an interactive terminal, so they do **not** work under `--no-input` or in headless/CI. For automation, authenticate once interactively, then use the saved session or `HOTDATA_API_KEY`.

### Report a problem (`support report`)

```
hotdata support report -m "<body>" --subject "<subject>" [--kind bug|question|billing|feature|account|other] [--severity urgent|high|medium|low] [-w <workspace_id> | --no-workspace] [--logs <path>|-] [--context KEY=VALUE ...] [-o table|json|yaml]
```

Files a support ticket via the API — no browser needed. `-m`/`--subject` are required together for non-interactive use (agents: always pass both); omit both in an interactive terminal to compose in `$EDITOR` instead. Attaches the active workspace by default (`--no-workspace` to omit, `-w` for a specific one); `--logs` reads a file or `-` for stdin (cap 256 KiB); `--context key=value` adds extra diagnostic pairs (repeatable, max 20). Prints the ticket's `public_id` on success — replies go to the email on the HotData account, not to the CLI.

## Workflows

End-to-end recipes — onboard a workspace, run a query, build an instant database (parquet), chain/materialize, add retrieval indexes — live in [references/WORKFLOWS.md](references/WORKFLOWS.md). The command sections above are the per-command reference; the workflows stitch them into sequences.
7 changes: 7 additions & 0 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::commands::jobs::JobsCommands;
use crate::commands::query::QueryCommands;
use crate::commands::search::SearchCommands;
use crate::commands::skill::SkillCommands;
use crate::commands::support::SupportCommands;
use crate::commands::workspace::WorkspaceCommands;
use clap::Subcommand;

Expand Down Expand Up @@ -143,6 +144,12 @@ pub enum Commands {
#[command(subcommand)]
command: ManageCommands,
},

/// Get help — file a support ticket with the HotData team
Support {
#[command(subcommand)]
command: SupportCommands,
},
}

/// Subcommands for `hotdata manage` — account and CLI utilities.
Expand Down
1 change: 1 addition & 0 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ pub mod ingest;
pub mod jwt;
pub mod raw_http;
pub mod sdk;
pub mod support;
2 changes: 1 addition & 1 deletion src/client/sdk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ pub fn none_if_404<T>(r: Result<T, ApiError>) -> Result<Option<T>, ApiError> {
/// url through verbatim would produce `/v1/v1/...` on every call. Strip one
/// trailing `/v1` (and any trailing slash) so both paths resolve to a single
/// `/v1`.
fn sdk_base_path(api_url: &str) -> String {
pub(crate) fn sdk_base_path(api_url: &str) -> String {
let trimmed = api_url.trim_end_matches('/');
trimmed.strip_suffix("/v1").unwrap_or(trimmed).to_string()
}
Expand Down
Loading
Loading