From 383d31c8c441b0d6b877bcab21ecdf35a36b64bc Mon Sep 17 00:00:00 2001 From: miguelmartens Date: Sun, 20 Sep 2026 16:42:07 +0200 Subject: [PATCH] Move to nxplain-sh and add release and contribution tooling Point the module path, imports and documentation links at github.com/nxplain-sh/protui following the organisation move. Add a GoReleaser config and a tag-triggered release workflow that publishes macOS and Linux archives for amd64 and arm64. Add the Contributor Covenant code of conduct, and replace the pre-commit framework with a repository git hook installed by `make hooks`. Rename .golangci.yml to .golangci.yaml, and run the prettier check in CI through `make format-check` so there is one definition of each check. --- .githooks/pre-commit | 51 ++++++++++++ .github/workflows/ci.yml | 3 +- .github/workflows/release.yaml | 33 ++++++++ .golangci.yml => .golangci.yaml | 2 +- .goreleaser.yaml | 32 ++++++++ .pre-commit-config.yaml | 55 ------------- CHANGELOG.md | 2 +- CODE_OF_CONDUCT.md | 132 ++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 23 +++--- Makefile | 13 +--- README.md | 5 +- SECURITY.md | 2 +- cmd/protui/main.go | 4 +- go.mod | 2 +- internal/passcli/client.go | 2 +- internal/passcli/client_test.go | 2 +- internal/passcli/item.go | 2 +- internal/passcli/parse.go | 2 +- internal/passcli/parse_test.go | 2 +- internal/ui/commands.go | 4 +- internal/ui/form.go | 4 +- internal/ui/keymap_test.go | 2 +- internal/ui/model.go | 4 +- internal/ui/preview_test.go | 4 +- internal/ui/update.go | 2 +- internal/ui/view.go | 4 +- internal/ui/view_test.go | 4 +- 27 files changed, 296 insertions(+), 101 deletions(-) create mode 100755 .githooks/pre-commit create mode 100644 .github/workflows/release.yaml rename .golangci.yml => .golangci.yaml (96%) create mode 100644 .goreleaser.yaml delete mode 100644 .pre-commit-config.yaml create mode 100644 CODE_OF_CONDUCT.md diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..5c553a4 --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,51 @@ +#!/bin/sh +# pre-commit hook. Shells out to Makefile targets rather than reimplementing +# the checks, so a commit is verified with the same commands as `make check` +# and CI. A check added in one place is added in all three. +# +# Installed by `make hooks` (which sets core.hooksPath). Bypass a run with +# `git commit --no-verify`. +# +# Every check is repo-wide: `go vet` and `go test` are package-scoped, and +# prettier is pointed at the whole tree by `.prettierignore`. The patterns +# below therefore decide only *whether* a check runs, not what it looks at. + +set -e + +staged="$(git diff --cached --name-only --diff-filter=ACMRT)" + +matched() { + printf '%s\n' "$staged" | grep -Eq "$1" +} + +run() { + printf '\n> %s\n' "$*" + "$@" +} + +# Ordered fastest first, so an obvious failure does not wait behind the test +# suite. +if matched '\.go$|^go\.(mod|sum)$'; then + run make fmt-check +fi + +# prettier reads its own config, so a change to that config is a reason to +# re-check the tree. +if matched '\.(md|json|ya?ml)$|^\.prettier(rc|ignore)$'; then + run make format-check +fi + +if matched '\.go$|^go\.(mod|sum)$'; then + run make vet +fi + +# Skipped with a note when golangci-lint is absent, matching the Makefile +# target. CI runs it either way. +if matched '\.go$|^go\.(mod|sum)$|^\.golangci\.ya?ml$'; then + run make lint-go +fi + +# Without -race: that pass belongs to CI, which can afford the wall time. +if matched '\.go$|^go\.(mod|sum)$'; then + run make test +fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index de49fe5..aa66afa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,7 +89,8 @@ jobs: - uses: actions/setup-node@v4 with: node-version: lts/* - - run: npx --yes prettier --check . + - name: Check formatting + run: make format-check vulncheck: name: Vulnerabilities diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..e6e61d3 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,33 @@ +name: Release + +# Tags only. CI has already run on main by the time a release tag exists, and +# GoReleaser publishes straight from the tag, so there is nothing to gate here. +on: + push: + tags: ["v*"] + +permissions: + contents: write + +jobs: + release: + name: GoReleaser + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + # GoReleaser reads the history to build the changelog. + fetch-depth: 0 + persist-credentials: false + + - uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache: true + + - uses: goreleaser/goreleaser-action@v7 + with: + version: "~> v2" + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.golangci.yml b/.golangci.yaml similarity index 96% rename from .golangci.yml rename to .golangci.yaml index 739bdd7..3555dd0 100644 --- a/.golangci.yml +++ b/.golangci.yaml @@ -49,4 +49,4 @@ formatters: settings: goimports: local-prefixes: - - github.com/miguelmartens/protui + - github.com/nxplain-sh/protui diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..0ef5ae6 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,32 @@ +# GoReleaser configuration. The release workflow runs this on a v* tag; run +# it locally with `goreleaser release --snapshot --clean` to see the artefacts +# without publishing anything. +version: 2 + +project_name: protui + +builds: + - id: protui + main: ./cmd/protui + binary: protui + env: + - CGO_ENABLED=0 + # protui supports macOS and Linux only; each on both architectures. + goos: + - darwin + - linux + goarch: + - amd64 + - arm64 + flags: + - -trimpath + ldflags: + - -s -w -X main.version={{ .Version }} + +archives: + - id: protui + formats: + - tar.gz + files: + - LICENSE + - README.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 0bf70d3..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,55 +0,0 @@ -# Hooks shell out to the Makefile rather than reimplementing the checks, so a -# commit is verified with the same commands as `make check` and CI. A check -# added in one place is added in all three. -# -# Install with `make hooks`. Bypass a run with `git commit --no-verify`. -# -# Every hook is repo-wide (`pass_filenames: false`): `go vet` and `go test` -# are package-scoped, and prettier is pointed at the whole tree by -# `.prettierignore`. The `files` patterns therefore decide only *whether* a -# hook runs, not what it looks at. - -repos: - - repo: local - hooks: - # Ordered fastest first, so an obvious failure does not wait behind the - # test suite. - - id: gofmt - name: gofmt - entry: make fmt-check - language: system - files: '\.go$|^go\.(mod|sum)$' - pass_filenames: false - - # prettier reads its own config, so a change to that config is a reason - # to re-check the tree. - - id: prettier - name: prettier - entry: make format-check - language: system - files: '\.(md|json|ya?ml)$|^\.prettier(rc|ignore)$' - pass_filenames: false - - - id: go-vet - name: go vet - entry: make vet - language: system - files: '\.go$|^go\.(mod|sum)$' - pass_filenames: false - - # Skipped with a note when golangci-lint is absent, matching the Makefile - # target. CI runs it either way. - - id: golangci-lint - name: golangci-lint - entry: make lint-go - language: system - files: '\.go$|^go\.(mod|sum)$|^\.golangci\.yml$' - pass_filenames: false - - # Without -race: that pass belongs to CI, which can afford the wall time. - - id: go-test - name: go test - entry: make test - language: system - files: '\.go$|^go\.(mod|sum)$' - pass_filenames: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 553f10e..b55dbe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,4 +50,4 @@ pending a first tagged version. - [`docs/adr/`](docs/adr/README.md) records the architecture decisions, with the alternatives considered and what each choice cost. -[unreleased]: https://github.com/miguelmartens/protui/commits/main +[unreleased]: https://github.com/nxplain-sh/protui/commits/main diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..a3cad6d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of + any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, + without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +37029379+miguelmartens@users.noreply.github.com. All complaints will be reviewed +and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f5f7a41..c6e4803 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,11 +14,9 @@ You need: - **Node** — only for `prettier`, fetched on demand via `npx`. - **`golangci-lint`** — optional. The lint target skips it with a note when it is absent, but CI runs it, so installing it saves a round trip. -- **[`pre-commit`](https://pre-commit.com/#install)** — optional, and only - needed if you want the hooks below. ```sh -git clone https://github.com/miguelmartens/protui +git clone https://github.com/nxplain-sh/protui cd protui make check # tidy, lint, test — the same checks CI runs make hooks # optional: run those checks on every commit @@ -26,15 +24,20 @@ make hooks # optional: run those checks on every commit `make help` lists every target. -### The pre-commit hooks +### The pre-commit hook -`make hooks` installs [`.pre-commit-config.yaml`](.pre-commit-config.yaml), -which runs `gofmt`, `prettier`, `go vet`, `golangci-lint` and `go test` before -each commit. Every hook shells out to a Makefile target, so the hooks and -`make check` cannot drift apart. +`make hooks` points git's `core.hooksPath` at +[`.githooks/pre-commit`](.githooks/pre-commit), which runs `gofmt`, `prettier`, +`go vet`, `golangci-lint` and `go test` before each commit. The hook shells out +to Makefile targets, so the hook and `make check` cannot drift apart. Git reads +that setting from repository config, so it is one command per clone: -Hooks are scoped by what you touched — a Markdown-only commit does not run the -Go checks — and `git commit --no-verify` skips them when you need it. +```sh +git config core.hooksPath .githooks +``` + +The hook is scoped by what the commit touches — a Markdown-only commit does not +run the Go checks — and `git commit --no-verify` skips it when you need it. ## Before you open a pull request diff --git a/Makefile b/Makefile index e348390..c983e4c 100644 --- a/Makefile +++ b/Makefile @@ -102,17 +102,12 @@ tidy: .PHONY: check check: tidy lint test -## hooks: install the git pre-commit hooks -# Unlike golangci-lint this does not degrade to a note: asking for the hooks -# and silently not getting them is worse than being told to install the tool. +## hooks: install the git pre-commit hook +# Git only reads core.hooksPath from repository config, so this one line cannot +# ship itself with the checkout. .PHONY: hooks hooks: - @if command -v pre-commit >/dev/null 2>&1; then \ - pre-commit install; \ - else \ - echo "pre-commit not installed (see https://pre-commit.com/#install)"; \ - exit 1; \ - fi + git config core.hooksPath .githooks ## clean: remove build artefacts .PHONY: clean diff --git a/README.md b/README.md index 1417776..023976f 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,12 @@ pass-cli info ## Install ```sh -go install github.com/miguelmartens/protui/cmd/protui@latest +go install github.com/nxplain-sh/protui/cmd/protui@latest ``` +Prebuilt binaries for macOS and Linux are attached to each +[release](https://github.com/nxplain-sh/protui/releases). + Or from a clone: ```sh diff --git a/SECURITY.md b/SECURITY.md index 93c5ff8..e04adce 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,7 +8,7 @@ than a footnote. Please report privately, not in a public issue. -Use GitHub's **[private vulnerability reporting](https://github.com/miguelmartens/protui/security/advisories/new)** +Use GitHub's **[private vulnerability reporting](https://github.com/nxplain-sh/protui/security/advisories/new)** — the _Report a vulnerability_ button under the repository's Security tab. It opens a channel visible only to the maintainers. diff --git a/cmd/protui/main.go b/cmd/protui/main.go index b6f29dd..48e9eed 100644 --- a/cmd/protui/main.go +++ b/cmd/protui/main.go @@ -11,8 +11,8 @@ import ( tea "github.com/charmbracelet/bubbletea" - "github.com/miguelmartens/protui/internal/passcli" - "github.com/miguelmartens/protui/internal/ui" + "github.com/nxplain-sh/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/ui" ) // version is overridden at build time via -ldflags. diff --git a/go.mod b/go.mod index 3e4b52c..4e44676 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/miguelmartens/protui +module github.com/nxplain-sh/protui go 1.27.0 diff --git a/internal/passcli/client.go b/internal/passcli/client.go index 4477792..443dff1 100644 --- a/internal/passcli/client.go +++ b/internal/passcli/client.go @@ -25,7 +25,7 @@ import ( "os/exec" "strings" - "github.com/miguelmartens/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/keys" ) // Binary is the upstream executable protui drives. diff --git a/internal/passcli/client_test.go b/internal/passcli/client_test.go index 4bd5e3a..8057499 100644 --- a/internal/passcli/client_test.go +++ b/internal/passcli/client_test.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "github.com/miguelmartens/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/keys" ) // recorder captures what a wrapper would have executed, so argument diff --git a/internal/passcli/item.go b/internal/passcli/item.go index ca69cce..37c9d78 100644 --- a/internal/passcli/item.go +++ b/internal/passcli/item.go @@ -6,7 +6,7 @@ import ( "fmt" "strings" - "github.com/miguelmartens/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/keys" ) // KeyType is a generatable SSH key algorithm, matching --key-type upstream. diff --git a/internal/passcli/parse.go b/internal/passcli/parse.go index 1ca222d..47fe063 100644 --- a/internal/passcli/parse.go +++ b/internal/passcli/parse.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "github.com/miguelmartens/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/keys" ) // The parsers below are pure functions over bytes so they can be exercised diff --git a/internal/passcli/parse_test.go b/internal/passcli/parse_test.go index fd6899a..fc86ccf 100644 --- a/internal/passcli/parse_test.go +++ b/internal/passcli/parse_test.go @@ -9,7 +9,7 @@ import ( "time" "unicode" - "github.com/miguelmartens/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/keys" ) // fixture reads a testdata file, failing the test if it is missing. diff --git a/internal/ui/commands.go b/internal/ui/commands.go index 87d16bb..7668e1c 100644 --- a/internal/ui/commands.go +++ b/internal/ui/commands.go @@ -7,8 +7,8 @@ import ( "github.com/atotto/clipboard" tea "github.com/charmbracelet/bubbletea" - "github.com/miguelmartens/protui/internal/keys" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/passcli" ) // Every pass-cli call runs inside a tea.Cmd and reports back as a message, so diff --git a/internal/ui/form.go b/internal/ui/form.go index 4f0a5be..ad1abff 100644 --- a/internal/ui/form.go +++ b/internal/ui/form.go @@ -7,8 +7,8 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" - "github.com/miguelmartens/protui/internal/keys" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/passcli" ) // Form field indices, in tab order. diff --git a/internal/ui/keymap_test.go b/internal/ui/keymap_test.go index cb64cac..e76d27d 100644 --- a/internal/ui/keymap_test.go +++ b/internal/ui/keymap_test.go @@ -6,7 +6,7 @@ import ( tea "github.com/charmbracelet/bubbletea" - "github.com/miguelmartens/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/keys" ) // listWith builds a loaded model holding count keys, tall enough to paginate. diff --git a/internal/ui/model.go b/internal/ui/model.go index 1c201fe..ce3cce0 100644 --- a/internal/ui/model.go +++ b/internal/ui/model.go @@ -18,8 +18,8 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" - "github.com/miguelmartens/protui/internal/keys" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/passcli" ) // maxPublicKeyFetches bounds how many `item view` calls run at once. diff --git a/internal/ui/preview_test.go b/internal/ui/preview_test.go index 009bd6b..2e7ff70 100644 --- a/internal/ui/preview_test.go +++ b/internal/ui/preview_test.go @@ -10,8 +10,8 @@ import ( "github.com/charmbracelet/lipgloss" "github.com/muesli/termenv" - "github.com/miguelmartens/protui/internal/keys" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/passcli" ) const previewRSA = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDMU3w/a9F5JytBm0CPnKCZ9XlyVxG7d3afM0dJg1+4yZp2dWifkADPAxWAxaLnY7gcJzyCDIC3j5klN1deFpspph4AX09detMoaunhNa/xpxFmWRHin36F+6EQWAKtshvBCoenF8PCcFYrnGsatPPxI2Dbyl0QNacQgfiG4C0YLS1/Ajx/JyY8MwoVqM6hIBmE/hVdAzH+EwVe7R7jLcLNAW63j71At/OYyWOCMeOkPN3JPzRHxadMl666XI/ML0tzmv2akTi3bohkQUtXtFS7rFmVhZF78kYACs4gWoyxNCPpHFh3omYLvGL5xk0qhCgs0O99d6vmNZ2BDb1MNgf deploy@ci" diff --git a/internal/ui/update.go b/internal/ui/update.go index f1ac6df..b52b34f 100644 --- a/internal/ui/update.go +++ b/internal/ui/update.go @@ -10,7 +10,7 @@ import ( "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/passcli" ) // Update is the root update loop. It performs no I/O of its own: every diff --git a/internal/ui/view.go b/internal/ui/view.go index 0499f71..09512e7 100644 --- a/internal/ui/view.go +++ b/internal/ui/view.go @@ -8,8 +8,8 @@ import ( "github.com/charmbracelet/bubbles/list" "github.com/charmbracelet/lipgloss" - "github.com/miguelmartens/protui/internal/keys" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/passcli" ) // View renders the whole screen. diff --git a/internal/ui/view_test.go b/internal/ui/view_test.go index be0b5d6..88cecaf 100644 --- a/internal/ui/view_test.go +++ b/internal/ui/view_test.go @@ -7,8 +7,8 @@ import ( tea "github.com/charmbracelet/bubbletea" - "github.com/miguelmartens/protui/internal/keys" - "github.com/miguelmartens/protui/internal/passcli" + "github.com/nxplain-sh/protui/internal/keys" + "github.com/nxplain-sh/protui/internal/passcli" ) // These are render smoke tests. They drive the model with synthetic messages