Repository navigation
Releases: BjarneSeger/forskap
Releases · BjarneSeger/forskap
Release list
v1.2.0
Immutable
release. Only release title and notes can be modified.
1.2.0 - 2026-10-08
Added
forskap issue createopens$VISUALor$EDITORon the description, after a picker of the project's GitLab issue templates where it has any.--template <NAME>names one up front,--no-editkeeps the create one-shot. The daemon syncs a project's issue and merge request templates.forskap queue listshows the writes still waiting in the retry queue, each with what it waits for, above the failed ones.forskap time log,close,assignandunassignsay when a write was only queued instead of reporting it as done.forskap statusandforskap auth statussay since when the daemon has no session, what the latest attempt to get one failed with and when the next comes, and whether it ends by itself or needs a login.forskap auth statusandforskap statussay when the daemon rotates the token, or why it doesn't, and warn while a rotated token hasn't reached the keychain.forskap sync jobssays what holds a job back whose turn has come: no session, the rate limit's pause, the job running ahead of it, no free slot. A job backing off still says why after a daemon restart.forskap sync refreshnames what was not synced again after the clear, and why.- A search provider for rofi:
forskap integration search-provider rofias a script mode (see the README). - The text views are coloured by role: titles, project paths, confirmations, warnings, dimmed URLs and timestamps. Pipes and
--color neverget the same text as before.
Changed
forskap queue list --output jsonis one object,{"queued": […], "paused_until": …, "failures": […]}; it was the bare array of failures.
Fixed
- A daemon started before the desktop session found the keyring locked and stayed logged out until a restart. It now waits and connects once the keyring is unlocked; writes made meanwhile are queued.
- The daemon no longer loses the keychain when the keyring service is replaced under it (a crash, a login starting its own).
- Completions of issue, merge request and epic numbers are scoped to the
--projector--groupon the line. - A daemon older than the CLI is reported as such instead of as a "Varlink Error".
forskap queue listgave the retry window of a failed write as "604800, seconds".
Interface: forskap-api 1.3.0, up from 1.0.0 — SearchOptions.match_all (1.1), GetDescriptionTemplates (1.2), GetQueue, queued in the write replies, dormancy in GetStatus and rotation in WhoAmI (1.3).
What's Changed
- feat: Search provider for rofi by @BjarneSeger in #92
- feat: colour the text views by role by @BjarneSeger in #94
- fix: scope completions to --project/--group by @BjarneSeger in #96
- feat: description templates and $EDITOR for issue create by @BjarneSeger in #97
- fix: wait for a locked keychain instead of giving up by @BjarneSeger in #99
- feat: say what holds a sync job back by @BjarneSeger in #100
- feat: queued writes, session and token rotation status (interface 1.3.0) by @BjarneSeger in #101
- ci: curated release notes, attested immutable releases by @BjarneSeger in #103
- test: Capture logs through one subscriber for the test binary by @BjarneSeger in #104
Full Changelog: v1.1.0...v1.2.0
v1.2.0-rc.1
Immutable
release. Only release title and notes can be modified.
Unreleased
Added
forskap issue createopens$VISUALor$EDITORon the description, after a picker of the project's GitLab issue templates where it has any.--template <NAME>names one up front,--no-editkeeps the create one-shot. The daemon syncs a project's issue and merge request templates.forskap queue listshows the writes still waiting in the retry queue, each with what it waits for, above the failed ones.forskap time log,close,assignandunassignsay when a write was only queued instead of reporting it as done.forskap statusandforskap auth statussay since when the daemon has no session, what the latest attempt to get one failed with and when the next comes, and whether it ends by itself or needs a login.forskap auth statusandforskap statussay when the daemon rotates the token, or why it doesn't, and warn while a rotated token hasn't reached the keychain.forskap sync jobssays what holds a job back whose turn has come: no session, the rate limit's pause, the job running ahead of it, no free slot. A job backing off still says why after a daemon restart.forskap sync refreshnames what was not synced again after the clear, and why.- A search provider for rofi:
forskap integration search-provider rofias a script mode (see the README). - The text views are coloured by role: titles, project paths, confirmations, warnings, dimmed URLs and timestamps. Pipes and
--color neverget the same text as before.
Changed
forskap queue list --output jsonis one object,{"queued": […], "paused_until": …, "failures": […]}; it was the bare array of failures.
Fixed
- A daemon started before the desktop session found the keyring locked and stayed logged out until a restart. It now waits and connects once the keyring is unlocked; writes made meanwhile are queued.
- The daemon no longer loses the keychain when the keyring service is replaced under it (a crash, a login starting its own).
- Completions of issue, merge request and epic numbers are scoped to the
--projector--groupon the line. - A daemon older than the CLI is reported as such instead of as a "Varlink Error".
forskap queue listgave the retry window of a failed write as "604800, seconds".
Interface: forskap-api 1.3.0, up from 1.0.0 — SearchOptions.match_all (1.1), GetDescriptionTemplates (1.2), GetQueue, queued in the write replies, dormancy in GetStatus and rotation in WhoAmI (1.3).
What's Changed
- feat: Search provider for rofi by @BjarneSeger in #92
- feat: colour the text views by role by @BjarneSeger in #94
- fix: scope completions to --project/--group by @BjarneSeger in #96
- feat: description templates and $EDITOR for issue create by @BjarneSeger in #97
- fix: wait for a locked keychain instead of giving up by @BjarneSeger in #99
- feat: say what holds a sync job back by @BjarneSeger in #100
- feat: queued writes, session and token rotation status (interface 1.3.0) by @BjarneSeger in #101
Full Changelog: v1.1.0...v1.2.0-rc.1
v1.1.0
Changelog
- 32e940a chore: Bump version to 1.1.0
- 306f251 Merge pull request #91 from BjarneSeger/feat/launcher-projects-default
- 79993a7 feat: Launchers search projects by default
- e733a37 Merge pull request #90 from BjarneSeger/feat/cosmic-launcher-plugin
- 5b650b9 feat: Search provider for COSMIC's launcher
- b80adf8 chore: Bump formula to v1.0.0
v1.0.0
Changelog
- cc74442 Merge pull request #89 from BjarneSeger/chore/bump-1.0.0
- 9e3402c chore: Bump version to 1.0.0
- 79177bd chore: Bump formula to v1.0.0
- 5b2baaa Merge pull request #88 from BjarneSeger/fix/zig-cache-gitignore
- 8b39002 ci: Ignore setup-zig's cache directory
- a3150a2 Merge pull request #86 from BjarneSeger/feat/api-freeze
- f6d54c8 feat: Freeze the interface at forskap-api 1.0.0
- d572941 test: Check that the interface changes only compatibly
- c5ec888 Merge pull request #85 from BjarneSeger/feat/api-breaking
- 7d7d20b fix: Print the daemon's message for a failed call
- cc5f8b8 refactor!: Move the daemon's internals to an admin interface
- 91d6b24 refactor!: Take the arguments that grow in one struct
- 861b6b0 refactor!: Name the board column and the full paths for what they are
- 9d944eb refactor!: Leave out what the daemon doesn't know
- 0ed582e refactor!: Send time spent in seconds
- db15fc3 feat!: Reply errors that say what the caller does next
- 0c2e9d9 Merge pull request #84 from BjarneSeger/feat/api-foundation
- fd2a1f7 feat: Let a client check a daemon's interface version
- 39c535f fix: Leave absent optional fields out instead of sending null
- 3eef283 feat: Refuse arguments on the methods without any
- 10f3a91 docs: Say how a client finds the socket and what it can rely on
- 0240d0b docs: Describe the interface in its definition
- 07b09f3 fix: Send no reply to a oneway call
- 461ce2b feat: Refuse arguments a method doesn't have
- fad68a4 feat: Tell a client which interface version the daemon speaks
- c87b05f Merge pull request #83 from BjarneSeger/feat/work-item-wire
- 4aa9386 feat!: Leave work item types out of a search with exclude_types
- 0d697bf refactor!: Shape the wire around work items
- d9684a8 Merge pull request #82 from BjarneSeger/feat/sync-job-progress
- f19ecf2 feat: Report how far a running sync job is
- 4c36b93 Merge pull request #81 from BjarneSeger/ci/brew-no-main-push
- 8c6e507 ci: Run the formula workflow on pull requests only
- 5027e4e Merge pull request #80 from BjarneSeger/feat/nushell-completions
- da87977 Merge pull request #79 from BjarneSeger/fix/per-user-socket
- 38509cb feat: Complete dynamically in nushell and through carapace
- 3c1fe1f fix: Keep the daemon's socket and its Homebrew log per user
- 32fc89e Merge pull request #78 from BjarneSeger/feat/unavailable-jobs
- e2178d8 feat: Tell sync jobs GitLab refuses for good from failing ones
- 6f4b1a4 Merge pull request #77 from BjarneSeger/fix/events-rewalk
- 5462612 fix: Re-walk the event window on the full cadence
- 9e92801 Merge pull request #76 from BjarneSeger/feat/daemon-args
- f263122 feat: Serve a demo account with forskapd --dry-run
- f796c5f feat: Parse forskapd's arguments before starting anything
- 3cfa10c Merge pull request #75 from BjarneSeger/feat/status
- 87ef8d5 feat: Add forskap status, the health overview
- 9ba743c Merge pull request #73 from BjarneSeger/feat/brew-binaries
- 9a9b943 Merge pull request #74 from BjarneSeger/fix/avatar-content-name
- 844349d docs: Say that Homebrew installs prebuilt binaries from the next release
- 98edc98 ci: Install the checkout through the rendered binary formula
- 46d46c9 feat: Render a formula that installs the prebuilt binaries
- f503549 fix: Keep an avatar's path while its image is unchanged
- dbd6055 ci: Build the macOS release archive on a macOS runner
- de2edef Merge pull request #69 from BjarneSeger/feat/brew-tap
- ec45110 Merge pull request #71 from BjarneSeger/feat/gzip-responses
- 0932eff docs: Say which release Homebrew on macOS starts with
- 63e3aa8 ci: Drop the Intel macOS runner from the formula workflow
- 248f19e feat: Ask GitLab for gzip-compressed responses
- e2ceaaf ci: Build the checkout's source with Homebrew on macOS
- 18b10c1 fix: Enable tokio's multi-thread runtime on every platform
- f88aa45 Merge pull request #70 from BjarneSeger/feat/create-issue
- 5f504c6 feat: Add a Homebrew formula and tap
- 895644c feat: Create issues with CreateIssue, unqueued
- 90722c2 Merge pull request #68 from BjarneSeger/feat/list-issues
- f81b274 Merge pull request #67 from BjarneSeger/feat/wire-updated-at-archived
- 2ba1117 feat: List my recent issues across states with ListIssues
- 93f0ba5 feat: Carry update times and the archived flag on the wire
- 90fefa3 Merge pull request #65 from BjarneSeger/fix/release-version-tag
- effcba4 fix(ci): Keep the Go binding's tags out of the release version
- c12375c feat: Lower required go to 1.24
- 828aefb Merge pull request #64 from BjarneSeger/docs/licenses-go-tag
- 36b38a3 docs: Add license files and the binding's tagging step
- 709daaa docs(go): Add proper license for the go bindings
- 55c0db3 fix: Keep one Secret Service client for the daemon's life
- 57517db Merge pull request #62 from BjarneSeger/feat/epic-group-path
- cb2fe80 Merge pull request #61 from BjarneSeger/feat/search-scope
- 9813404 feat: Scope a search to projects or groups
- e70700b Merge pull request #59 from BjarneSeger/feat/whoami-username
- d8ab3a2 feat: Name the epic's group on the wire
- 7dba735 feat: Report the login name in WhoAmI
- f92f5b2 Merge pull request #51 from BjarneSeger/fix/listing-page-walk
- 6cc016c fix: Walk every listing page GitLab announces, not until the first short one
- 0f146a2 Merge pull request #50 from BjarneSeger/ci/faster-release
- 768c683 ci: Cache release builds with kache, drop the extra debug build
v0.12.0
Changelog
- c52d3e4 chore: Bump version to 0.12.0
- ea27c25 chore: Bump dependencies
- 90e7548 Merge pull request #49 from BjarneSeger/refactor/drop-pre-gitlab-12
- b79372a Merge pull request #48 from BjarneSeger/refactor/typed-interface
- 09ccc67 refactor: Require GitLab 12, drop the URL fallback for older ones
- 0489efe refactor!: Type the search kinds, cache scopes and history source
- c1dfc22 Merge pull request #46 from BjarneSeger/feat/concurrent-sync
- 7e27ade Merge pull request #43 from BjarneSeger/refactor/dedupe-helpers
- 0e3d7ea feat: Run sync jobs concurrently
- 18120d3 refactor: Hash with XXH3 instead of our own FNV and splitmix
- f1d22ec refactor: Keep one now_secs in the daemon
- f3ef5d8 refactor: Share the sigil and project path helpers in the CLI
- 9136de9 Merge pull request #42 from BjarneSeger/feat/activity-description
- ddcee28 Merge pull request #45 from BjarneSeger/feat/group-idle-jobs
- 89976e9 Merge pull request #44 from BjarneSeger/feat/color
- 7cbabf3 Merge pull request #41 from BjarneSeger/feat/watch
- 18e2304 feat: Group the settled sync jobs per kind
- 1510da3 feat: Colour states, headings and item numbers
- 8268d13 feat: Watch the sync jobs and the failed writes
- 0bdd48e feat: Describe comments and pushes in the activity
- 3ef3f9b Merge pull request #40 from BjarneSeger/feat/yaml-output
- 45597b5 feat: Add YAML as an output format
- 443c5b6 Merge pull request #29 from BjarneSeger/feat/epics
- ec3e9c9 feat: Pick an ambiguous epic's group
- 2704d54 feat: Search and open epics
- d798ca9 Merge pull request #31 from BjarneSeger/feat/activity
- 37fb532 Merge pull request #37 from BjarneSeger/fix/sync-jobs-output
- f2030ea fix: Don't pass a push's project id as its target number
- 8637558 feat: Show the contribution events
- 623aa49 fix: Print the sync jobs through out!
- b62497f Merge pull request #28 from BjarneSeger/feat/sync-jobs
- 4f38056 fix: Don't jitter a cadence of never
- 3b83023 Merge pull request #30 from BjarneSeger/feat/completion-picker
- ac3693d feat: Complete issue and MR numbers, pick an ambiguous one
- af91555 Merge pull request #32 from BjarneSeger/fix/broken-pipe
- 237420a fix: Handle a closed stdout instead of restoring SIGPIPE
- 7561805 Merge pull request #33 from BjarneSeger/fix/created-project-membership
- f990b24 fix: Count a project's creation as membership
- 07d141f fix: Exit quietly when the output pipe closes
- 7ec426c feat: Show the sync jobs
- bc8e800 Merge pull request #27 from BjarneSeger/feat/project-icons
- 5af52a9 test: Bench the sync plan over a large membership
- e314d55 feat: Show project avatars in the launchers
- 1ede284 Merge pull request #26 from BjarneSeger/feat/token-rotation
- c6ae31f feat: Spread the rotation between machines, suggest self_rotate
- 427ad0a fix: Don't rotate again after an unusable rotation answer
- fbbbe2a feat: Rotate the GitLab token before it expires
- 90b225b fix: Move the icon in the README
- 980b8ea Merge pull request #21 from BjarneSeger/refactor/rename-forskap
- 376aa56 feat: Add an app icon
- 3288e2b refactor!: Rename the project to forskap
- 3c4fda8 Merge pull request #20 from BjarneSeger/refactor/cli-structure
- c7077c4 refactor(tt)!: Group commands by what they act on
- 506b60c Merge pull request #18 from BjarneSeger/feat/concurrent-queue
- ad08f3b feat(gitlabd): send queued writes concurrently
v0.10.1
v0.10.0
Changelog
- 5440f25 chore: Bump version to 0.10.0
- 5c850b7 Merge pull request #15 from BjarneSeger/refactor/sync-engine
- 08729f0 docs(skills): list the fake's one-shot rows and 401 error
- e3fee06 fix(gitlabd): refresh the full history for an old replayed PostTime
- 27720ff fix(gitlabd): keep history of issues the user can no longer read
- a310826 fix(gitlabd): look up a queued PostTime's issuable id at replay
- a45941e fix(gitlabd): keep the close/unassign overlay across restarts
- 1b962bc fix(gitlabd): keep synced rows and plans in step with GitLab
- 988df3d fix(gitlabd): clear and refill only the slice a ClearCache names
- 9589103 fix(gitlabd): age overdue sync jobs so none starves
- 7f4905d fix(gitlabd): park a dead token and back off jobs that lose the network
- 6dd69f1 fix(gitlabd): reconcile capped project listings without losing rows
- 2078d33 fix(gitlabd): keep plan and job states consistent across clears and restarts
- 3585000 fix(gitlabd): refill after a cache clear without a duplicate run
- 616c607 perf(gitlabd): sync memberships daily and cap projects at 1000 items
- c810cc7 fix(gitlabd): bound the per-project corpus to member projects and a cap
- 77c6bc8 docs(gitlabd): align help and doc comments with the sync engine
- d09758f perf(gitlabd): decode labels without a Value per entry
- b5395cb fix(gitlabd): assigned lists follow the rows' current state
- fd366f5 fix(gitlabd): saturate schedule and rate-limit arithmetic
- 00cc061 fix(gitlabd): also drop the tracked-search branch's keyspace
- e852273 refactor(gitlabd)!: serve every read from the sync store
- 2e7c045 feat(gitlabd): sync engine, activity-based planner and [sync] pacing
- 5c150b3 feat(gitlabd): generic sync store and jittered job schedule
- 052d6a4 feat(gitlabd): typed GitLab mirrors and one generic listing transport
- f92a5b5 refactor(gitlabd): gather the pure read helpers in query.rs
- 1816397 refactor(gitlabd): one write path for handlers and the retry queue
- f19c094 fix(gitlabd): page through GraphQL timelogs
- f782afb fix(gitlabd): treat 429/5xx as throttling, not rejection
- c672002 feat: usage-ranked search and noctalia /gl launcher (#12)
- 641f754 chore: Bump dependencies
v0.9.0
Changelog
- 162ef64 chore: Bump version to 0.9.0
- 45acee7 test(gitlabd): add criterion benches for local ops
- f428ef3 refactor(gitlabd): move daemon modules to library target
- 08af4c8 Merge branch 'feat/mr-handling'
- 2a304c4 feat(tt): GitLab-style issue/MR refs, MR picker and listing
- ff0c6a9 feat(api)!: address issues and MRs by issuable kind
- f12521c feat(history): track merge-request timelogs
- 44a7d60 feat(search): capture MR assignees for the assigned-MR view
- 7105dff refactor(gitlabd): generalize GitLab writes over issuable kind
- e37c7d1 feat(refresh): stamp-gate quick/slow tiers on restart
- 26a001f refactor(search): move sync gate into SearchCache
- 6e72463 feat(go): add Search to handwritten Client
- 184b9b7 chore: Add proptests to appropriate properties
- 5cc3e85 feat(search): auto population with gitlab.com fallback
- ebffc70 feat(tt): tt search command
- dab7a39 feat(search)!: Search varlink method
- 2095cde feat(search): stamp-gated background search sync
- 16c47f8 feat(search): [search] config section
- 20a4d89 feat(search): GitlabApi sync fetchers
- 58d0191 feat(search): search cache storage
- 8fce93b chore: Bump version to 0.8.0
- a2086dc fix: Add claude docs
- eea60d4 docs: Update READMEs
- 01af78b chore(breaking): Migrate to fjall
- 81fef99 chore: Refactor handler into a module
- 6970d05 fix: fmt
- 43da406 Merge branch 'fix/auto-reconnect'
- 24571f2 feat: Auto-reconnect on runtime GitLab disconnects
- e6422da feat: Background auto-reconnect after unreachable-GitLab dormancy
- cde5182 feat: Go bindings
- 1138eb0 refactor: Rename refresh/history tiers to quick/slow
- ad90612 Merge branch 'feat/proper-issue-sync'
- 4af4e96 fix: Correct comment path
- 0311fd6 fix: Lints
- ff7fd02 feat: Refactor issue syncing
- 974aa24 Merge branch 'fix/disconnect-error-msgs'
- e1921a7 fix: Make NotAuthenticated an enum
- 7c768f6 fix: Tests
- ab14f18 fix: Clean up error handling
- 74a6f72 fix: Actually report network failures
- d712b1f fix: Clean up cli message to be more accurate
- f605e70 feat: report why the daemon is dormant, not just "not authenticated"
v0.8.0
Changelog
- eaeae97 chore: Bump version to 0.8.0
- a2086dc fix: Add claude docs
- eea60d4 docs: Update READMEs
- 01af78b chore(breaking): Migrate to fjall
- 81fef99 chore: Refactor handler into a module
- 6970d05 fix: fmt
- 43da406 Merge branch 'fix/auto-reconnect'
- 24571f2 feat: Auto-reconnect on runtime GitLab disconnects
- e6422da feat: Background auto-reconnect after unreachable-GitLab dormancy
- cde5182 feat: Go bindings
- 1138eb0 refactor: Rename refresh/history tiers to quick/slow
- ad90612 Merge branch 'feat/proper-issue-sync'
- 4af4e96 fix: Correct comment path
- 0311fd6 fix: Lints
- ff7fd02 feat: Refactor issue syncing
- 974aa24 Merge branch 'fix/disconnect-error-msgs'
- e1921a7 fix: Make NotAuthenticated an enum
- 7c768f6 fix: Tests
- ab14f18 fix: Clean up error handling
- 74a6f72 fix: Actually report network failures
- d712b1f fix: Clean up cli message to be more accurate
- f605e70 feat: report why the daemon is dormant, not just "not authenticated"