Rebrand: Nexus Terminal → Alchementary Link

Renames the product across the codebase: Go module path, config/data
paths, keychain service name, export file extension, build tooling,
docs, and UI text. Sidebar brand mark now reads ">_ AlchementaryLink"
with "Alchementary" in the connection-group gold accent colour, and
the window title is "Alchementary Link".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019T8bJS8BCtY5GeSG2HBj1n
This commit is contained in:
Andy Dixon
2026-09-03 16:41:23 +01:00
co-authored by Claude Sonnet 5
parent 114060127f
commit 1a380a0e99
135 changed files with 678 additions and 674 deletions
+18 -18
View File
@@ -24,17 +24,17 @@ import (
"github.com/pquerna/otp/totp"
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
"github.com/andydixon/nexus/internal/audit"
"github.com/andydixon/nexus/internal/exportimport"
"github.com/andydixon/nexus/internal/localshell"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/nexus/internal/preferences"
"github.com/andydixon/nexus/internal/secrets"
"github.com/andydixon/nexus/internal/sessions"
"github.com/andydixon/nexus/internal/sshconfig"
"github.com/andydixon/nexus/internal/storage"
"github.com/andydixon/nexus/internal/updater"
"github.com/andydixon/nexus/internal/validation"
"github.com/andydixon/link/internal/audit"
"github.com/andydixon/link/internal/exportimport"
"github.com/andydixon/link/internal/localshell"
"github.com/andydixon/link/internal/models"
"github.com/andydixon/link/internal/preferences"
"github.com/andydixon/link/internal/secrets"
"github.com/andydixon/link/internal/sessions"
"github.com/andydixon/link/internal/sshconfig"
"github.com/andydixon/link/internal/storage"
"github.com/andydixon/link/internal/updater"
"github.com/andydixon/link/internal/validation"
"github.com/google/uuid"
)
@@ -1291,9 +1291,9 @@ func (s *Service) ExportProfilesEncrypted(profileIDs []string, password string)
// Prompt for save location.
path, err := wailsRuntime.SaveFileDialog(s.ctx, wailsRuntime.SaveDialogOptions{
Title: "Export Encrypted Profiles",
DefaultFilename: "nexus-profiles.nexus",
DefaultFilename: "link-profiles.link",
Filters: []wailsRuntime.FileFilter{
{DisplayName: "Nexus Export (*.nexus)", Pattern: "*.nexus"},
{DisplayName: "Link Export (*.link)", Pattern: "*.link"},
},
})
if err != nil {
@@ -1303,9 +1303,9 @@ func (s *Service) ExportProfilesEncrypted(profileIDs []string, password string)
return "", fmt.Errorf("export cancelled")
}
// Ensure .nexus extension.
if filepath.Ext(path) != ".nexus" {
path += ".nexus"
// Ensure .link extension.
if filepath.Ext(path) != ".link" {
path += ".link"
}
if err := exportimport.EncryptAndExport(profiles, password, path); err != nil {
@@ -1327,7 +1327,7 @@ func (s *Service) ImportProfilesEncrypted(password string, strategy string) (int
path, err := wailsRuntime.OpenFileDialog(s.ctx, wailsRuntime.OpenDialogOptions{
Title: "Import Encrypted Profiles",
Filters: []wailsRuntime.FileFilter{
{DisplayName: "Nexus Export (*.nexus)", Pattern: "*.nexus"},
{DisplayName: "Link Export (*.link)", Pattern: "*.link"},
},
})
if err != nil {
@@ -2023,7 +2023,7 @@ func (s *Service) GenerateSSHKey(name string, keyType string, bits int, passphra
}
// Build ssh-keygen arguments
args := []string{"-t", keyType, "-f", keyPath, "-C", name + "@nexus-terminal"}
args := []string{"-t", keyType, "-f", keyPath, "-C", name + "@alchementary-link"}
if passphrase != "" {
args = append(args, "-N", passphrase)
} else {
+4 -4
View File
@@ -7,10 +7,10 @@ import (
"strings"
"testing"
"github.com/andydixon/nexus/internal/audit"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/nexus/internal/storage"
"github.com/andydixon/link/internal/audit"
"github.com/andydixon/link/internal/leviathan/document"
"github.com/andydixon/link/internal/models"
"github.com/andydixon/link/internal/storage"
)
type closeTrackingWriter struct {
+11 -11
View File
@@ -17,17 +17,17 @@ import (
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
"github.com/andydixon/nexus/internal/leviathan/analysis"
"github.com/andydixon/nexus/internal/leviathan/binsnoop"
"github.com/andydixon/nexus/internal/leviathan/disasm"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/nexus/internal/leviathan/parsers"
"github.com/andydixon/nexus/internal/leviathan/patch"
"github.com/andydixon/nexus/internal/leviathan/pdf"
"github.com/andydixon/nexus/internal/leviathan/spectrogram"
"github.com/andydixon/nexus/internal/leviathan/squashfs"
"github.com/andydixon/nexus/internal/leviathan/stego"
"github.com/andydixon/nexus/internal/leviathan/transforms"
"github.com/andydixon/link/internal/leviathan/analysis"
"github.com/andydixon/link/internal/leviathan/binsnoop"
"github.com/andydixon/link/internal/leviathan/disasm"
"github.com/andydixon/link/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/parsers"
"github.com/andydixon/link/internal/leviathan/patch"
"github.com/andydixon/link/internal/leviathan/pdf"
"github.com/andydixon/link/internal/leviathan/spectrogram"
"github.com/andydixon/link/internal/leviathan/squashfs"
"github.com/andydixon/link/internal/leviathan/stego"
"github.com/andydixon/link/internal/leviathan/transforms"
)
type leviathanState struct {
+11 -11
View File
@@ -1,4 +1,4 @@
// Package app provides the core application lifecycle for Nexus Terminal.
// Package app provides the core application lifecycle for Alchementary Link.
// It wires together storage, secrets, sessions, preferences, known hosts,
// and the audit log, and exposes Wails lifecycle hooks.
package app
@@ -11,15 +11,15 @@ import (
"github.com/wailsapp/wails/v2/pkg/runtime"
"github.com/andydixon/nexus/internal/api"
"github.com/andydixon/nexus/internal/audit"
"github.com/andydixon/nexus/internal/config"
"github.com/andydixon/nexus/internal/knownhosts"
"github.com/andydixon/nexus/internal/preferences"
"github.com/andydixon/nexus/internal/recording"
"github.com/andydixon/nexus/internal/secrets"
"github.com/andydixon/nexus/internal/sessions"
"github.com/andydixon/nexus/internal/storage"
"github.com/andydixon/link/internal/api"
"github.com/andydixon/link/internal/audit"
"github.com/andydixon/link/internal/config"
"github.com/andydixon/link/internal/knownhosts"
"github.com/andydixon/link/internal/preferences"
"github.com/andydixon/link/internal/recording"
"github.com/andydixon/link/internal/secrets"
"github.com/andydixon/link/internal/sessions"
"github.com/andydixon/link/internal/storage"
)
// App is the central application struct. Wails binds its lifecycle methods
@@ -85,7 +85,7 @@ func (a *App) Startup(ctx context.Context) {
// Initialise secret stores (keychain preferred, encrypted file fallback).
a.SecretStore = secrets.NewSecretStore(cfg.SecretPath)
a.KeychainStore = secrets.NewKeychainStore("NexusTerminal")
a.KeychainStore = secrets.NewKeychainStore("AlchementaryLink")
// Initialise the audit logger backed by SQLite.
a.AuditLog = audit.NewLogger(store)
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"fmt"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"github.com/google/uuid"
)
+6 -6
View File
@@ -7,7 +7,7 @@ import (
"runtime"
)
const appName = "NexusTerminal"
const appName = "AlchementaryLink"
// AppConfig holds the resolved application configuration paths.
type AppConfig struct {
@@ -19,9 +19,9 @@ type AppConfig struct {
// Load resolves the application configuration.
// Data directory follows platform conventions:
// - macOS: ~/Library/Application Support/NexusTerminal
// - Linux: ~/.config/NexusTerminal
// - Windows: %APPDATA%/NexusTerminal
// - macOS: ~/Library/Application Support/AlchementaryLink
// - Linux: ~/.config/AlchementaryLink
// - Windows: %APPDATA%/AlchementaryLink
func Load() (*AppConfig, error) {
dataDir, err := resolveDataDir()
if err != nil {
@@ -30,9 +30,9 @@ func Load() (*AppConfig, error) {
cfg := &AppConfig{
DataDir: dataDir,
DBPath: filepath.Join(dataDir, "nexus.db"),
DBPath: filepath.Join(dataDir, "link.db"),
SecretPath: filepath.Join(dataDir, "vault"),
LogPath: filepath.Join(dataDir, "nexus.log"),
LogPath: filepath.Join(dataDir, "link.log"),
}
return cfg, nil
}
+1 -1
View File
@@ -18,7 +18,7 @@ import (
"golang.org/x/crypto/argon2"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
const (
+8 -8
View File
@@ -6,12 +6,12 @@ import (
"runtime"
"testing"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
func TestEncryptDecryptRoundTrip(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "test-export.nexus")
path := filepath.Join(dir, "test-export.link")
profiles := []models.Profile{
{
@@ -73,7 +73,7 @@ func TestEncryptDecryptRoundTrip(t *testing.T) {
func TestDecryptWrongPassword(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "test-export.nexus")
path := filepath.Join(dir, "test-export.link")
profiles := []models.Profile{
{
@@ -97,7 +97,7 @@ func TestDecryptWrongPassword(t *testing.T) {
func TestEncryptEmptyProfiles(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "test.nexus")
path := filepath.Join(dir, "test.link")
err := EncryptAndExport(nil, "password", path)
if err == nil {
@@ -109,7 +109,7 @@ func TestEncryptAndExportRestrictsExistingFilePermissions(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("POSIX permission bits are not enforced on Windows")
}
path := filepath.Join(t.TempDir(), "profiles.nexus")
path := filepath.Join(t.TempDir(), "profiles.link")
if err := os.WriteFile(path, []byte("old"), 0644); err != nil {
t.Fatal(err)
}
@@ -127,7 +127,7 @@ func TestEncryptAndExportRestrictsExistingFilePermissions(t *testing.T) {
func TestEncryptEmptyPassword(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "test.nexus")
path := filepath.Join(dir, "test.link")
profiles := []models.Profile{{ID: "1"}}
err := EncryptAndExport(profiles, "", path)
@@ -138,7 +138,7 @@ func TestEncryptEmptyPassword(t *testing.T) {
func TestDecryptCorruptFile(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "corrupt.nexus")
path := filepath.Join(dir, "corrupt.link")
// Write garbage data.
if err := os.WriteFile(path, []byte("corrupt"), 0600); err != nil {
@@ -153,7 +153,7 @@ func TestDecryptCorruptFile(t *testing.T) {
func TestDecryptRejectsOversizedFile(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, "huge.nexus")
path := filepath.Join(dir, "huge.link")
f, err := os.Create(path)
if err != nil {
t.Fatal(err)
+5 -5
View File
@@ -17,7 +17,7 @@ import (
"sync/atomic"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
const (
@@ -90,7 +90,7 @@ func (c *Client) fetchRepos(ctx context.Context, progress func(done int, total i
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Accept", "application/vnd.github+json")
req.Header.Set("User-Agent", "NexusTerminal/1.0")
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
resp, err := c.httpClient.Do(req)
if err != nil {
@@ -210,7 +210,7 @@ func (c *Client) FetchLatestCommit(ctx context.Context, fullName string, ref str
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Accept", "application/vnd.github+json")
req.Header.Set("User-Agent", "NexusTerminal/1.0")
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
resp, err := c.httpClient.Do(req)
if err != nil {
@@ -280,7 +280,7 @@ func (c *Client) DownloadRepoArchive(ctx context.Context, fullName string, ref s
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Accept", "application/vnd.github+json")
req.Header.Set("User-Agent", "NexusTerminal/1.0")
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
resp, err := c.httpClient.Do(req)
if err != nil {
@@ -319,7 +319,7 @@ func (c *Client) ValidateToken(ctx context.Context) (string, error) {
}
req.Header.Set("Authorization", "Bearer "+c.token)
req.Header.Set("Accept", "application/vnd.github+json")
req.Header.Set("User-Agent", "NexusTerminal/1.0")
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
resp, err := c.httpClient.Do(req)
if err != nil {
+3 -3
View File
@@ -1,4 +1,4 @@
// Package ircclient wraps a full IRC client with Nexus-specific event and
// Package ircclient wraps a full IRC client with Link-specific event and
// command handling, including optional SSH tunnelling.
package ircclient
@@ -216,7 +216,7 @@ func (c *Client) Close() {
c.mu.Unlock()
if c.client != nil {
c.client.Quit("Nexus Terminal disconnected")
c.client.Quit("Alchementary Link disconnected")
c.client.Close()
}
if c.sshClient != nil {
@@ -305,7 +305,7 @@ func (c *Client) HandleInput(target string, input string) error {
}
case "quit":
if args == "" {
args = "Nexus Terminal disconnected"
args = "Alchementary Link disconnected"
}
c.client.Quit(args)
c.client.Close()
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"fmt"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"github.com/google/uuid"
)
+1 -1
View File
@@ -3,7 +3,7 @@ package knownhosts
import (
"testing"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
// ---------------------------------------------------------------------------
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"encoding/binary"
"io"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Signature describes a carveable object. `validate` is run against
+1 -1
View File
@@ -3,7 +3,7 @@ package analysis
import (
"context"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// DiffRegion describes a contiguous run of differing bytes.
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"math"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Entropy computes Shannon entropy per sliding window over the range.
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strconv"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// fuzzy.go implements context-triggered piecewise hashing (CTPH) compatible
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"hash"
"hash/crc32"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// HashSet contains CRC32/MD5/SHA-1/SHA-256/SHA-512 for a range.
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"regexp"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ioc regexes. They run against printable ASCII strings extracted
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"fmt"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// KeyArtefact is a single key-ish object we've found in the raw file.
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"regexp"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
type MultiSearchQuery struct {
+1 -1
View File
@@ -1,7 +1,7 @@
package analysis
import (
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Overview returns a compact first-pass report intended for both UI
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"strconv"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Rule represents a lightweight YARA-like rule. A rule matches when
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"errors"
"regexp"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// SearchHit describes one search result.
+1 -1
View File
@@ -3,7 +3,7 @@ package analysis
import (
"context"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// StringHit represents one extracted string.
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"math"
"time"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ScanTimestamps walks the range looking for plausible timestamps in
+2 -2
View File
@@ -1,8 +1,8 @@
package disasm
import (
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/nexus/internal/leviathan/parsers"
"github.com/andydixon/link/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/parsers"
)
// ImageAnalysis is a metadata-seeded analysis across file-backed executable
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"fmt"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ParseASN1 produces a field tree for the DER TLV structure starting
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"fmt"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ParseCerts scans the whole document for PEM-encoded certificates
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"fmt"
"sort"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ExecutableRegion is a file-backed executable code range.
+1 -1
View File
@@ -12,7 +12,7 @@ import (
"unicode/utf16"
"unicode/utf8"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Field is one node of the parsed structure.
+1 -1
View File
@@ -15,7 +15,7 @@ import (
"strings"
"time"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// leaf builds a terminal Field with no children.
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"errors"
"fmt"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Mach-O magic values (32/64, LE/BE) plus fat (universal) magic.
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"encoding/binary"
"errors"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ImportSym is one resolved PE import (a function name, or an ordinal).
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"strconv"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// Step is one parsed instruction.
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"errors"
"fmt"
"github.com/andydixon/nexus/internal/leviathan/transforms"
"github.com/andydixon/link/internal/leviathan/transforms"
)
const MaxDecodedStreamOutput = 64 << 20
+1 -1
View File
@@ -16,7 +16,7 @@ import (
"strconv"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
const maxPDFParseBytes = 128 << 20
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strings"
"testing"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
func TestParseRejectsOversizedPDFBeforeWholeRange(t *testing.T) {
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"strconv"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// XRefEntry describes one cross-reference entry after parsing either a
+1 -1
View File
@@ -21,7 +21,7 @@ import (
"path"
"sort"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
"github.com/klauspost/compress/zstd"
"github.com/ulikunitz/xz"
)
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"io"
"strings"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// MetaEntry is one piece of textual/EXIF metadata recovered from an image.
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"encoding/binary"
"errors"
"github.com/andydixon/nexus/internal/leviathan/document"
"github.com/andydixon/link/internal/leviathan/document"
)
// ---------------------------------------------------------------------------
+1 -1
View File
@@ -16,7 +16,7 @@ import (
"syscall"
"time"
"github.com/andydixon/nexus/internal/terminalenv"
"github.com/andydixon/link/internal/terminalenv"
"github.com/creack/pty"
)
+2 -2
View File
@@ -128,8 +128,8 @@ func NewProfile(protocol Protocol) Profile {
case ProtocolIRC:
p.Port = DefaultIRCPort
p.IRC = &IRCConfig{
Nick: "nexus",
RealName: "Nexus Terminal",
Nick: "link",
RealName: "Alchementary Link",
ServerPasswordMode: SecretModeAskEveryTime,
NickServMode: SecretModeSaved,
AutoJoinRooms: []string{},
+1 -1
View File
@@ -1,5 +1,5 @@
// Package models defines the core data structures used throughout
// the Nexus Terminal application.
// the Alchementary Link application.
package models
import "time"
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"fmt"
"sync"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
// PreferenceStore is the persistence interface used by the Manager.
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"bytes"
"testing"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
func TestHistoryIsCappedByEntryCount(t *testing.T) {
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"sync"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
const (
+1 -1
View File
@@ -27,7 +27,7 @@ func NewKeychainStore(serviceName string) *KeychainStore {
// without error.
func (k *KeychainStore) Available() bool {
// Attempt a round-trip to verify the keychain is usable.
probeKey := "__nexus_keychain_probe__"
probeKey := "__link_keychain_probe__"
probeVal := "probe"
if err := keyring.Set(k.serviceName, probeKey, probeVal); err != nil {
+13 -13
View File
@@ -18,19 +18,19 @@ import (
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
"golang.org/x/crypto/ssh"
"github.com/andydixon/nexus/internal/audit"
"github.com/andydixon/nexus/internal/githubclient"
"github.com/andydixon/nexus/internal/ircclient"
"github.com/andydixon/nexus/internal/localshell"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/nexus/internal/rawclient"
"github.com/andydixon/nexus/internal/recording"
"github.com/andydixon/nexus/internal/secrets"
"github.com/andydixon/nexus/internal/sftpclient"
"github.com/andydixon/nexus/internal/sshclient"
"github.com/andydixon/nexus/internal/storage"
"github.com/andydixon/nexus/internal/telnetclient"
"github.com/andydixon/nexus/internal/vncclient"
"github.com/andydixon/link/internal/audit"
"github.com/andydixon/link/internal/githubclient"
"github.com/andydixon/link/internal/ircclient"
"github.com/andydixon/link/internal/localshell"
"github.com/andydixon/link/internal/models"
"github.com/andydixon/link/internal/rawclient"
"github.com/andydixon/link/internal/recording"
"github.com/andydixon/link/internal/secrets"
"github.com/andydixon/link/internal/sftpclient"
"github.com/andydixon/link/internal/sshclient"
"github.com/andydixon/link/internal/storage"
"github.com/andydixon/link/internal/telnetclient"
"github.com/andydixon/link/internal/vncclient"
)
const maxTunnelPrivateKeyBytes = 1 << 20
+3 -3
View File
@@ -14,9 +14,9 @@ import (
"testing"
"time"
"github.com/andydixon/nexus/internal/audit"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/nexus/internal/storage"
"github.com/andydixon/link/internal/audit"
"github.com/andydixon/link/internal/models"
"github.com/andydixon/link/internal/storage"
"golang.org/x/crypto/ssh"
)
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"net"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"golang.org/x/crypto/ssh"
)
+1 -1
View File
@@ -13,7 +13,7 @@ import (
"net"
"sync"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"golang.org/x/crypto/ssh"
)
+2 -2
View File
@@ -13,8 +13,8 @@ import (
"sync"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/nexus/internal/terminalenv"
"github.com/andydixon/link/internal/models"
"github.com/andydixon/link/internal/terminalenv"
"github.com/pquerna/otp/totp"
"golang.org/x/crypto/ssh"
"golang.org/x/net/proxy"
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"testing"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"golang.org/x/crypto/ssh"
)
+3 -3
View File
@@ -1,5 +1,5 @@
// Package sshconfig parses OpenSSH ~/.ssh/config files and converts
// Host blocks into Nexus Terminal connection profiles. Supports a useful
// Host blocks into Alchementary Link connection profiles. Supports a useful
// subset of SSH config directives: HostName, Port, User, IdentityFile,
// ProxyJump, ForwardAgent, and Compression.
//
@@ -18,7 +18,7 @@ import (
"strconv"
"strings"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"github.com/google/uuid"
)
@@ -170,7 +170,7 @@ func DefaultConfigPath() string {
return filepath.Join(home, ".ssh", "config")
}
// ToProfiles converts parsed Host blocks into Nexus Terminal profiles.
// ToProfiles converts parsed Host blocks into Alchementary Link profiles.
// Each block produces one profile; the first alias becomes the display name.
func ToProfiles(blocks []HostBlock, folder string) []models.Profile {
profiles := make([]models.Profile, 0, len(blocks))
+1 -1
View File
@@ -1,4 +1,4 @@
-- Initial schema for Nexus Terminal
-- Initial schema for Alchementary Link
-- Creates the core tables for profiles, known hosts, preferences, and audit log.
CREATE TABLE IF NOT EXISTS profiles (
+5 -5
View File
@@ -7,7 +7,7 @@ import (
"testing"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"github.com/google/uuid"
)
@@ -37,8 +37,8 @@ func makeIRCProfile(name, host string) *models.Profile {
p := models.NewProfile(models.ProtocolIRC)
p.DisplayName = name
p.Host = host
p.Username = "nexus"
p.IRC.Nick = "nexus"
p.Username = "link"
p.IRC.Nick = "link"
return &p
}
@@ -120,14 +120,14 @@ func TestIRCLastRoomsRoundTripReplaceAndDelete(t *testing.T) {
t.Fatalf("CreateProfile() error = %v", err)
}
if err := store.SaveIRCLastRooms(p.ID, []string{" #Go-Nuts ", "#nexus", "#go-nuts", ""}); err != nil {
if err := store.SaveIRCLastRooms(p.ID, []string{" #Go-Nuts ", "#link", "#go-nuts", ""}); err != nil {
t.Fatalf("SaveIRCLastRooms() error = %v", err)
}
rooms, err := store.GetIRCLastRooms(p.ID)
if err != nil {
t.Fatalf("GetIRCLastRooms() error = %v", err)
}
if got, want := strings.Join(rooms, ","), "#Go-Nuts,#nexus"; got != want {
if got, want := strings.Join(rooms, ","), "#Go-Nuts,#link"; got != want {
t.Fatalf("GetIRCLastRooms() = %q, want %q", got, want)
}
+2 -2
View File
@@ -11,8 +11,8 @@ import (
_ "modernc.org/sqlite"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/nexus/internal/storage/migrations"
"github.com/andydixon/link/internal/models"
"github.com/andydixon/link/internal/storage/migrations"
"github.com/google/uuid"
)
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"sync"
"time"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"golang.org/x/text/encoding/charmap"
)
+4 -4
View File
@@ -20,8 +20,8 @@ const (
// defaultOwner and defaultRepo identify the GitHub repository to check.
// These should be overridden via SetRepository if the project is hosted
// elsewhere.
defaultOwner = "nexus-terminal"
defaultRepo = "nexus-terminal"
defaultOwner = "alchementary-link"
defaultRepo = "alchementary-link"
// requestTimeout limits the HTTP request duration.
requestTimeout = 10 * time.Second
@@ -118,7 +118,7 @@ func (c *Checker) Check(ctx context.Context) (*UpdateInfo, error) {
return nil, fmt.Errorf("updater: failed to create request: %w", err)
}
req.Header.Set("Accept", "application/vnd.github+json")
req.Header.Set("User-Agent", "NexusTerminal-UpdateChecker")
req.Header.Set("User-Agent", "AlchementaryLink-UpdateChecker")
resp, err := c.client.Do(req)
if err != nil {
@@ -183,7 +183,7 @@ func (c *URLChecker) Check(ctx context.Context) (*UpdateInfo, error) {
return nil, fmt.Errorf("updater: failed to create request: %w", err)
}
req.Header.Set("Accept", "application/json, text/plain")
req.Header.Set("User-Agent", "NexusTerminal-UpdateChecker")
req.Header.Set("User-Agent", "AlchementaryLink-UpdateChecker")
resp, err := c.client.Do(req)
if err != nil {
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"net/url"
"strings"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
"github.com/lrstanley/girc"
)
+1 -1
View File
@@ -3,7 +3,7 @@ package validation
import (
"testing"
"github.com/andydixon/nexus/internal/models"
"github.com/andydixon/link/internal/models"
)
// ---------------------------------------------------------------------------