Commit graph

86 commits

Author SHA1 Message Date
sid
e3d7904929 feat: repo archive/unarchive + completion install
- fgj repo {archive,unarchive}: toggle a repo's archived state via
  EditRepo with *bool Archived. Archive prompts for confirmation
  (requires --yes in non-TTY envs); unarchive is reversible, no prompt.
  Accepts positional owner/name or -R flag; -R wins when both given.

- fgj completion install [shell]: idempotent install of completion
  scripts to shell-standard locations. Auto-detects shell from $SHELL
  if omitted. Paths: bash → XDG (or brew prefix on macOS), zsh →
  ~/.zsh/completions/_fgj, fish → ~/.config/fish/completions/fgj.fish.
  --system (bash only) prints the sudo command for /etc paths without
  writing. --dry-run prints the target path without writing.
  Compares existing-file contents before overwrite to stay idempotent.

Both files built by sub-agents in parallel. Build + vet + test clean.
2026-04-19 23:12:12 -06:00
sid
2d69873f3e feat: logins list/default, actions run delete, date filters, label update alias
- fgj logins {list,default}: complementary UI to 'fgj auth'. 'list'
  shows all configured hosts (hostname, user, protocol, default flag,
  match_dirs) with --json. 'default [hostname]' gets or sets which
  host wins in resolution when no other signal is present.
  Adds 'Default bool' field to HostConfig; GetHost consults it between
  match_dirs and the codeberg.org fallback. Multiple defaults tolerated
  with a stderr warning; alphabetical-first wins.

- fgj actions run delete: delete a completed workflow run via raw
  DELETE (SDK v0.23.2 has no DeleteRepoActionRun). Fetches run first
  and refuses to delete non-terminal states unless --force; suggests
  'actions run cancel' for those. Confirmation prompt unless --yes.

- pr list / issue list gain --since and --before date filter flags.
  Accepts YYYY-MM-DD, RFC 3339, YYYY-MM-DD HH:MM:SS, and relative
  deltas (7d, 24h, 2w, 1m — months=30 days). Issues use server-side
  filter via ListIssueOption.Since/Before; PRs fall back to client-side
  (SDK lacks Since/Before on ListPullRequestsOptions).

- fgj label update added as alias for 'fgj label edit' (tea-compat).

All changes:
  cmd/logins.go (new, 140 LOC)
  cmd/actions_run_delete.go (new, ~85 LOC)
  cmd/pr.go, cmd/issue.go (+parseDateArg helper, filter wiring)
  cmd/label.go (1-line alias)
  internal/config/config.go (Default field + DefaultHost method)
  CHANGELOG.md
Built in parallel by three sub-agents; plus the label alias done
serially. go build / go vet / go test -race all clean.
2026-04-19 23:04:33 -06:00
sid
d15deaf064 feat: times, branch protection, release assets, milestone issues, notification states
Five parallel tea-parity additions (~1100 LOC):

- fgj time {list,add,delete,reset} (aliases: times, t)
  Tracked time entries. 'list' with no arg uses ListMyTrackedTimes
  across all your repos; with an issue number uses ListIssueTrackedTimes.
  'add' accepts Go duration strings (30m, 1h30m). 'delete' removes a
  single entry by id; 'reset' clears all times on an issue. Confirmation
  on delete/reset unless --yes or no TTY.

- fgj branch {protect,unprotect}
  Branch protection rules. 'protect' idempotently creates-or-edits via
  Get/Create/EditBranchProtection with --require-approvals,
  --require-signed-commits, --dismiss-stale-approvals,
  --block-on-rejected-reviews, --block-on-outdated-branch,
  --push-whitelist, --merge-whitelist, --require-status-checks.
  Empty whitelist flags leave existing rule fields untouched.
  'unprotect' deletes; 404 is a friendly no-op.

- fgj release asset {list,create,delete} (alias: assets)
  Granular attachment management. Resolves the release by tag or
  "latest" using the existing helpers in cmd/release.go. 'create'
  validates all paths up front then uploads each. 'delete' accepts
  numeric ids OR filenames (cross-references the attachment list).
  Per-asset confirmation unless --yes.

