All notable changes to the Huly CLI are documented in this file.
The format is loosely based on Keep a Changelog, and this project adheres to Semantic Versioning.
huly issue create/issue updateauto-seed the 5 platformTypeIssuePriorityrecords (HULY-7). When the workspace has zerotracker:class:TypeIssuePriorityentries (e.g. self-hosted installs created withINIT_REPO_DIR=/no-init-scriptsin theworkspaceservice),resolvePrioritynow seedsUrgent / High / Medium / Low / NoPriorityintocore:space:Modelbefore resolving--priority. Self-healing. Gated by--minimal/HULY_OPINIONATED=0(the existing opinionated-defaults master switch). Aliases--priority Normal→Mediumand--priority None→NoPriorityare accepted for backward compatibility with the old--priorityhelp text. Verified againsthuly.aaravlabs.com(workspaceLife): auto-seeded all 5 priorities,--priority Highresolved,--priority Normalresolved toMedium,issue update --priority Urgentupdated correctly,--minimalstill throws CLI-13 on bogus names.huly signup— new command to create an account on the Huly server. Accepts--headless(use env vars only, no prompts) and--create-workspace <name>to create a workspace as part of signup. The interactive mode prompts for a workspace name by default and sets it as active. (#signup)- Phases 11, 14, 15, 16 of the 18-phase parity plan are now implemented:
- Phase 11 — Spaces / Associations / Relations / Task management:
huly space,huly space-type,huly association,huly relation,huly project-type,huly task-type,huly issue-status(sub-resources for the 18-phase parity plan). Space membership add/remove, owner-set, and permissions list all work end-to-end against the live Huly server. - Phase 14 — Activity:
huly activity list/get/pin,react --add/--list/--remove,reply add/list/update/delete,saved save/list/unsave,mentions. All paths round-trip against the live Huly server. - Phase 15 — Notifications:
huly notification list/get,mark-read/unread/mark-all-read,archive/unarchive/delete,unread-count,contexts list/get/pin/hide,subscribe/unsubscribe,types,settings list/update.providersis currently broken server-side (seedocs/issues.md§3.8). - Phase 16 — Approvals:
huly approval list/get,request,comment,approve,reject,cancel,delete. The full lifecycle — request → comment → approve (statusCompleted), request → reject (statusRejected), request → cancel (statusCancelled) — was verified against the live Huly server.
- Phase 11 — Spaces / Associations / Relations / Task management:
huly card create --parent <ref>— sub-cards can now be created via the CLI;parentInfois built from the parent's chain. (#parentInfo)
huly issue createreturned an off-by-one id in the bypass path. The bypass helper usedtx._idinstead oftx.objectId. SinceTxFactory.createTxCreateDoccallsgenerateId()twice — once for the tx's own_idand once for theobjectId(when no id is passed) — the two are consecutive counter values, and the local SDK was returning the earlier one. Consequence: every issue was created with an id that didn't match the actually-stored_id, and any subsequentresolveRefon the returned id failed. The smoke test had to fall back to list-by-title matching. Fixed: the bypass path now returnstx.objectId. (#1.9)huly issue createdid not setnumberoridentifier. The server'sOnIssueUpdatetrigger only computes parent estimations, never the sequence. The reference front-end (CreateIssue.svelte:465-477) is the only place that did the$inc: { sequence: 1 }+identifier = ${ project.identifier}-${number}dance. The CLI now mirrors that step, sohuly issue createreturnsTSK-1,TSK-2, etc. andhuly issue get TSK-1resolves. (#1.10)huly project createdid not setdefaultTimeReportDay,defaultIssueStatus, ordefaultAssignee. TheProjectinterface declares all three as required-ish; the front-end'sCreateProject.svelte:133-137always sets them. The CLI now sets them too. (#1.11)huly issue createhardcodeddata.kind = 'tracker:issue:default'. Custom task-type projects don't have a default-issue ref. The CLI now queries the project's firstTaskTypeand falls back to the hardcoded id only if the project has none. (#1.12)huly activity savedusedaddCollectionforSavedMessage;SavedMessageextendsPreference, notAttachedDoc, so the wrong space was used. Switched tocreateDoc/removeDocagainst the message's own space. (#1.13)huly whoamireported the first cached account on the URL, not the one specified by the env vars. The CLI now prefersenv.emailover the cached account when resolving identity. (#1.14)huly issue create --parent <ref>only setdata.parent, leaving theparentsancestor array as[]. Sub-issue hierarchies were broken for any client not mirroring the front-end. The CLI now walks the parent'sparentsarray and prepends the immediate parent. (#1.15)huly issue createhuman output printed the raw UUID instead ofTSK-1. Now re-fetches the issue to display the assigned identifier, and falls back to the UUID if the local server hasn't assigned one. (#1.10)
scripts/smoke.shphase 11 no longer has thesleep 1+ list-by-title workaround for the ID race. IDs returned fromissue createnow match the stored_id(see "Fixed" above). (#1.9)scripts/smoke.shphase 9 (calendar) bootstrap logic was rewritten to usejq 'length'on the calendar list instead ofgrep -q ., which matched the table title "calendars" and never triggered the create. The smoke-cal cleanup is now wrapped inset +e/set -eso any best-effort failure doesn't abort the all-mode wrapper. (#smoke)docs/issues.mdupdated to reflect the new fixes (§1.9–§1.17 in the CLI-side bugs table) and the new server-side findings (§3.7OnIssueUpdatecrash ontargetParents, §3.8NotificationProviderno domain, §3.9 noOnIssueCreatetrigger /Identifiertyped attribute pattern, §3.10core:class:Associationlist empty).
huly notification providerserrors withdomain not found. Server-side: theNotificationProviderclass has no domain registered (seedocs/issues.md§3.8).huly association listshows(no associations)after a successfulcreate. Server-side: thecore:class:Associationclass isn't bound to a queryable domain (seedocs/issues.md§3.10).bash scripts/smoke.sh all(the all-mode wrapper) exits silently around phase 9, even thoughbash scripts/smoke.sh 9standalone passes and all other phases (0–8, 10–16) pass individually. The wrapper, not the phases, needs investigation. Seescripts/smoke.shline ~281 (theset +e/set -earound the smoke-cal cleanup is a partial mitigation; the real fix is in the wrapper's pipefail handling). (#smoke)