Repository navigation
0.1.0 - 2026-09-15
Release Notes
Added
-
Versioned release builds (CLI-27): pushing a version tag (
vX.Y.Z) now
triggers a cargo-dist release pipeline that builds, smoke-tests, and
publishes archives for the supported platform matrix — Linux glibc x64 and
arm64 (.tar.gz), macOS Intel and Apple Silicon (.tar.gz), and Windows
x64 (.zip), each with a sha256 checksum. The pipeline fails closed when
the tag, the workspaceCargo.tomlversion, and the matching
CHANGELOG.mdrelease section disagree, and runs artifact-level smoke
tests (the released binary itself:--help,version, and an offline
doctor --local-only) before anything is published. Pull requests
validate the release configuration in plan mode only. See
design/RELEASE.mdfor the target matrix, exclusions, and maintenance
workflow. -
hamstik versionnow reports build identity: human output adds
commit(short source commit) andtarget(Rust target triple) lines
under the banner, and--jsonoutput adds additivecommit(full
commit sha, or"unknown"when built outside a git checkout) and
targetfields. The existingversionfield and thehamstik --version/-Vterse line are unchanged. -
context explain(CLI-12): an offline precedence report for every resolved
setting — host, Organization, Project, profile, credential source, and
color/input/retry behavior — showing the winning source, every shadowed
source, and context-file discovery. JSON output uses stable source/status
enums; HAMSTIK_TOKEN and stored credentials are represented only as
present/absent, never displayed. Malformed context files degrade the report
rather than aborting it (context). -
SqueakQL query files and saved queries (CLI-8):
squeakql validateand
work searchaccept--file <PATH>(-= stdin) alongside the existing
inline expression, with multi-source conflicts rejected at parse time and
one trailing newline stripped (all other content verbatim). A local
saved-query store (queries.tomlnext to the config; plain expressions
only, never credentials) withsqueakql list|show|save|delete, name
validation, and--saved <NAME>on validate/search. Validation JSON
preserves the full Public API response including error spans; read-only
SqueakQL POSTs carry no Idempotency-Key (squeakql,work). -
Editor authoring and consistent stdin conventions (CLI-7):
--description-editor/--body-editorlaunch$VISUAL(then$EDITOR,
then a platform default) on a secure owner-only temporary file removed on
every exit path; unchanged or empty content cancels the command without
sending. Source conflicts (inline + file + editor) fail at argument-parse
time.--no-inputrejects editor authoring immediately. Text content is
preserved verbatim (Unicode, Markdown#headings, final-newline
semantics) (work,project). -
Work Item watcher commands backed by the newly additive Public API
operations (getWorkItemWatcher,updateWorkItemWatcher):work watcher show|watch|unwatch|mute|unmutereport and change the authenticated user's
own watcher state (never other watchers'). Actions are idempotent
(Idempotency-Key, replay note) and carry no revision guard; the
operations are classified as Complete inopenapi/api-parity.jsonwith
client and CLI wire tests (work). -
Coherent PAT onboarding and troubleshooting journey:
auth status --jsonnow
reports credential type/name, expiry, the credential source (environment vs
credential store), and a structured scope inventory; near-expiry credentials
warn within 14 days on every authenticated run, and client-detected expiry
failsauth statuswith the stable authentication exit code.mesurfaces
the same expiry summary and scope inventory. Structured 401/403 failures
preserve code/status/request ID with CLI-added remediation
(auth,me,doctor). -
README examples verification harness (
scripts/readme_examples.py, guarded by
the Rustreadme_examplescontract test incargo test): every executable
README shell block is classified (parse-only, mock, prose) and verified
against the actual binary; untestable prose blocks are explicitly exempted,
so examples cannot drift from real flags, enums, or output conventions.
Run the harness withpython3 scripts/readme_examples.py --verboseafter
cargo build --release. -
Bulk operations preflight: operation files are validated locally (JSON syntax,
typed envelope, per-operation required fields, unknown fields, enum spellings,
revision constraints, 1–50 count) before any request, with diagnostics naming
the failing operation index and field path. Human bulk output states the
selected concurrency mode, summarizes succeeded/failed counts, and prints
actionable per-failure details with server request ids; JSON preserves all
documented per-operation fields. Stdin and file inputs behave identically
(work). -
doctor --local-onlyverifies configuration, context resolution, profile
selection, credential-store accessibility, terminal behavior, and bundled
compatibility metadata with zero network traffic; remote checks are reported
as skipped, making the output safe for support bundles. Doctor now classifies
network failures by failing stage (DNS, TCP connection, proxy, timeout, TLS)
with stage-specific remediation and per-check latency, reports PAT expiration
(expired / within 14 days / healthy) and scope readiness, and prints a final
pass/warn/fail/skipped summary in human and JSON modes (doctor). -
Deep parsed-OpenAPI schema parity guards: parameters, header parameters
(If-Match,Idempotency-Key), request/response content types (multipart
uploads, binary avatar downloads), response status codes, component schema
drift (required/optional/nullable, enums, formats, property removals), and
bulk envelope bounds are checked structurally against the checked-in
snapshot, with additive changes classified separately from breaking drift
and failures naming the operation or JSON pointer (openapi). -
Global
--dry-runflag for mutation commands (work create/edit/transition/start/close/ archive/unarchive/delete,work label add|remove,work attachment upload|delete,
work comment add|edit|delete,work link add|delete,work bulk create|update|transition,
project create/edit/archive/unarchive,sprint create/transition,label create).
The CLI resolves identifiers and validates local input exactly as a real invocation
would, then emits a versioned preview (previewVersion: 1) with method, path template,
resolved path, sanitized header intent (If-Match,Idempotency-Key— never
Authorization), and the typed request body, without sending any mutation request or
consuming an idempotency key. Read commands reject the flag with a usage error
(work). -
Canonical portable Hamstik Agent Skill at
skills/hamstik/SKILL.md, covering
credential-safe CLI usage, explicit context discovery, deterministic output,
concurrency-aware mutations, Work Item workflows, user/Org member resolution,
bulkupdate/transitionconcurrency modes, and structured failure handling. -
Full support for the current 53-operation Hamstik Public API v1 contract,
includingme, first-classwork mine/work my, SqueakQL search via
work search, independentsqueakql validate, and unauthenticated
api openapicontract retrieval. -
Parsed OpenAPI parity enforcement through
openapi/api-parity.json; adding,
removing, or moving an operation now fails a test until client, CLI, and test
support are deliberately classified. -
scripts/update-openapi.sh --check|--updatefor explicit live-contract drift
checks and validated byte-for-byte snapshot refreshes without making offline
builds network-dependent. -
Typed API client crate (
hamstik-api-client) with bearer injection,
retry policy withRetry-Afterawareness, idempotency-key generation,
ETag capture, cursor pagination helpers, and multipart upload support. -
Frozen Hamstik Public API v1 OpenAPI snapshot (
openapi/hamstik-v1.json)
as the development contract. -
auth login --with-token,auth status,auth list,auth switch,
auth logout, andauth forgetwith PAT storage in the OS credential
store (Windows Credential Manager, macOS Keychain, Linux Secret Service);
headless automation via theHAMSTIK_TOKENenvironment variable (auth). -
Working-context management:
context init,context show,context set,
context clear, backed by a project-local.hamstik.tomlplus global
profile defaults (context). -
Organization and project commands:
org list|view|use,
project list|view|create|use(org,project). -
Work item commands:
work list|view|create|edit, status transitions
(work transitions,work transition,work start,work close),
comments (work comment list|add|delete), labels
(work label add|remove), and attachments
(work attachment list|upload|download|delete) (work). -
Sprint commands:
sprint list|view|create|transitions|transitionwith
completion actions (--move-to-backlog/--move-to-sprint) and Sprint
ETag handling (sprint). -
Project label management:
label list|create(label). -
Work item list filters, including
label,labelName,parent,
topLevel,sprint, andupdatedAfter. -
Machine-facing output:
--json/--quietglobal modes, stable exit
codes (SPEC §52), raw API body echo in--json, and an ANSI-free JSON
failure envelope on stderr. -
Dependency-aware diagnostics:
hamstik doctorreports configuration and
context sources, credential source/store health, proxy presence,
network/TLS reachability, live OpenAPI availability and compatibility,
authentication, selected Organization/Project validity, and terminal
rendering. JSON checks have stable IDs and explicit
pass|warn|fail|skippedstatuses while retaining the originalokand
criticalfields (doctor). -
Shell completion scripts via
hamstik completion <shell>(completion). -
Terminal identity banner on root help and version surfaces (
version). -
Compatibility contract test suite (
crates/hamstik-cli/tests/contract.rs)
guarding the documented stable surfaces: command hierarchy, subcommand
sets, aliases, global options, enum spellings, the JSON failure envelope,
stable exit codes (0–10), stdout/stderr separation, quiet/no-input
behavior, pagination envelopes, sparse-field forwarding, mutation
revision/replay metadata, binary-download safeguards, and context
precedence. README documents which surfaces are stable and how breaking
changes are communicated. -
Project and label colors render as bracketed swatches (
[██]) in
project list,project view,label list, and label detail views. The
block glyphs are painted in the resource's actual color (truecolor with an
xterm-256 fallback); the bracket frame and hex text stay in plain
foreground so extreme colors such as black-on-black remain legible.
Color-disabled and--jsonoutput are unchanged. -
work comment list --exclude-deletedhides soft-deleted comments instead of
rendering(deleted)placeholders (work comment). -
The API client captures the documented
RateLimit-Limit/
RateLimit-Remaining/RateLimit-Resetheaders on responses and errors.
A successful request that leaves the window depleted waits out the reset
(capped at the same 30 s bound asRetry-After) instead of sending the
next request straight into a guaranteed429.
Changed
- Refreshed the frozen OpenAPI snapshot from the live authoritative contract
(51 → 53 operations) and aligned required/nullable response fields, bulk
request operation types, profile avatar selectors, Work Item parent input,
and Work Item label assignment by id or name. - My Work and user-profile Work commands expose every filter defined by their
respective current operations, including repeated array parameters, sparse
fields, due-date filters, archived state, and opaque cursors. - Binary download metadata now preserves content type, content length,
content disposition, cache control, and request id where the operation
defines them; JSON output contains metadata only, never binary bytes. - API errors retain
fieldErrors,details, and request ids. Human errors
always print the correlation id when available; JSON preserves the complete
structured error information. Meidentity output includespublicIdand per-Organizationusername;
auth statusreports both in human and JSON output.- Authentication field names match the deployed API specification
(authenticationcontext inGET /me). - Table rendering pads columns by visible width, so cells containing ANSI
escape sequences (color swatches) no longer break column alignment. - Retry/backoff is now implemented once in the API client and shared by JSON,
void, binary, and multipart sends instead of four near-identical loops.
Changed (API sync)
The frozen OpenAPI snapshot was refreshed against the updated Hamstik Public
API v1 (29 → 51 operations; all changes additive):
- Project lifecycle:
project edit,project archive,project unarchive,
andproject list --archived; Project projections now carryrevisionand
archivedAt, and edits use theproject-NETag (project). - Work Item lifecycle:
work archive,work unarchive, and
work delete [--cascade]with Work Item ETag protection (work). - Work Item links:
work link list|add|deletewith theblocks,
blocked_by, andrelatesrelations; new 409 codesLINK_DUPLICATEand
LINK_CONTRADICTIONmap to the conflict exit code (work link). - Activity feeds:
work activity,project activity, and
user activity, all paginated (--sincesupported) (work,project,
user). - Comment editing:
work comment edit(author-only; responses carry
editedAt) (work comment). - Bulk operations:
work bulk create|update|transitionaccepting 1–50
operations per request from a JSON file or stdin, with per-item embedded
results andrequire-revision/last-write-winsconcurrency modes
(work bulk). - Member directory:
org membersoverGET /organizations/{slug}/users
(org members). - Organization Work and My Work collections:
org worklists Work Items
across the organization with Project context;--minesends
assignee=me(org work). - User profiles:
user view,user work,user activity, and
user avatarover theprofile:readendpoints; profiles expose only
public data (publicId, shared Organization usernames, visibility-scoped
stats) (user). - Work Item filters extended with
overdue,dueBefore,dueAfter,
sort(updated|dueDate|priority|rank),archived, and sparse
fieldsfieldsets onwork listandorg work. - Assignees now accept immutable public IDs (
usr_...) on create/edit,
mapped toassigneePublicId; legacy UUIDs keep usingassigneeId. user workdecodes the dedicated profile Work projection
(ProfileWorkItemList) and gained aREPORTERtable column; the
reporter is rendered from the complete projection and shows-when
absent or when a sparse fieldset omits it.- Refreshed the frozen OpenAPI snapshot (
openapi/hamstik-v1.json) for
the profile Work projection change. - Work Item list summaries are sparse-tolerant: only
id,key, and
revisionare guaranteed whenfields=is set; table rendering falls
back per column. - User summaries arrive in two shapes (
{id, name}legacy and
{publicId, name}public); the client decodes both, sowork archive,
work unarchive, label attach/detach, and comment edit responses render
correctly. - Work Item delete requests send an explicit
{"cascade": ...}body and
require thework-item:deletescope (Organization owners only). - Error exit mapping:
LINK_DUPLICATE,LINK_CONTRADICTION,
WORK_ITEM_ARCHIVED,WORK_ITEM_HAS_CHILDREN, andPROJECT_ARCHIVED
map to the conflict exit code (6).
Breaking (API sync)
work listgained shared filter flags via a flattened group; existing
flag names and semantics are unchanged.project listoutput gained aSTATEcolumn;project viewgained
revisionandarchiveddetail lines (0.x, pre-release).
Security
- Human-readable output now filters server-influenced text through a
control-sequence sanitizer that keeps only SGR color sequences and strips
every other escape/control character. Work Item titles, descriptions,
comments, and other resource content can no longer inject OSC/CSI sequences
(clipboard writes, cursor movement, title changes) into the user's terminal.
--jsonoutput is byte-faithful and relies on JSON escaping. - Upload (
work attachment upload) and bulk operations (--operations-file -)
now read stdin through the same streaming size caps as file inputs, so an
oversized or misdirected stream is rejected at the first excess byte instead
of being buffered whole.
Fixed
doctornow exits nonzero when a credential-store read fails, reports an
invalidHAMSTIK_TOKENonly once, distinguishes global configuration from
local context failures, preserves API error/request metadata, and avoids
interactive terminal samples in redirected output.work edit --parentandwork create --parentforward the current API's
bounded parent identifier directly so the server remains authoritative for
identifier resolution and validation (work).work label add|remove --labelaccepts a label name (case-insensitive;
labels are stored lowercase) in addition to a UUID. Attach-by-name uses the
current request body directly; detach-by-name resolves the id required by
the DELETE path (work label).--assignee meonwork create|editresolves to the caller'susr_public
ID viaGET /mebefore sending; the server only accepts ids on writes
(work).user view|work|activity|avataracceptmeas the target, resolving it the
same way (user).--hostno longer hides a profile's stored credential: the lookup tries the
selected host first, then the profile host recorded at login, and the
failure message names both hosts when both were tried (auth,doctor).- Human API errors always include
requestId;--verboseadditionally shows
the HTTP status, matching the structured information retained by--json
(output). - Interactive prompts are now disabled whenever
--jsonor--no-inputis
active (prompting additionally requires an interactive stdout, not just
stdin). Missing required values fail deterministically with exit 2 instead
of prompting (PRD §24/§30, SPEC §41;work create,sprint create,
project create,label create,auth login). auth loginno longer consumesHAMSTIK_TOKENand writes it to the OS
credential store. An environment token is ephemeral (SPEC §27, PRD §6.3);
persistence now requires an explicitauth login --with-token, and a set
HAMSTIK_TOKENproduces a clear usage error instead.auth switch --json,context init --json, andcontext clear --jsonnow
emit JSON on stdout;auth switchandcontext init|clearalso honor
--quiet. Previously they printed human text in--jsonmode, violating
the stdout contract.work edit --titleno longer conflicts with--clear-description; both may
be combined (work edit).- Retrying a
DELETEafter a transient failure no longer reports a false
NOT_FOUNDwhen the retry finds the resource already gone. A 404 on a
retry is treated as success (the desired end state holds); a first-attempt
404 still fails as before (work comment delete,work attachment delete,
work link delete,work delete). work link list --allandwork activity --allnow honor--limiton
every page, matchingwork list --all(work).- The
--archivedfilter on Work Item collections (work list,org work,
work mine,user work) andproject list --archivedis now documented
accurately: it selects only archived (true) or only unarchived
(false/omitted) resources rather than "including" archived items
alongside active ones. Serialization was already correct and unchanged;
users who need both states in one result must issue separate queries
(work,project).
Download hamstik-cli 0.1.0
| File | Platform | Checksum |
|---|---|---|
| hamstik-cli-aarch64-apple-darwin.tar.gz | Apple Silicon macOS | checksum |
| hamstik-cli-x86_64-apple-darwin.tar.gz | Intel macOS | checksum |
| hamstik-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| hamstik-cli-aarch64-unknown-linux-gnu.tar.gz | ARM64 Linux | checksum |
| hamstik-cli-x86_64-unknown-linux-gnu.tar.gz | x64 Linux | checksum |