- fgj milestone issues {add,remove} (alias: i)
  Associate/disassociate issues with a milestone. Milestone accepted
  as title or numeric id (reuses resolveMilestone from milestone.go).
  'remove' passes EditIssueOption{Milestone: &zero} — the Gitea/Forgejo
  convention for clearing the association. Continues on per-issue
  failure and exits 1 if any failed.

- fgj notification {unread,pin,unpin}
  Complement the existing list/read. Factory pattern over
  ReadNotification(id, NotifyStatus) with three distinct constants.

All five files are self-contained: each has its own init() attaching
to the existing parent cobra.Command (branchCmd, milestoneCmd,
notificationCmd, releaseCmd) without modifying any other file. Built
by parallel sub-agents; all compile, vet, and test clean.
2026-04-19 22:24:53 -06:00
sid
4eeef2ceca feat: pr approve/reject, repo migrate/template, secret stdin fix, docs
- fgj pr approve / pr reject: thin shortcuts over 'pr review --approve'
  and '--request-changes'. Reject requires a body.
- fgj repo migrate: wrap SDK MigrateRepo. Supports git, github, gitlab,
  gitea, gogs services; mirror mode with --mirror-interval; selective
  import (wiki/labels/milestones/issues/PRs/releases/LFS); auth via
  --auth-token or --auth-username/--auth-password. Defaults owner to
  the authenticated user.
- fgj repo create-from-template: wrap SDK CreateRepoFromTemplate with
  fine-grained --with-{content,topics,labels,webhooks,git-hooks,avatar}
  flags. Template is owner/name; new repo defaults to the current user.
- Rework 'fgj actions secret create' input. New cmd/secret_input.go
  resolves values from --body, --body-file (path or '-'), hidden TTY
  prompt via term.ReadPassword, or piped stdin. Trims trailing
  whitespace, rejects empty values. Replaces fmt.Scanln which broke on
  spaces/newlines and echoed input.
- CHANGELOG: v0.4.0 Unreleased section documenting all additions,
  changes, and development items.
- README: updated feature list with new commands.
2026-04-19 22:14:43 -06:00
sid
424fb63a8b chore: bump Gitea SDK v0.22.1 → v0.23.2
v0.24.0 and v0.24.1 require Go 1.26 (via module go directive), which
forces a toolchain download on any builder running older Go. v0.23.2
is the most recent release that works with our Go 1.24 baseline.

Worth it: v0.23.x brings significant Issue/PR/Action method coverage
beyond v0.22.1. Tests + vet still clean, live smoke against
forgejo.zerova.net still passes (whoami, repo list).

ResolvePullReviewComment / UnresolvePullReviewComment are still not
in the SDK at v0.23.2 — they landed in v0.24 — so pr_review_comments.go
continues to call the raw REST endpoints. Swap to native methods once
we move to Go 1.26.
2026-04-19 22:04:32 -06:00
sid
adccd6f6f7 feat: add webhook, repo delete/search, admin, pr clean/resolve/review-comments
Second pass of tea-parity work:

- fgj webhook {list,create,update,delete}: full CRUD over repo webhooks.
  Create supports all standard hook types (gitea, slack, discord, etc.),
  event selection, content type, secret, branch filter, auth header.
  Update is partial — flags you omit leave existing config unchanged.
- fgj repo delete: type-to-confirm deletion; --yes skips for scripts;
  refuses without a TTY unless --yes is passed.
- fgj repo search: SDK SearchRepos with query, topic/description,
  private/archived, --type (source/fork/mirror), owner, sort/order.
- fgj admin user list: admin-gated user enumeration.
- fgj pr clean: delete the local branch from 'pr checkout'. Refuses
  if the PR is still open (use --force) or if the branch is currently
  checked out.
- fgj pr review-comments: list inline review comments across every
  review on a PR (ListPullReviews + ListPullReviewComments per review).
