devel/crush: new port, crush 0.82.0

This commit is contained in:
c0dev0id
2026-07-08 11:07:34 +02:00
parent bdaeed24db
commit 6d238cb67e
13 changed files with 4098 additions and 0 deletions

26
devel/crush/Makefile Normal file
View File

@@ -0,0 +1,26 @@
COMMENT = glamourous AI coding agent for the terminal
MODGO_MODNAME = github.com/charmbracelet/crush
MODGO_VERSION = v0.82.0
DISTNAME = crush-${MODGO_VERSION}
PKGNAME = crush-${MODGO_VERSION:S/v//}
CATEGORIES = devel
HOMEPAGE = https://github.com/charmbracelet/crush
# Functional Source License 1.1 (MIT Future License); source-available, not OSI
PERMIT_PACKAGE = Yes
WANTLIB = c pthread
MODULES = lang/go
WRKDIST = ${WRKDIR}/${MODGO_MODNAME}@${MODGO_VERSION}
MODGO_LDFLAGS += -X ${MODGO_MODNAME}/internal/version.Version=${MODGO_VERSION}
.include "modules.inc"
.include <bsd.port.mk>

2592
devel/crush/distinfo Normal file

File diff suppressed because it is too large Load Diff

848
devel/crush/modules.inc Normal file
View File

@@ -0,0 +1,848 @@
MODGO_MODULES = \
cel.dev/expr v0.25.2 \
charm.land/bubbles/v2 v2.1.1 \
charm.land/bubbletea/v2 v2.0.8 \
charm.land/catwalk v0.49.2 \
charm.land/fang/v2 v2.0.1 \
charm.land/fantasy v0.35.1 \
charm.land/glamour/v2 v2.0.1 \
charm.land/lipgloss/v2 v2.0.5 \
charm.land/log/v2 v2.0.0 \
charm.land/x/vcr v0.1.1 \
cloud.google.com/go v0.123.0 \
cloud.google.com/go/auth v0.20.0 \
cloud.google.com/go/auth/oauth2adapt v0.2.8 \
cloud.google.com/go/compute/metadata v0.9.0 \
cloud.google.com/go/iam v1.11.0 \
cloud.google.com/go/longrunning v0.5.6 \
cloud.google.com/go/monitoring v1.29.0 \
cloud.google.com/go/storage v1.62.3 \
cloud.google.com/go/translate v1.10.3 \
cyphar.com/go-pathrs v0.2.1 \
dario.cat/mergo v1.0.0 \
dmitri.shuralyov.com/gpu/mtl v0.0.0-20221208032759-85de2813cf6b \
filippo.io/edwards25519 v1.2.0 \
git.sr.ht/~jackmordaunt/go-toast v1.1.2 \
github.com/!azure!a!d/microsoft-authentication-library-for-go v1.2.2 \
github.com/!azure/azure-sdk-for-go/sdk/azcore v1.17.0 \
github.com/!azure/azure-sdk-for-go/sdk/azidentity v1.7.0 \
github.com/!azure/azure-sdk-for-go/sdk/internal v1.10.0 \
github.com/!click!house/ch-go v0.71.0 \
github.com/!click!house/clickhouse-go/v2 v2.46.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/detectors/gcp v1.33.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/exporter/metric v0.57.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 \
github.com/!johannes!kaufmann/html-to-markdown v1.6.0 \
github.com/!kyle!banks/depth v1.2.1 \
github.com/!make!now!just/heredoc v1.0.0 \
github.com/!microsoft/go-winio v0.6.2 \
github.com/!netflix/go-expect v0.0.0-20220104043353-73e0943537d2 \
github.com/!proton!mail/go-crypto v1.1.6 \
github.com/!puerkito!bio/goquery v1.12.0 \
github.com/!puerkito!bio/purell v1.1.1 \
github.com/!puerkito!bio/urlesc v0.0.0-20170810143723-de5bf2ad4578 \
github.com/!stack!exchange/wmi v1.2.1 \
github.com/agentable/go-intl v0.2.11 \
github.com/alecthomas/assert/v2 v2.11.0 \
github.com/alecthomas/chroma/v2 v2.27.0 \
github.com/alecthomas/repr v0.5.2 \
github.com/andybalholm/brotli v1.2.1 \
github.com/andybalholm/cascadia v1.3.3 \
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be \
github.com/antlr4-go/antlr/v4 v4.13.1 \
github.com/ardanlabs/jinja v1.4.0 \
github.com/ardanlabs/kronk v1.28.6 \
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 \
github.com/atotto/clipboard v0.1.4 \
github.com/aws/aws-sdk-go-v2 v1.42.1 \
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 \
github.com/aws/aws-sdk-go-v2/config v1.32.27 \
github.com/aws/aws-sdk-go-v2/credentials v1.19.26 \
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 \
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 \
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 \
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 \
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 \
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 \
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 \
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 \
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 \
github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 \
github.com/aws/aws-sdk-go-v2/service/signin v1.2.2 \
github.com/aws/aws-sdk-go-v2/service/sso v1.31.5 \
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8 \
github.com/aws/aws-sdk-go-v2/service/sts v1.43.5 \
github.com/aws/smithy-go v1.27.3 \
github.com/aymanbagabas/go-osc52/v2 v2.0.1 \
github.com/aymanbagabas/go-udiff v0.4.1 \
github.com/aymerick/douceur v0.2.0 \
github.com/bahlo/generic-list-go v0.2.0 \
github.com/beevik/ntp v0.3.0 \
github.com/beorn7/perks v1.0.1 \
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d \
github.com/bits-and-blooms/bitset v1.24.4 \
github.com/bmatcuk/doublestar/v4 v4.10.0 \
github.com/bobuhiro11/gokvm v0.0.8-0.20231003020000-f53faca69d28 \
github.com/buger/jsonparser v1.1.2 \
github.com/cenkalti/backoff/v4 v4.1.3 \
github.com/cenkalti/backoff/v5 v5.0.3 \
github.com/cespare/xxhash/v2 v2.3.0 \
github.com/charlievieth/fastwalk v1.0.14 \
github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab \
github.com/charmbracelet/bubbles v0.15.1-0.20230123181021-a6a12c4a31eb \
github.com/charmbracelet/bubbletea v0.24.1 \
github.com/charmbracelet/colorprofile v0.4.3 \
github.com/charmbracelet/harmonica v0.2.0 \
github.com/charmbracelet/lipgloss v0.7.1 \
github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be \
github.com/charmbracelet/ultraviolet v0.0.0-20260703014108-f5a850f9c2b7 \
github.com/charmbracelet/x/ansi v0.11.7 \
github.com/charmbracelet/x/editor v0.2.0 \
github.com/charmbracelet/x/etag v0.2.0 \
github.com/charmbracelet/x/exp/charmtone v0.0.0-20260527151214-009e6338d40d \
github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f \
github.com/charmbracelet/x/exp/ordered v0.1.0 \
github.com/charmbracelet/x/exp/slice v0.0.0-20260622092256-25656177ba8e \
github.com/charmbracelet/x/exp/strings v0.1.0 \
github.com/charmbracelet/x/json v0.2.0 \
github.com/charmbracelet/x/powernap v0.1.6 \
github.com/charmbracelet/x/term v0.2.2 \
github.com/charmbracelet/x/termios v0.1.1 \
github.com/charmbracelet/x/windows v0.2.2 \
github.com/clipperhouse/displaywidth v0.11.0 \
github.com/clipperhouse/stringish v0.1.1 \
github.com/clipperhouse/uax29/v2 v2.7.0 \
github.com/cloudflare/circl v1.6.3 \
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 \
github.com/cockroachdb/apd/v3 v3.2.3 \
github.com/coder/websocket v1.8.14 \
github.com/containerd/console v1.0.4-0.20230706203907-8f6c4e4faef5 \
github.com/containerd/errdefs v1.0.0 \
github.com/containerd/errdefs/pkg v0.3.0 \
github.com/cpuguy83/go-md2man/v2 v2.0.7 \
github.com/creack/goselect v0.1.2 \
github.com/creack/pty v1.1.24 \
github.com/cyphar/filepath-securejoin v0.6.1 \
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc \
github.com/dchest/siphash v1.2.3 \
github.com/denisbrodbeck/machineid v1.0.1 \
github.com/disintegration/imaging v1.6.2 \
github.com/distribution/reference v0.6.0 \
github.com/dlclark/regexp2 v1.11.0 \
github.com/dlclark/regexp2/v2 v2.2.1 \
github.com/dnaeon/go-vcr v1.2.0 \
github.com/docker/go-connections v0.7.0 \
github.com/docker/go-units v0.5.0 \
github.com/dustin/go-humanize v1.0.1 \
github.com/ebitengine/purego v0.10.1 \
github.com/elastic/go-sysinfo v1.15.4 \
github.com/elastic/go-windows v1.0.2 \
github.com/elazarl/goproxy v1.7.2 \
github.com/eliben/go-sentencepiece v0.7.0 \
github.com/emirpasic/gods v1.18.1 \
github.com/envoyproxy/go-control-plane v0.14.0 \
github.com/envoyproxy/go-control-plane/envoy v1.37.0 \
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 \
github.com/envoyproxy/protoc-gen-validate v1.3.3 \
github.com/esiqveland/notify v0.13.3 \
github.com/felixge/httpsnoop v1.1.0 \
github.com/florianl/go-tc v0.4.5-0.20240822175159-7926c32f7299 \
github.com/fsnotify/fsnotify v1.9.0 \
github.com/gen2brain/beeep v0.11.2 \
github.com/ghodss/yaml v1.0.0 \
github.com/gliderlabs/ssh v0.3.8 \
github.com/go-faster/city v1.0.1 \
github.com/go-faster/errors v0.7.1 \
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 \
github.com/go-git/go-billy/v5 v5.9.0 \
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 \
github.com/go-git/go-git/v5 v5.19.1 \
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20231223183121-56fa3ac82ce7 \
github.com/go-jose/go-jose/v4 v4.1.4 \
github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 \
github.com/go-logfmt/logfmt v0.6.0 \
github.com/go-logr/logr v1.4.3 \
github.com/go-logr/stdr v1.2.2 \
github.com/go-ole/go-ole v1.3.0 \
github.com/go-openapi/jsonpointer v0.19.5 \
github.com/go-openapi/jsonreference v0.20.0 \
github.com/go-openapi/spec v0.20.6 \
github.com/go-openapi/swag v0.19.15 \
github.com/go-quicktest/qt v1.101.0 \
github.com/go-sql-driver/mysql v1.10.0 \
github.com/go-viper/mapstructure/v2 v2.5.0 \
github.com/goccy/go-json v0.10.5 \
github.com/goccy/go-yaml v1.19.2 \
github.com/godbus/dbus/v5 v5.2.2 \
github.com/gojuno/minimock/v3 v3.0.8 \
github.com/golang-jwt/jwt/v4 v4.5.2 \
github.com/golang-jwt/jwt/v5 v5.3.1 \
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 \
github.com/golang-sql/sqlexp v0.1.0 \
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 \
github.com/golang/glog v1.2.5 \
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 \
github.com/golang/protobuf v1.5.4 \
github.com/golang/snappy v0.0.4 \
github.com/google/go-cmp v0.7.0 \
github.com/google/go-pkcs11 v0.3.0 \
github.com/google/go-tpm v0.9.2-0.20240919181259-d96ccf715685 \
github.com/google/jsonschema-go v0.4.3 \
github.com/google/martian/v3 v3.3.3 \
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e \
github.com/google/renameio/v2 v2.0.2 \
github.com/google/s2a-go v0.1.9 \
github.com/google/uuid v1.6.0 \
github.com/googleapis/enterprise-certificate-proxy v0.3.17 \
github.com/googleapis/gax-go/v2 v2.22.0 \
github.com/gopacket/gopacket v1.2.0 \
github.com/gorilla/css v1.0.1 \
github.com/gorilla/websocket v1.5.3 \
github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 \
github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 \
github.com/hashicorp/go-cleanhttp v0.5.2 \
github.com/hashicorp/go-getter v1.8.6 \
github.com/hashicorp/go-version v1.9.0 \
github.com/hashicorp/golang-lru/v2 v2.0.7 \
github.com/hexops/gotextdiff v1.0.3 \
github.com/hugelgupf/go-shlex v0.0.0-20200702092117-c80c9d0918fa \
github.com/hugelgupf/vmtest v0.0.0-20240307030256-5d9f3d34a58d \
github.com/hybridgroup/yzma v1.18.0 \
github.com/inconshreveable/mousetrap v1.1.0 \
github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2 \
github.com/invopop/jsonschema v0.14.0 \
github.com/ishidawataru/sctp v0.0.0-20230406120618-7ff4192f6ff2 \
github.com/itchyny/go-yaml v0.0.0-20251001235044-fca9a0999f15 \
github.com/itchyny/gojq v0.12.19 \
github.com/itchyny/timefmt-go v0.1.8 \
github.com/jackc/pgpassfile v1.0.0 \
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 \
github.com/jackc/pgx/v5 v5.10.0 \
github.com/jackc/puddle/v2 v2.2.2 \
github.com/jackmordaunt/icns/v3 v3.0.1 \
github.com/jaypipes/ghw v0.12.0 \
github.com/jaypipes/pcidb v1.0.0 \
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 \
github.com/jezek/xgb v1.1.1 \
github.com/joho/godotenv v1.5.1 \
github.com/jonboulle/clockwork v0.5.0 \
github.com/jordanella/go-ansi-paintbrush v0.0.0-20240728195301-b7ad996ecf3d \
github.com/josharian/intern v1.0.0 \
github.com/josharian/native v1.1.0 \
github.com/jsimonetti/rtnetlink v1.3.5 \
github.com/jupiterrider/ffi v0.7.0 \
github.com/kaey/framebuffer v0.0.0-20140402104929-7b385489a1ff \
github.com/kaptinlin/go-i18n v0.6.0 \
github.com/kaptinlin/jsonpointer v0.4.27 \
github.com/kaptinlin/jsonschema v0.9.3 \
github.com/kaptinlin/messageformat-go/mf1 v0.8.2 \
github.com/kevinburke/ssh_config v1.2.0 \
github.com/klauspost/compress v1.18.6 \
github.com/klauspost/cpuid/v2 v2.3.0 \
github.com/klauspost/pgzip v1.2.6 \
github.com/knz/bubbline v0.0.0-20230717192058-486954f9953f \
github.com/kr/fs v0.1.0 \
github.com/kr/pretty v0.3.1 \
github.com/kr/pty v1.1.1 \
github.com/kr/text v0.2.0 \
github.com/kylelemons/godebug v1.1.0 \
github.com/lucasb-eyer/go-colorful v1.4.0 \
github.com/mailru/easyjson v0.7.7 \
github.com/mattn/go-isatty v0.0.22 \
github.com/mattn/go-localereader v0.0.1 \
github.com/mattn/go-runewidth v0.0.24 \
github.com/mdlayher/netlink v1.7.2 \
github.com/mdlayher/packet v1.1.2 \
github.com/mdlayher/socket v0.5.1 \
github.com/mdlayher/vsock v1.2.1 \
github.com/mfridman/interpolate v0.0.2 \
github.com/mfridman/xflag v0.1.0 \
github.com/microcosm-cc/bluemonday v1.0.27 \
github.com/microsoft/go-mssqldb v1.10.0 \
github.com/mitchellh/go-homedir v1.1.0 \
github.com/mitchellh/mapstructure v1.5.0 \
github.com/moby/docker-image-spec v1.3.1 \
github.com/moby/moby/api v1.55.0 \
github.com/moby/moby/client v0.5.0 \
github.com/modelcontextprotocol/go-sdk v1.6.1 \
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 \
github.com/muesli/cancelreader v0.2.2 \
github.com/muesli/mango v0.1.0 \
github.com/muesli/mango-cobra v1.2.0 \
github.com/muesli/mango-pflag v0.1.0 \
github.com/muesli/reflow v0.3.0 \
github.com/muesli/roff v0.1.0 \
github.com/muesli/termenv v0.15.1 \
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 \
github.com/nanmu42/limitio v1.0.0 \
github.com/ncruces/go-sqlite3 v0.35.1 \
github.com/ncruces/go-sqlite3-wasm/v3 v3.1.35302 \
github.com/ncruces/go-strftime v1.0.0 \
github.com/ncruces/julianday v1.0.0 \
github.com/ncruces/sort v1.0.0 \
github.com/ncruces/wasm2go v0.4.10 \
github.com/ncruces/wbt v1.0.0 \
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 \
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e \
github.com/nxadm/tail v1.4.11 \
github.com/onsi/gomega v1.34.1 \
github.com/opencontainers/go-digest v1.0.0 \
github.com/opencontainers/image-spec v1.1.1 \
github.com/orangecms/go-framebuffer v0.0.0-20200613202404-a0700d90c330 \
github.com/orian/flakyhttp v0.1.1 \
github.com/packetcap/go-pcap v0.0.0-20240528124601-8c87ecf5dbc5 \
github.com/paulmach/orb v0.13.0 \
github.com/pb33f/ordered-map/v2 v2.3.1 \
github.com/peterh/liner v1.2.2 \
github.com/pierrec/lz4/v4 v4.1.26 \
github.com/pjbgf/sha1cd v0.6.0 \
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c \
github.com/pkg/errors v0.9.1 \
github.com/pkg/sftp v1.13.9 \
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 \
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 \
github.com/posthog/posthog-go v1.17.5 \
github.com/pressly/goose/v3 v3.27.2 \
github.com/prometheus/client_golang v1.23.2 \
github.com/prometheus/client_model v0.6.2 \
github.com/prometheus/common v0.69.0 \
github.com/prometheus/procfs v0.20.1 \
github.com/psanford/httpreadat v0.1.0 \
github.com/qjebbs/go-jsons v1.0.0-alpha.6 \
github.com/rck/unit v0.0.3 \
github.com/rekby/gpt v0.0.0-20200219180433-a930afbc6edc \
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec \
github.com/rivo/uniseg v0.4.7 \
github.com/rogpeppe/go-internal v1.14.1 \
github.com/russross/blackfriday/v2 v2.1.0 \
github.com/safchain/ethtool v0.0.0-20200218184317-f459e2d13664 \
github.com/sahilm/fuzzy v0.1.3 \
github.com/sebdah/goldie/v2 v2.5.3 \
github.com/segmentio/asm v1.2.1 \
github.com/segmentio/encoding v0.5.4 \
github.com/sergeymakinen/go-bmp v1.0.0 \
github.com/sergeymakinen/go-ico v1.0.0-beta.0 \
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 \
github.com/sethvargo/go-retry v0.3.0 \
github.com/shopspring/decimal v1.4.0 \
github.com/shurcoo!l/sanitized_anchor_name v1.0.0 \
github.com/sirupsen/logrus v1.9.3 \
github.com/skeema/knownhosts v1.3.1 \
github.com/sourcegraph/jsonrpc2 v0.2.1 \
github.com/spf13/cobra v1.10.2 \
github.com/spf13/pflag v1.0.9 \
github.com/spiffe/go-spiffe/v2 v2.8.1 \
github.com/stretchr/objx v0.5.2 \
github.com/stretchr/testify v1.11.1 \
github.com/swaggo/files/v2 v2.0.0 \
github.com/swaggo/http-swagger/v2 v2.0.2 \
github.com/swaggo/swag v1.16.6 \
github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af \
github.com/therootcompany/xz v1.0.1 \
github.com/tidwall/gjson v1.19.0 \
github.com/tidwall/match v1.1.1 \
github.com/tidwall/pretty v1.2.1 \
github.com/tidwall/sjson v1.2.5 \
github.com/tklauser/go-sysconf v0.3.14 \
github.com/tklauser/numcpus v0.8.0 \
github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc \
github.com/u-root/cpuid v0.0.1-0.20250320140348-cc5fe81d966c \
github.com/u-root/gobusybox/src v0.0.0-20250101170133-2e884e4509c7 \
github.com/u-root/iscsinl v0.1.1-0.20210528121423-84c32645822a \
github.com/u-root/mkuimage v0.0.0-20250701161901-6a9871f2e64f \
github.com/u-root/u-root v0.14.1-0.20250807200646-5e7721023dc7 \
github.com/u-root/uio v0.0.0-20240224005618-d2acac8f3701 \
github.com/ulikunitz/xz v0.5.15 \
github.com/urfave/cli v1.22.17 \
github.com/urfave/cli/v2 v2.3.0 \
github.com/vertica/vertica-sql-go v1.3.6 \
github.com/vishvananda/netlink v1.3.0 \
github.com/vishvananda/netns v0.0.4 \
github.com/vtolstov/go-ioctl v0.0.0-20151206205506-6be9cced4810 \
github.com/wk8/go-ordered-map/v2 v2.1.8 \
github.com/xanzy/ssh-agent v0.3.3 \
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e \
github.com/xyproto/randomstring v1.0.5 \
github.com/ydb-platform/ydb-go-genproto v0.0.0-20260428144813-1c07baab7f7b \
github.com/ydb-platform/ydb-go-sdk/v3 v3.141.1 \
github.com/yosida95/uritemplate/v3 v3.0.2 \
github.com/yuin/goldmark v1.7.8 \
github.com/yuin/goldmark-emoji v1.0.5 \
github.com/zeebo/assert v1.3.0 \
github.com/zeebo/errs v1.4.0 \
github.com/zeebo/xxh3 v1.1.0 \
github.com/ziutek/mymysql v1.5.4 \
go.bug.st/serial v1.6.2 \
go.opencensus.io v0.24.0 \
go.opentelemetry.io/auto/sdk v1.2.1 \
go.opentelemetry.io/contrib/detectors/gcp v1.44.0 \
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 \
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 \
go.opentelemetry.io/otel v1.44.0 \
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 \
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 \
go.opentelemetry.io/otel/metric v1.44.0 \
go.opentelemetry.io/otel/sdk v1.44.0 \
go.opentelemetry.io/otel/sdk/metric v1.44.0 \
go.opentelemetry.io/otel/trace v1.44.0 \
go.opentelemetry.io/proto/otlp v1.10.0 \
go.uber.org/goleak v1.3.0 \
go.uber.org/multierr v1.11.0 \
go.yaml.in/yaml/v2 v2.4.4 \
go.yaml.in/yaml/v3 v3.0.4 \
go.yaml.in/yaml/v4 v4.0.0-rc.3 \
golang.design/x/clipboard v0.8.0 \
golang.design/x/x11 v0.2.0 \
golang.org/x/arch v0.2.0 \
golang.org/x/crypto v0.53.0 \
golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f \
golang.org/x/exp/shiny v0.0.0-20250606033433-dcc06ee1d476 \
golang.org/x/image v0.43.0 \
golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f \
golang.org/x/mod v0.36.0 \
golang.org/x/net v0.56.0 \
golang.org/x/oauth2 v0.36.0 \
golang.org/x/sync v0.21.0 \
golang.org/x/sys v0.46.0 \
golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 \
golang.org/x/term v0.44.0 \
golang.org/x/text v0.38.0 \
golang.org/x/time v0.15.0 \
golang.org/x/tools v0.45.0 \
golang.org/x/tools/go/expect v0.1.1-deprecated \
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated \
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 \
gonum.org/v1/gonum v0.17.0 \
google.golang.org/api v0.286.0 \
google.golang.org/appengine v1.6.8 \
google.golang.org/genai v1.62.0 \
google.golang.org/genproto v0.0.0-20260622175928-b703f567277d \
google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d \
google.golang.org/genproto/googleapis/bytestream v0.0.0-20260610212136-7ab31c22f7ad \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d \
google.golang.org/grpc v1.81.1 \
google.golang.org/protobuf v1.36.11 \
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c \
gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 \
gopkg.in/natefinch/lumberjack.v2 v2.2.1 \
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 \
gopkg.in/warnings.v0 v0.1.2 \
gopkg.in/yaml.v2 v2.4.0 \
gopkg.in/yaml.v3 v3.0.1 \
howett.net/plist v1.0.1 \
lukechampine.com/adiantum v1.1.1 \
modernc.org/cc/v4 v4.28.4 \
modernc.org/ccgo/v4 v4.34.4 \
modernc.org/fileutil v1.4.0 \
modernc.org/gc/v2 v2.6.5 \
modernc.org/gc/v3 v3.1.3 \
modernc.org/goabi0 v0.2.0 \
modernc.org/libc v1.73.4 \
modernc.org/mathutil v1.7.1 \
modernc.org/memory v1.11.0 \
modernc.org/opt v0.2.0 \
modernc.org/sortutil v1.2.1 \
modernc.org/sqlite v1.53.0 \
modernc.org/strutil v1.2.1 \
modernc.org/token v1.1.0 \
mvdan.cc/editorconfig v0.3.0 \
mvdan.cc/sh/moreinterp v0.0.0-20250902163504-3cf4fd5717a5 \
mvdan.cc/sh/v3 v3.13.1 \
pack.ag/tftp v1.0.1-0.20181129014014-07909dfbde3c \
sigs.k8s.io/yaml v1.3.0
MODGO_MODFILES = \
cel.dev/expr v0.24.0 \
cel.dev/expr v0.25.1 \
charm.land/bubbletea/v2 v2.0.7 \
charm.land/lipgloss/v2 v2.0.1 \
charm.land/lipgloss/v2 v2.0.4 \
cloud.google.com/go v0.112.2 \
cloud.google.com/go v0.116.0 \
cloud.google.com/go/auth v0.15.0 \
cloud.google.com/go/auth v0.16.4 \
cloud.google.com/go/auth v0.3.0 \
cloud.google.com/go/auth v0.7.2 \
cloud.google.com/go/auth v0.9.3 \
cloud.google.com/go/auth/oauth2adapt v0.2.2 \
cloud.google.com/go/auth/oauth2adapt v0.2.3 \
cloud.google.com/go/compute/metadata v0.3.0 \
cloud.google.com/go/compute/metadata v0.5.0 \
cloud.google.com/go/compute/metadata v0.6.0 \
cloud.google.com/go/compute/metadata v0.8.0 \
cloud.google.com/go/iam v1.5.2 \
cloud.google.com/go/monitoring v1.24.2 \
cloud.google.com/go/storage v1.56.0 \
github.com/!azure/azure-sdk-for-go/sdk/azcore v1.12.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/detectors/gcp v1.27.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/detectors/gcp v1.31.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/exporter/metric v0.53.0 \
github.com/!google!cloud!platform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 \
github.com/!proton!mail/go-crypto v0.0.0-20221026131551-cf6655e29de4 \
github.com/!puerkito!bio/goquery v1.9.2 \
github.com/alecthomas/chroma/v2 v2.14.0 \
github.com/andybalholm/brotli v1.1.1 \
github.com/andybalholm/cascadia v1.3.2 \
github.com/aws/aws-sdk-go-v2 v1.30.3 \
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 \
github.com/aws/aws-sdk-go-v2/config v1.27.27 \
github.com/aws/aws-sdk-go-v2/credentials v1.17.27 \
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 \
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 \
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 \
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 \
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 \
github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 \
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 \
github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 \
github.com/aws/smithy-go v1.20.3 \
github.com/aws/smithy-go v1.27.1 \
github.com/aymanbagabas/go-udiff v0.2.0 \
github.com/aymanbagabas/go-udiff v0.3.1 \
github.com/buger/jsonparser v1.1.1 \
github.com/charmbracelet/colorprofile v0.4.2 \
github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 \
github.com/charmbracelet/ultraviolet v0.0.0-20260205113103-524a6607adb8 \
github.com/charmbracelet/ultraviolet v0.0.0-20260525132238-948f4557a654 \
github.com/charmbracelet/x/ansi v0.11.6 \
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 \
github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f \
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf \
github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 \
github.com/clipperhouse/displaywidth v0.9.0 \
github.com/clipperhouse/uax29/v2 v2.2.0 \
github.com/clipperhouse/uax29/v2 v2.3.0 \
github.com/clipperhouse/uax29/v2 v2.5.0 \
github.com/cloudflare/circl v1.6.1 \
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 \
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d \
github.com/cpuguy83/go-md2man/v2 v2.0.6 \
github.com/creack/pty v1.1.9 \
github.com/davecgh/go-spew v1.1.0 \
github.com/davecgh/go-spew v1.1.1 \
github.com/envoyproxy/go-control-plane/envoy v1.32.4 \
github.com/envoyproxy/protoc-gen-validate v1.2.1 \
github.com/felixge/httpsnoop v1.0.4 \
github.com/fsnotify/fsnotify v1.6.0 \
github.com/gliderlabs/ssh v0.1.2-0.20181113160402-cbabf5414432 \
github.com/go-jose/go-jose/v4 v4.0.5 \
github.com/go-logr/logr v1.2.2 \
github.com/go-logr/logr v1.4.1 \
github.com/go-logr/logr v1.4.2 \
github.com/go-ole/go-ole v1.2.6 \
github.com/go-openapi/jsonpointer v0.19.3 \
github.com/go-openapi/jsonreference v0.19.6 \
github.com/go-openapi/spec v0.20.4 \
github.com/go-openapi/swag v0.19.5 \
github.com/godbus/dbus/v5 v5.1.0 \
github.com/golang-jwt/jwt/v5 v5.2.1 \
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da \
github.com/golang/protobuf v1.5.0 \
github.com/google/go-cmp v0.6.0 \
github.com/google/s2a-go v0.1.7 \
github.com/google/s2a-go v0.1.8 \
github.com/google/uuid v1.3.0 \
github.com/googleapis/enterprise-certificate-proxy v0.3.14 \
github.com/googleapis/enterprise-certificate-proxy v0.3.16 \
github.com/googleapis/enterprise-certificate-proxy v0.3.2 \
github.com/googleapis/enterprise-certificate-proxy v0.3.4 \
github.com/googleapis/enterprise-certificate-proxy v0.3.5 \
github.com/googleapis/enterprise-certificate-proxy v0.3.6 \
github.com/googleapis/gax-go/v2 v2.12.3 \
github.com/googleapis/gax-go/v2 v2.14.1 \
github.com/googleapis/gax-go/v2 v2.15.0 \
github.com/googleapis/gax-go/v2 v2.21.0 \
github.com/gorilla/websocket v1.4.1 \
github.com/inconshreveable/mousetrap v1.0.0 \
github.com/invopop/jsonschema v0.13.0 \
github.com/kevinburke/ssh_config v1.1.0 \
github.com/klauspost/compress v1.17.11 \
github.com/klauspost/compress v1.17.4 \
github.com/klauspost/compress v1.18.5 \
github.com/klauspost/cpuid/v2 v2.2.10 \
github.com/kr/pretty v0.1.0 \
github.com/kr/text v0.1.0 \
github.com/lucasb-eyer/go-colorful v1.2.0 \
github.com/lucasb-eyer/go-colorful v1.3.0 \
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 \
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e \
github.com/mailru/easyjson v0.7.6 \
github.com/mattn/go-isatty v0.0.20 \
github.com/mattn/go-isatty v0.0.21 \
github.com/mattn/go-runewidth v0.0.14 \
github.com/mattn/go-runewidth v0.0.19 \
github.com/mattn/go-runewidth v0.0.20 \
github.com/mattn/go-runewidth v0.0.23 \
github.com/pierrec/lz4/v4 v4.1.14 \
github.com/pierrec/lz4/v4 v4.1.22 \
github.com/pkg/errors v0.8.1 \
github.com/pmezard/go-difflib v1.0.0 \
github.com/prometheus/common v0.66.1 \
github.com/prometheus/procfs v0.16.1 \
github.com/rivo/uniseg v0.4.4 \
github.com/rogpeppe/go-internal v1.12.0 \
github.com/russross/blackfriday/v2 v2.0.1 \
github.com/sahilm/fuzzy v0.1.0 \
github.com/segmentio/asm v1.1.3 \
github.com/sergi/go-diff v1.0.0 \
github.com/sergi/go-diff v1.3.1 \
github.com/spf13/cobra v1.5.0 \
github.com/spf13/cobra v1.9.1 \
github.com/spf13/pflag v1.0.5 \
github.com/spf13/pflag v1.0.6 \
github.com/spf13/pflag v1.0.7 \
github.com/spiffe/go-spiffe/v2 v2.5.0 \
github.com/spiffe/go-spiffe/v2 v2.6.0 \
github.com/stretchr/objx v0.1.0 \
github.com/stretchr/objx v0.4.0 \
github.com/stretchr/objx v0.5.0 \
github.com/stretchr/testify v1.10.0 \
github.com/stretchr/testify v1.3.0 \
github.com/stretchr/testify v1.4.0 \
github.com/stretchr/testify v1.6.1 \
github.com/stretchr/testify v1.7.0 \
github.com/stretchr/testify v1.7.1 \
github.com/stretchr/testify v1.8.0 \
github.com/stretchr/testify v1.8.4 \
github.com/stretchr/testify v1.9.0 \
github.com/swaggo/swag v1.8.1 \
github.com/tidwall/gjson v1.14.2 \
github.com/tidwall/gjson v1.18.0 \
github.com/tidwall/pretty v1.2.0 \
github.com/ulikunitz/xz v0.5.11 \
github.com/yuin/goldmark v1.4.13 \
github.com/yuin/goldmark v1.7.1 \
go.opentelemetry.io/auto/sdk v1.1.0 \
go.opentelemetry.io/contrib/detectors/gcp v1.36.0 \
go.opentelemetry.io/contrib/detectors/gcp v1.42.0 \
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 \
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 \
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 \
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 \
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 \
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 \
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 \
go.opentelemetry.io/otel v1.24.0 \
go.opentelemetry.io/otel v1.36.0 \
go.opentelemetry.io/otel v1.38.0 \
go.opentelemetry.io/otel v1.43.0 \
go.opentelemetry.io/otel/metric v1.24.0 \
go.opentelemetry.io/otel/metric v1.36.0 \
go.opentelemetry.io/otel/metric v1.43.0 \
go.opentelemetry.io/otel/sdk v1.36.0 \
go.opentelemetry.io/otel/sdk v1.43.0 \
go.opentelemetry.io/otel/sdk/metric v1.36.0 \
go.opentelemetry.io/otel/sdk/metric v1.43.0 \
go.opentelemetry.io/otel/trace v1.24.0 \
go.opentelemetry.io/otel/trace v1.36.0 \
go.opentelemetry.io/otel/trace v1.38.0 \
go.opentelemetry.io/otel/trace v1.43.0 \
go.yaml.in/yaml/v2 v2.4.2 \
go.yaml.in/yaml/v4 v4.0.0-rc.2 \
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 \
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 \
golang.org/x/crypto v0.13.0 \
golang.org/x/crypto v0.19.0 \
golang.org/x/crypto v0.22.0 \
golang.org/x/crypto v0.23.0 \
golang.org/x/crypto v0.25.0 \
golang.org/x/crypto v0.31.0 \
golang.org/x/crypto v0.32.0 \
golang.org/x/crypto v0.36.0 \
golang.org/x/crypto v0.40.0 \
golang.org/x/crypto v0.41.0 \
golang.org/x/crypto v0.47.0 \
golang.org/x/crypto v0.49.0 \
golang.org/x/crypto v0.50.0 \
golang.org/x/crypto v0.52.0 \
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 \
golang.org/x/exp v0.0.0-20231006140011-7918f672742d \
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 \
golang.org/x/exp/shiny v0.0.0-20230817173708-d852ddb80c63 \
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 \
golang.org/x/image v0.14.0 \
golang.org/x/image v0.18.0 \
golang.org/x/image v0.28.0 \
golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a \
golang.org/x/mod v0.12.0 \
golang.org/x/mod v0.15.0 \
golang.org/x/mod v0.17.0 \
golang.org/x/mod v0.24.0 \
golang.org/x/mod v0.25.0 \
golang.org/x/mod v0.26.0 \
golang.org/x/mod v0.29.0 \
golang.org/x/mod v0.35.0 \
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 \
golang.org/x/mod v0.8.0 \
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 \
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 \
golang.org/x/net v0.0.0-20220722155237-a158d28d115b \
golang.org/x/net v0.10.0 \
golang.org/x/net v0.15.0 \
golang.org/x/net v0.21.0 \
golang.org/x/net v0.24.0 \
golang.org/x/net v0.25.0 \
golang.org/x/net v0.26.0 \
golang.org/x/net v0.27.0 \
golang.org/x/net v0.33.0 \
golang.org/x/net v0.34.0 \
golang.org/x/net v0.37.0 \
golang.org/x/net v0.38.0 \
golang.org/x/net v0.39.0 \
golang.org/x/net v0.41.0 \
golang.org/x/net v0.43.0 \
golang.org/x/net v0.51.0 \
golang.org/x/net v0.52.0 \
golang.org/x/net v0.53.0 \
golang.org/x/net v0.54.0 \
golang.org/x/net v0.55.0 \
golang.org/x/net v0.6.0 \
golang.org/x/net v0.9.0 \
golang.org/x/oauth2 v0.19.0 \
golang.org/x/oauth2 v0.28.0 \
golang.org/x/oauth2 v0.30.0 \
golang.org/x/oauth2 v0.35.0 \
golang.org/x/sync v0.0.0-20190423024810-112230192c58 \
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 \
golang.org/x/sync v0.1.0 \
golang.org/x/sync v0.10.0 \
golang.org/x/sync v0.12.0 \
golang.org/x/sync v0.15.0 \
golang.org/x/sync v0.16.0 \
golang.org/x/sync v0.17.0 \
golang.org/x/sync v0.18.0 \
golang.org/x/sync v0.19.0 \
golang.org/x/sync v0.20.0 \
golang.org/x/sync v0.3.0 \
golang.org/x/sync v0.6.0 \
golang.org/x/sync v0.7.0 \
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a \
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 \
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 \
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08 \
golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a \
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad \
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a \
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664 \
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f \
golang.org/x/sys v0.0.0-20220908164124-27713097b956 \
golang.org/x/sys v0.1.0 \
golang.org/x/sys v0.10.0 \
golang.org/x/sys v0.12.0 \
golang.org/x/sys v0.13.0 \
golang.org/x/sys v0.15.0 \
golang.org/x/sys v0.17.0 \
golang.org/x/sys v0.19.0 \
golang.org/x/sys v0.20.0 \
golang.org/x/sys v0.21.0 \
golang.org/x/sys v0.22.0 \
golang.org/x/sys v0.26.0 \
golang.org/x/sys v0.27.0 \
golang.org/x/sys v0.28.0 \
golang.org/x/sys v0.29.0 \
golang.org/x/sys v0.30.0 \
golang.org/x/sys v0.31.0 \
golang.org/x/sys v0.33.0 \
golang.org/x/sys v0.34.0 \
golang.org/x/sys v0.35.0 \
golang.org/x/sys v0.36.0 \
golang.org/x/sys v0.38.0 \
golang.org/x/sys v0.40.0 \
golang.org/x/sys v0.41.0 \
golang.org/x/sys v0.42.0 \
golang.org/x/sys v0.43.0 \
golang.org/x/sys v0.44.0 \
golang.org/x/sys v0.45.0 \
golang.org/x/sys v0.5.0 \
golang.org/x/sys v0.7.0 \
golang.org/x/sys v0.8.0 \
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 \
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 \
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 \
golang.org/x/term v0.12.0 \
golang.org/x/term v0.17.0 \
golang.org/x/term v0.19.0 \
golang.org/x/term v0.20.0 \
golang.org/x/term v0.27.0 \
golang.org/x/term v0.30.0 \
golang.org/x/term v0.41.0 \
golang.org/x/term v0.5.0 \
golang.org/x/term v0.7.0 \
golang.org/x/term v0.8.0 \
golang.org/x/text v0.13.0 \
golang.org/x/text v0.14.0 \
golang.org/x/text v0.15.0 \
golang.org/x/text v0.16.0 \
golang.org/x/text v0.21.0 \
golang.org/x/text v0.23.0 \
golang.org/x/text v0.24.0 \
golang.org/x/text v0.27.0 \
golang.org/x/text v0.28.0 \
golang.org/x/text v0.3.0 \
golang.org/x/text v0.3.3 \
golang.org/x/text v0.3.7 \
golang.org/x/text v0.34.0 \
golang.org/x/text v0.35.0 \
golang.org/x/text v0.36.0 \
golang.org/x/text v0.37.0 \
golang.org/x/text v0.7.0 \
golang.org/x/text v0.9.0 \
golang.org/x/time v0.12.0 \
golang.org/x/time v0.5.0 \
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e \
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e \
golang.org/x/tools v0.1.12 \
golang.org/x/tools v0.11.0 \
golang.org/x/tools v0.13.0 \
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d \
golang.org/x/tools v0.31.0 \
golang.org/x/tools v0.34.0 \
golang.org/x/tools v0.35.0 \
golang.org/x/tools v0.38.0 \
golang.org/x/tools v0.42.0 \
golang.org/x/tools v0.44.0 \
golang.org/x/tools v0.6.0 \
google.golang.org/api v0.177.0 \
google.golang.org/api v0.189.0 \
google.golang.org/api v0.247.0 \
google.golang.org/api v0.272.0 \
google.golang.org/api v0.274.0 \
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 \
google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 \
google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 \
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 \
google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 \
google.golang.org/genproto/googleapis/api v0.0.0-20260319201613-d00831a3d3e7 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade \
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e \
google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260420184626-e10c466a9529 \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa \
google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad \
google.golang.org/grpc v1.63.2 \
google.golang.org/grpc v1.64.1 \
google.golang.org/grpc v1.66.2 \
google.golang.org/grpc v1.71.0 \
google.golang.org/grpc v1.74.2 \
google.golang.org/grpc v1.79.3 \
google.golang.org/grpc v1.80.0 \
google.golang.org/protobuf v1.34.2 \
google.golang.org/protobuf v1.36.7 \
google.golang.org/protobuf v1.36.8 \
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 \
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 \
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 \
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f \
gopkg.in/yaml.v2 v2.2.2 \
gopkg.in/yaml.v2 v2.2.8 \
gopkg.in/yaml.v3 v3.0.0 \
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c \
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 \
howett.net/plist v1.0.0 \
mvdan.cc/sh/v3 v3.11.0

View File

@@ -0,0 +1,120 @@
--- internal/cmd/login.go
+++ internal/cmd/login.go
@@ -6,12 +6,14 @@
"fmt"
"os"
"os/signal"
+ "strings"
"charm.land/lipgloss/v2"
"github.com/charmbracelet/crush/internal/client"
"github.com/charmbracelet/crush/internal/clipboard"
"github.com/charmbracelet/crush/internal/config"
"github.com/charmbracelet/crush/internal/oauth"
+ "github.com/charmbracelet/crush/internal/oauth/claude"
"github.com/charmbracelet/crush/internal/oauth/copilot"
"github.com/charmbracelet/crush/internal/oauth/hyper"
"github.com/charmbracelet/x/ansi"
@@ -25,11 +27,14 @@
Short: "Login Crush to a platform",
Long: `Login Crush to a specified platform.
The platform should be provided as an argument.
-Available platforms are: hyper, copilot.`,
+Available platforms are: hyper, claude, copilot.`,
Example: `
# Authenticate with Charm Hyper
crush login
+# Authenticate with Claude Code Max
+crush login claude
+
# Authenticate with GitHub Copilot
crush login copilot
@@ -38,6 +43,8 @@
`,
ValidArgs: []cobra.Completion{
"hyper",
+ "claude",
+ "anthropic",
"copilot",
"github",
"github-copilot",
@@ -64,6 +71,8 @@
switch provider {
case "hyper":
return loginHyper(c, ws.ID, force)
+ case "anthropic", "claude":
+ return loginClaude(c, ws.ID, force)
case "copilot", "github", "github-copilot":
return loginCopilot(c, ws.ID, force)
default:
@@ -140,6 +149,68 @@
fmt.Println()
fmt.Println("You're now authenticated with Hyper!")
+ return nil
+}
+
+func loginClaude(c *client.Client, wsID string, force bool) error {
+ ctx := getLoginContext()
+
+ if !force {
+ cfg, err := c.GetConfig(ctx, wsID)
+ if err == nil && cfg != nil {
+ if pc, ok := cfg.Providers.Get("anthropic"); ok && pc.OAuthToken != nil {
+ fmt.Println("You are already logged in to Claude Code Max.")
+ fmt.Println("Use --force to re-authenticate.")
+ return nil
+ }
+ }
+ }
+
+ verifier, challenge, err := claude.GetChallenge()
+ if err != nil {
+ return err
+ }
+ authURL, err := claude.AuthorizeURL(verifier, challenge)
+ if err != nil {
+ return err
+ }
+
+ fmt.Println("Open the following URL to authorize your Claude Code Max subscription:")
+ fmt.Println()
+ fmt.Println(lipgloss.NewStyle().Hyperlink(authURL, "id=claude").Render(authURL))
+ fmt.Println()
+ fmt.Println("Press enter to open in your browser...")
+ waitEnter()
+ if err := browser.OpenURL(authURL); err != nil {
+ fmt.Println("Could not open the URL. Open it manually in your browser.")
+ }
+
+ fmt.Println()
+ fmt.Println("After authorizing, paste the code shown on the page and press enter:")
+ fmt.Println()
+ fmt.Print("> ")
+ var code string
+ for code == "" {
+ _, _ = fmt.Scan(&code)
+ code = strings.TrimSpace(code)
+ }
+
+ fmt.Println()
+ fmt.Println("Exchanging authorization code...")
+ token, err := claude.ExchangeToken(ctx, code, verifier)
+ if err != nil {
+ return err
+ }
+
+ if err := cmp.Or(
+ c.SetConfigField(ctx, wsID, config.ScopeGlobal, "providers.anthropic.api_key", token.AccessToken),
+ c.SetConfigField(ctx, wsID, config.ScopeGlobal, "providers.anthropic.oauth", token),
+ ); err != nil {
+ return err
+ }
+
+ fmt.Println()
+ fmt.Println("You're now authenticated with Claude Code Max!")
return nil
}

View File

@@ -0,0 +1,23 @@
--- internal/config/config.go
+++ internal/config/config.go
@@ -177,6 +177,22 @@ func (c *ProviderConfig) SetupGitHubCopilot() {
maps.Copy(c.ExtraHeaders, copilot.Headers())
}
+func (c *ProviderConfig) SetupClaudeCode() {
+ c.FlatRate = true
+ c.SystemPromptPrefix = "You are Claude Code, Anthropic's official CLI for Claude."
+ if c.ExtraHeaders == nil {
+ c.ExtraHeaders = make(map[string]string)
+ }
+ c.ExtraHeaders["anthropic-version"] = "2023-06-01"
+ const want = "oauth-2025-04-20"
+ if v := c.ExtraHeaders["anthropic-beta"]; !strings.Contains(v, want) {
+ if v != "" {
+ v += ","
+ }
+ c.ExtraHeaders["anthropic-beta"] = v + want
+ }
+}
+
type MCPType string

View File

@@ -0,0 +1,18 @@
--- internal/config/load.go
+++ internal/config/load.go
@@ -287,14 +287,7 @@
switch {
case p.ID == catwalk.InferenceProviderAnthropic && config.OAuthToken != nil:
- // Claude Code subscription is not supported anymore. Remove to show onboarding.
- // RemoveConfigField persists the deletion to disk. The in-memory
- // state is kept consistent by the Providers.Del call below; any
- // concurrent reload that races with this write will also see the
- // removal because it re-reads from disk.
- store.RemoveConfigField(ScopeGlobal, "providers.anthropic")
- c.Providers.Del(string(p.ID))
- continue
+ prepared.SetupClaudeCode()
case p.ID == catwalk.InferenceProviderCopilot && config.OAuthToken != nil:
prepared.SetupGitHubCopilot()
}

View File

@@ -0,0 +1,52 @@
--- internal/config/store.go
+++ internal/config/store.go
@@ -16,6 +16,7 @@
"github.com/charmbracelet/crush/internal/env"
"github.com/charmbracelet/crush/internal/lock"
"github.com/charmbracelet/crush/internal/oauth"
+ "github.com/charmbracelet/crush/internal/oauth/claude"
"github.com/charmbracelet/crush/internal/oauth/copilot"
"github.com/charmbracelet/crush/internal/oauth/hyper"
"github.com/tidwall/gjson"
@@ -470,6 +471,8 @@
providerConfig.APIKey = v.AccessToken
providerConfig.OAuthToken = v
switch providerID {
+ case string(catwalk.InferenceProviderAnthropic):
+ providerConfig.SetupClaudeCode()
case string(catwalk.InferenceProviderCopilot):
providerConfig.SetupGitHubCopilot()
}
@@ -596,7 +599,10 @@
slog.Info("Successfully refreshed OAuth token", "provider", providerID)
providerConfig.OAuthToken = refreshedToken
providerConfig.APIKey = refreshedToken.AccessToken
- if providerID == string(catwalk.InferenceProviderCopilot) {
+ switch providerID {
+ case string(catwalk.InferenceProviderAnthropic):
+ providerConfig.SetupClaudeCode()
+ case string(catwalk.InferenceProviderCopilot):
providerConfig.SetupGitHubCopilot()
}
cfg.Providers.Set(providerID, providerConfig)
@@ -638,6 +644,8 @@
return s.exchangeToken(ctx, providerID, refreshToken)
}
switch providerID {
+ case string(catwalk.InferenceProviderAnthropic):
+ return claude.RefreshToken(ctx, refreshToken)
case string(catwalk.InferenceProviderCopilot):
return copilot.RefreshToken(ctx, refreshToken)
case hyperp.Name:
@@ -662,7 +670,10 @@
func (s *ConfigStore) applyToken(providerConfig ProviderConfig, token *oauth.Token, providerID string) error {
providerConfig.OAuthToken = token
providerConfig.APIKey = token.AccessToken
- if providerID == string(catwalk.InferenceProviderCopilot) {
+ switch providerID {
+ case string(catwalk.InferenceProviderAnthropic):
+ providerConfig.SetupClaudeCode()
+ case string(catwalk.InferenceProviderCopilot):
providerConfig.SetupGitHubCopilot()
}
s.Config().Providers.Set(providerID, providerConfig)

View File

@@ -0,0 +1,31 @@
--- /dev/null
+++ internal/oauth/claude/challenge.go
@@ -0,0 +1,28 @@
+package claude
+
+import (
+ "crypto/rand"
+ "crypto/sha256"
+ "encoding/base64"
+ "strings"
+)
+
+// GetChallenge generates a PKCE verifier and its corresponding challenge.
+func GetChallenge() (verifier string, challenge string, err error) {
+ bytes := make([]byte, 32)
+ if _, err := rand.Read(bytes); err != nil {
+ return "", "", err
+ }
+ verifier = encodeBase64(bytes)
+ hash := sha256.Sum256([]byte(verifier))
+ challenge = encodeBase64(hash[:])
+ return verifier, challenge, nil
+}
+
+func encodeBase64(input []byte) (encoded string) {
+ encoded = base64.StdEncoding.EncodeToString(input)
+ encoded = strings.ReplaceAll(encoded, "=", "")
+ encoded = strings.ReplaceAll(encoded, "+", "-")
+ encoded = strings.ReplaceAll(encoded, "/", "_")
+ return encoded
+}

View File

@@ -0,0 +1,129 @@
--- /dev/null
+++ internal/oauth/claude/oauth.go
@@ -0,0 +1,126 @@
+package claude
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+ "net/url"
+ "strings"
+ "time"
+
+ "github.com/charmbracelet/crush/internal/oauth"
+)
+
+const clientId = "9d1c250a-e61b-44d9-88ed-5944d1962f5e"
+
+// AuthorizeURL returns the Claude Code Max OAuth2 authorization URL.
+func AuthorizeURL(verifier, challenge string) (string, error) {
+ u, err := url.Parse("https://claude.ai/oauth/authorize")
+ if err != nil {
+ return "", err
+ }
+ q := u.Query()
+ q.Set("response_type", "code")
+ q.Set("client_id", clientId)
+ q.Set("redirect_uri", "https://console.anthropic.com/oauth/code/callback")
+ q.Set("scope", "org:create_api_key user:profile user:inference")
+ q.Set("code_challenge", challenge)
+ q.Set("code_challenge_method", "S256")
+ q.Set("state", verifier)
+ u.RawQuery = q.Encode()
+ return u.String(), nil
+}
+
+// ExchangeToken exchanges the authorization code for an OAuth2 token.
+func ExchangeToken(ctx context.Context, code, verifier string) (*oauth.Token, error) {
+ code = strings.TrimSpace(code)
+ parts := strings.SplitN(code, "#", 2)
+ pure := parts[0]
+ state := ""
+ if len(parts) > 1 {
+ state = parts[1]
+ }
+
+ reqBody := map[string]string{
+ "code": pure,
+ "state": state,
+ "grant_type": "authorization_code",
+ "client_id": clientId,
+ "redirect_uri": "https://console.anthropic.com/oauth/code/callback",
+ "code_verifier": verifier,
+ }
+
+ resp, err := request(ctx, "POST", "https://console.anthropic.com/v1/oauth/token", reqBody)
+ if err != nil {
+ return nil, err
+ }
+ defer resp.Body.Close()
+
+ body, err := io.ReadAll(resp.Body)
+ if err != nil {
+ return nil, err
+ }
+
+ if resp.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("claude code max: failed to exchange token: status %d body %q", resp.StatusCode, string(body))
+ }
+
+ var token oauth.Token
+ if err := json.Unmarshal(body, &token); err != nil {
+ return nil, err
+ }
+ token.SetExpiresAt()
+ return &token, nil
+}
+
+// RefreshToken refreshes the OAuth2 token using the provided refresh token.
+func RefreshToken(ctx context.Context, refreshToken string) (*oauth.Token, error) {
+ reqBody := map[string]string{
+ "grant_type": "refresh_token",
+ "refresh_token": refreshToken,
+ "client_id": clientId,
+ }
+
+ resp, err := request(ctx, "POST", "https://console.anthropic.com/v1/oauth/token", reqBody)
+ if err != nil {
+ return nil, err
+ }
+ defer resp.Body.Close()
+
+ body, err := io.ReadAll(resp.Body)
+ if err != nil {
+ return nil, err
+ }
+
+ if resp.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("claude code max: failed to refresh token: status %d body %q", resp.StatusCode, string(body))
+ }
+
+ var token oauth.Token
+ if err := json.Unmarshal(body, &token); err != nil {
+ return nil, err
+ }
+ token.SetExpiresAt()
+ return &token, nil
+}
+
+func request(ctx context.Context, method, url string, body any) (*http.Response, error) {
+ date, err := json.Marshal(body)
+ if err != nil {
+ return nil, err
+ }
+
+ req, err := http.NewRequestWithContext(ctx, method, url, bytes.NewReader(date))
+ if err != nil {
+ return nil, err
+ }
+
+ req.Header.Set("Content-Type", "application/json")
+ req.Header.Set("User-Agent", "anthropic")
+
+ client := &http.Client{Timeout: 30 * time.Second}
+ return client.Do(req)
+}

View File

@@ -0,0 +1,244 @@
--- /dev/null
+++ internal/ui/dialog/oauth_claude.go
@@ -0,0 +1,241 @@
+package dialog
+
+import (
+ "context"
+ "fmt"
+ "strings"
+
+ "charm.land/bubbles/v2/help"
+ "charm.land/bubbles/v2/key"
+ "charm.land/bubbles/v2/spinner"
+ "charm.land/bubbles/v2/textinput"
+ tea "charm.land/bubbletea/v2"
+ "charm.land/catwalk/pkg/catwalk"
+ "github.com/charmbracelet/crush/internal/config"
+ "github.com/charmbracelet/crush/internal/oauth"
+ "github.com/charmbracelet/crush/internal/oauth/claude"
+ "github.com/charmbracelet/crush/internal/ui/common"
+ "github.com/charmbracelet/crush/internal/ui/util"
+ uv "github.com/charmbracelet/ultraviolet"
+ "github.com/pkg/browser"
+)
+
+type oauthClaudeState int
+
+const (
+ oauthClaudeStateInput oauthClaudeState = iota
+ oauthClaudeStateExchanging
+ oauthClaudeStateError
+)
+
+type oauthClaudeComplete struct{ token *oauth.Token }
+type oauthClaudeError struct{ err error }
+
+// OAuthClaudeID is the identifier for the Claude OAuth dialog.
+const OAuthClaudeID = "oauth_claude"
+
+// OAuthClaude is a dialog for Claude Code Max PKCE authentication.
+type OAuthClaude struct {
+ com *common.Common
+ isOnboarding bool
+ provider catwalk.Provider
+ model config.SelectedModel
+ modelType config.SelectedModelType
+
+ width int
+ state oauthClaudeState
+ verifier string
+ verificationURL string
+
+ keyMap struct {
+ Submit key.Binding
+ Open key.Binding
+ Close key.Binding
+ }
+ input textinput.Model
+ spinner spinner.Model
+ help help.Model
+}
+
+var _ Dialog = (*OAuthClaude)(nil)
+
+// NewOAuthClaude creates a new Claude PKCE authentication dialog.
+func NewOAuthClaude(
+ com *common.Common,
+ isOnboarding bool,
+ provider catwalk.Provider,
+ model config.SelectedModel,
+ modelType config.SelectedModelType,
+) (*OAuthClaude, tea.Cmd) {
+ verifier, challenge, err := claude.GetChallenge()
+ if err != nil {
+ m := &OAuthClaude{com: com, isOnboarding: isOnboarding, provider: provider, model: model, modelType: modelType, width: 60, state: oauthClaudeStateError}
+ return m, util.ReportError(fmt.Errorf("failed to generate PKCE challenge: %w", err))
+ }
+ authURL, err := claude.AuthorizeURL(verifier, challenge)
+ if err != nil {
+ m := &OAuthClaude{com: com, isOnboarding: isOnboarding, provider: provider, model: model, modelType: modelType, width: 60, state: oauthClaudeStateError}
+ return m, util.ReportError(fmt.Errorf("failed to build auth URL: %w", err))
+ }
+
+ t := com.Styles
+ m := &OAuthClaude{
+ com: com, isOnboarding: isOnboarding, provider: provider,
+ model: model, modelType: modelType, width: 60,
+ state: oauthClaudeStateInput, verifier: verifier, verificationURL: authURL,
+ }
+
+ innerWidth := m.width - t.Dialog.View.GetHorizontalFrameSize() - 2
+ m.input = textinput.New()
+ m.input.SetVirtualCursor(false)
+ m.input.Placeholder = "Paste authorization code..."
+ m.input.SetStyles(com.Styles.TextInput)
+ m.input.Focus()
+ m.input.SetWidth(max(0, innerWidth-t.Dialog.InputPrompt.GetHorizontalFrameSize()-1))
+ m.input.Prompt = "> "
+
+ m.spinner = spinner.New(
+ spinner.WithSpinner(spinner.Dot),
+ spinner.WithStyle(t.Dialog.APIKey.Spinner),
+ )
+ m.help = help.New()
+ m.help.Styles = t.DialogHelpStyles()
+
+ m.keyMap.Submit = key.NewBinding(key.WithKeys("enter", "ctrl+y"), key.WithHelp("enter", "submit"))
+ m.keyMap.Open = key.NewBinding(key.WithKeys("o"), key.WithHelp("o", "open browser"))
+ m.keyMap.Close = CloseKey
+
+ return m, nil
+}
+
+func (m *OAuthClaude) ID() string { return OAuthClaudeID }
+
+func (m *OAuthClaude) HandleMsg(msg tea.Msg) Action {
+ switch msg := msg.(type) {
+ case oauthClaudeComplete:
+ err := m.com.Workspace.SetProviderAPIKey(config.ScopeGlobal, string(m.provider.ID), msg.token)
+ if err != nil {
+ return ActionCmd{util.ReportError(fmt.Errorf("failed to save token: %w", err))}
+ }
+ return ActionSelectModel{Provider: m.provider, Model: m.model, ModelType: m.modelType}
+
+ case oauthClaudeError:
+ m.state = oauthClaudeStateError
+ return ActionCmd{util.ReportError(msg.err)}
+
+ case spinner.TickMsg:
+ if m.state == oauthClaudeStateExchanging {
+ var cmd tea.Cmd
+ m.spinner, cmd = m.spinner.Update(msg)
+ if cmd != nil {
+ return ActionCmd{cmd}
+ }
+ }
+
+ case tea.KeyPressMsg:
+ switch {
+ case m.state == oauthClaudeStateExchanging:
+ // absorb input during exchange
+ case key.Matches(msg, m.keyMap.Close):
+ return ActionClose{}
+ case key.Matches(msg, m.keyMap.Open) && m.state == oauthClaudeStateInput:
+ _ = browser.OpenURL(m.verificationURL)
+ case key.Matches(msg, m.keyMap.Submit) && m.state == oauthClaudeStateInput:
+ code := strings.TrimSpace(m.input.Value())
+ if code == "" {
+ return nil
+ }
+ m.state = oauthClaudeStateExchanging
+ verifier := m.verifier
+ return ActionCmd{tea.Batch(m.spinner.Tick, func() tea.Msg {
+ token, err := claude.ExchangeToken(context.Background(), code, verifier)
+ if err != nil {
+ return oauthClaudeError{err}
+ }
+ return oauthClaudeComplete{token}
+ })}
+ default:
+ if m.state == oauthClaudeStateInput {
+ var cmd tea.Cmd
+ m.input, cmd = m.input.Update(msg)
+ if cmd != nil {
+ return ActionCmd{cmd}
+ }
+ }
+ }
+
+ case tea.PasteMsg:
+ if m.state == oauthClaudeStateInput {
+ var cmd tea.Cmd
+ m.input, cmd = m.input.Update(msg)
+ if cmd != nil {
+ return ActionCmd{cmd}
+ }
+ }
+ }
+ return nil
+}
+
+func (m *OAuthClaude) Cursor() *tea.Cursor {
+ return InputCursor(m.com.Styles, m.input.Cursor())
+}
+
+func (m *OAuthClaude) Draw(scr uv.Screen, area uv.Rectangle) *tea.Cursor {
+ t := m.com.Styles
+ dialogStyle := t.Dialog.View.Width(m.width)
+ helpStyle := t.Dialog.HelpView.Width(m.width - dialogStyle.GetHorizontalFrameSize())
+ textStyle := t.Dialog.SecondaryText
+ inputStyle := t.Dialog.InputPrompt
+ linkStyle := t.Dialog.OAuth.Link
+
+ if m.state == oauthClaudeStateExchanging {
+ m.input.Prompt = m.spinner.View()
+ } else {
+ m.input.Prompt = "> "
+ }
+
+ content := strings.Join([]string{
+ m.headerView(),
+ textStyle.Render("Visit the URL and paste the authorization code:"),
+ "",
+ textStyle.Render(linkStyle.Hyperlink(m.verificationURL, "id=oauth-claude").Render(m.verificationURL)),
+ "",
+ inputStyle.Render(m.input.View()),
+ "",
+ helpStyle.Render(m.help.View(m)),
+ }, "\n")
+
+ cur := m.Cursor()
+ if m.isOnboarding {
+ cur = adjustOnboardingInputCursor(t, cur)
+ DrawOnboardingCursor(scr, area, content, cur)
+ } else {
+ view := dialogStyle.Render(content)
+ DrawCenterCursor(scr, area, view, cur)
+ }
+ return cur
+}
+
+func (m *OAuthClaude) headerView() string {
+ t := m.com.Styles
+ titleStyle := t.Dialog.Title
+ textStyle := t.Dialog.PrimaryText
+ dialogStyle := t.Dialog.View.Width(m.width)
+ title := fmt.Sprintf("Authenticate with %s", m.provider.Name)
+ if m.isOnboarding {
+ return textStyle.Render(title)
+ }
+ headerOffset := titleStyle.GetHorizontalFrameSize() + dialogStyle.GetHorizontalFrameSize()
+ return common.DialogTitle(t, titleStyle.Render(title), m.width-headerOffset, t.Dialog.TitleGradFromColor, t.Dialog.TitleGradToColor)
+}
+
+func (m *OAuthClaude) ShortHelp() []key.Binding {
+ if m.state == oauthClaudeStateInput {
+ return []key.Binding{m.keyMap.Open, m.keyMap.Submit, m.keyMap.Close}
+ }
+ return []key.Binding{m.keyMap.Close}
+}
+
+func (m *OAuthClaude) FullHelp() [][]key.Binding {
+ return [][]key.Binding{m.ShortHelp()}
+}

View File

@@ -0,0 +1,11 @@
--- internal/ui/model/ui.go
+++ internal/ui/model/ui.go
@@ -1952,6 +1952,8 @@ func (m *UI) openAuthenticationDialog(provider catwalk.Provider, model config.Se
switch provider.ID {
case "hyper":
dlg, cmd = dialog.NewOAuthHyper(m.com, isOnboarding, provider, model, modelType)
+ case catwalk.InferenceProviderAnthropic:
+ dlg, cmd = dialog.NewOAuthClaude(m.com, isOnboarding, provider, model, modelType)
case catwalk.InferenceProviderCopilot:
dlg, cmd = dialog.NewOAuthCopilot(m.com, isOnboarding, provider, model, modelType)
default:

3
devel/crush/pkg/DESCR Normal file
View File

@@ -0,0 +1,3 @@
Crush is a terminal-based AI coding agent from Charm. It supports
multiple LLM providers, per-project configuration, LSP-aware context,
and an extensible tool/MCP system, all driven from an interactive TUI.

1
devel/crush/pkg/PLIST Normal file
View File

@@ -0,0 +1 @@
@bin bin/crush