- fgj pr resolve / unresolve: mark review comments as (un)resolved.
  Uses raw POST since SDK v0.22.1 predates these endpoints; requires
  Forgejo 8.x+ / Gitea 1.22+ server-side.

All share the standard parseRepo + config.Load + NewClientFromConfig
pattern; list commands support --json / --jq.
2026-04-19 22:01:29 -06:00
sid
17ca49d0c5 feat: add branch, notification, org, open, whoami commands
Ports five commands from tea that fgj-sid was missing:

- fgj branch {list,rename,delete} — list branches with protection
  status, rename, and delete with confirmation.
- fgj notification {list,read} — list user notifications (unread by
  default, --all for everything), mark individual threads read.
- fgj org {list,create,delete} — manage organizations on the host.
  Create accepts --description/--full-name/--website/--location and
  --visibility (public/limited/private).
- fgj open [number] — open the repo, issue, or PR in a browser.
  Auto-detects issue-vs-PR via GetIssue. Falls back to printing the
  URL when stdout is not a TTY or --url is passed.
- fgj whoami — display authenticated user + host.

All commands follow the established pattern (parseRepo + config.Load +
api.NewClientFromConfig + ios), support --json where list semantics
apply, and share a new loadClient helper for host-scoped (non-repo)
commands. Tested live against forgejo.zerova.net.

Refs audit recommendation.md §'v0.5.0 — Missing resources'.
2026-04-19 21:27:55 -06:00
sid
d4b5b79541 feat(release): v0.4.0 foundations — ldflags version + goreleaser + CI Go 1.24
- Move version out of cmd/root.go hardcode into an ldflags-injected
  var. Makefile derives from 'git describe --tags --always --dirty';
  plain 'go build' / 'go run' get 'dev'. Release builds will get the
  tag via goreleaser.
- Add .goreleaser.yaml: multi-platform (linux/darwin/windows/freebsd ×
  amd64/arm64/arm) builds with SHA256 checksums, tar.gz/zip archives,
  forgejo release publishing. No GPG/S3 yet — deferred until a key is
  provisioned.
- Add .gitea/workflows/release.yml to run goreleaser on tag push.
  Uses built-in GITEA_TOKEN with override via RELEASE_TOKEN secret.
- Align CI Go version with go.mod (1.24). Previously CI ran 1.21,
  which would have silently missed any 1.22+ feature use.
- Move itchyny/gojq from indirect to direct (it's used in api.go).
  Drop stale x/sys v0.33.0 entry from go.sum.
- Ignore dist/ and bin/ in .gitignore.
- CHANGELOG: document v0.3.1 fix and Unreleased development changes.
2026-04-19 21:04:57 -06:00
sid
a6cf9a7096 chore: bump version to 0.3.1
Some checks failed
CI / lint (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
CI / functional (push) Has been cancelled
Restores installability via 'go install @latest'. Prior letter-suffix
tags (v0.3.0a..v0.3.0f) aren't valid semver and were ignored by Go's
module resolver, leaving @latest pointing at v0.3.0 which predates
the module-path migration.
2026-04-19 20:54:45 -06:00
sid
c2251d9932 chore: migrate module path to public org
Some checks failed
CI / lint (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
CI / functional (push) Has been cancelled
Move from forgejo.zerova.net/sid/fgj-sid to
forgejo.zerova.net/public/fgj-sid to reflect the new public org.
2026-04-11 10:34:34 -06:00
sid
2e6575c660 docs: document match_dirs for directory-based host selection
Some checks failed
CI / lint (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
CI / functional (push) Has been cancelled
The match_dirs config option was undocumented. Add a dedicated section
explaining directory-based host selection with examples, and update the
hostname resolution priority list to include match_dirs at step 4.
2026-03-23 13:11:43 -06:00
sid
4669d21dea chore: bump version to 0.3.0e
Some checks are pending
CI / lint (push) Waiting to run
CI / build (push) Waiting to run
CI / test (push) Waiting to run
CI / functional (push) Blocked by required conditions
2026-03-23 12:57:38 -06:00
sid
830eba1c0e feat: deterministic match_dirs tie-breaking by config file order
Some checks are pending
CI / lint (push) Waiting to run
CI / build (push) Waiting to run
CI / test (push) Waiting to run
CI / functional (push) Blocked by required conditions
2026-03-23 12:55:49 -06:00
sid
ac780231a8 feat: support ~ (tilde) expansion in match_dirs paths
Some checks are pending
CI / lint (push) Waiting to run
CI / build (push) Waiting to run
CI / test (push) Waiting to run
CI / functional (push) Blocked by required conditions
2026-03-23 12:50:49 -06:00
sid
c293e233d2 feat: add directory-scoped host defaults (match_dirs) and repo list --limit
Some checks are pending
CI / lint (push) Waiting to run
CI / build (push) Waiting to run
CI / test (push) Waiting to run
CI / functional (push) Blocked by required conditions
Add match_dirs field to host config entries for directory-based host
resolution. When no --hostname flag, FGJ_HOST env var, or git remote is
detected, the longest matching directory prefix determines the host.
Symlinks are resolved on both sides for macOS compatibility (/tmp →
/private/tmp). Also adds --limit/-L flag to repo list.
2026-03-23 12:42:24 -06:00
sid
113505de95 feat: v0.3.0d — add PR checks, iostreams, aliases, and broad enhancements
Add PR checks command, iostreams/text packages for colored table output,
top-level run/workflow aliases matching gh CLI structure. Enhance actions,
issues, PRs, releases, repos, labels, milestones, and wiki commands with
improved flags, JSON output, and error handling.
2026-03-23 12:42:24 -06:00
sid
7c0dcc8696 test: rewrite functional tests for full CLI coverage
Consolidate all tests into functional_test.go — remove duplicate
new_commands_test.go. Replace SDK-only tests with actual CLI binary
invocations. Add missing coverage for: issue list, issue view,
issue comment, issue create, issue edit title, repo view, repo list,
release view, --json flag on issue list/view and pr list.
All tests now use -R flag consistently.

35 pass, 0 fail, 3 expected skips (pr view/diff need PRs, clone needs auth).
2026-03-23 12:42:24 -06:00
sid
95da06c003 feat: v0.3.0c — add labels, milestones, wiki, issue dependencies
New commands:
- fgj label list/create/edit/delete
- fgj milestone list/view/create/edit/delete
- fgj wiki list/view/create/edit/delete

Enhanced:
- fgj issue edit --add-dependency/--remove-dependency
2026-03-21 21:50:24 -06:00
sid
7ee5a61910 feat: v0.3.0b — add repo edit command, fix repo create --public flag
- Add `fgj repo edit` for changing visibility, description, homepage,
  and default branch on existing repositories
- Fix `repo create --public` flag which was defined but never read
2026-03-21 21:50:24 -06:00
sid
43e43e7024 feat: v0.3.0a — add api command, pr diff/comment/review, structured errors
New commands:
- fgj api: raw REST API passthrough with field inference and path interpolation
- fgj pr diff: view PR diffs with color, --name-only, --stat
- fgj pr comment: add comments to pull requests
- fgj pr review: approve, request changes, or comment on PRs

Agentic enhancements:
- --json-errors flag for structured JSON error output on stderr
- APIError type wrapping HTTP status codes for machine consumption
- Error codes: auth_required, not_found, api_error, invalid_input, etc.

Docs updated for forgejo.zerova.net/sid/fgj-sid fork.
2026-03-21 21:50:24 -06:00
sid
50191cc542 feat: add PR diff, PR review, and structured error handling commands 2026-03-21 21:50:24 -06:00
Romain Bertrand
3db03ed5e2 Merge pull request 'docs: adjust for v0.3.0 release' (#36) from release/prepare_for_v0.3.0 into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/36
2026-03-13 18:24:34 +01:00
Romain Bertrand
47f696d7dd docs: adjust for v0.3.0 release 2026-03-13 18:20:21 +01:00
Romain Bertrand
fbdb2320cc Merge pull request 'feat: implement repo create command' (#35) from feat/repo-create into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/35
2026-03-13 18:10:06 +01:00
Romain Bertrand
a43a79d78f feat: implement repo create command 2026-03-13 17:44:44 +01:00
Romain Bertrand
73d54fde9c Merge pull request 'fix: respect $XDG_CONFIG_HOME' (#34) from fix/issue-33/respect_xdg_base_dir into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/34
2026-03-13 12:37:19 +01:00
Romain Bertrand
bfd082e66e docs: simplify README.md a bit 2026-03-13 11:52:12 +01:00
Romain Bertrand
2ea1bff59d fix: respect $XDG_CONFIG_HOME 2026-03-12 15:44:24 +01:00
Romain Bertrand
f1d1386d51 chore: ignore .worktrees directory 2026-03-10 15:38:35 +01:00
Romain Bertrand
527f6bf15f Merge pull request 'feat: allow tags passing when creating/editing an issue' (#31) from feat/issue-27/labels_for_issue_creation_and_edition into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/31
2026-02-20 17:53:36 +01:00
Romain Bertrand
2a20a4e0b8 tests: add functional tests for issues labels 2026-02-20 17:48:56 +01:00
Romain Bertrand
0b8f67e438 feat: allow tags passing when creating/editing an issue
resolves #27
2026-02-20 17:41:45 +01:00
Romain Bertrand
65c686997f Merge pull request 'feat/various' (#28) from feat/various into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/28
2026-01-28 15:50:13 +01:00
Romain Bertrand
1420b89fed fix: correctly build the jobs logs url
unfortunately, this is available in gitea, not yet backported to forgejo
2026-01-28 15:16:25 +01:00
Romain Bertrand
a7e5dc5798 lint: find a bunch of issues 2026-01-28 15:16:25 +01:00
Romain Bertrand
4c6de3ad2e feat: add actions workflow enable and disable 2026-01-18 13:11:41 +01:00
Romain Bertrand
c2ee338f1c feat: add actions run watch rerun and cancel 2026-01-18 13:11:41 +01:00
Romain Bertrand
3ccef4e1c6 feat: add json output for list and view commands 2026-01-18 13:11:41 +01:00
Romain Bertrand
fe23f2fce3 feat: add auth logout and token helpers 2026-01-18 13:11:40 +01:00
Romain Bertrand
7bb540bd11 feat: add completion and manpage commands 2026-01-18 13:11:40 +01:00
Romain Bertrand
937aa09a2c Merge pull request 'feat: implement workflow list/view/run' (#26) from feat/workflows into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/26
2026-01-16 11:31:37 +01:00
Romain Bertrand
d4e76e193f docs: less verbose todo list in README.md 2026-01-16 10:56:05 +01:00
Romain Bertrand
79df4eb780 feat: implement workflow list/view/run 2026-01-16 10:52:15 +01:00
Romain Bertrand
d445e55737 Merge pull request 'feat: allow passing a comment when closing an issue' (#24) from feat/closing_issue_with_comment into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/24
2026-01-16 10:24:54 +01:00
Romain Bertrand
900bd4ea97 feat: allow passing a comment when closing an issue 2026-01-16 10:03:49 +01:00
Romain Bertrand
fc699e9718 release: prepare for v0.2.0 2026-01-09 13:49:41 +01:00
Romain Bertrand
52177d9f9e docs: enhance the repology "widget" 2026-01-09 13:44:13 +01:00
Romain Bertrand
a8cd5c9916 docs: try repology 2026-01-09 13:41:41 +01:00
Romain Bertrand
8f91536e93 Merge pull request 'feat: auto detect hostname' (#19) from feat/issue-15/auto_detect_hostname into main
Reviewed-on: https://codeberg.org/romaintb/fgj/pulls/19
2026-01-06 12:58:45 +01:00
Romain Bertrand
c0baf4fa3b feat: auto detect hostname 2026-01-06 12:24:07 +01:00