Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: CI

on:
pull_request:
branches:
- main
push:
branches:
- main

permissions:
contents: read

jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true

- name: Go mod download
run: go mod download

- name: Vet
run: go vet ./...

- name: Test
run: go test -race -v ./...

build-matrix:
name: Build (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true

- name: Build
env:
CGO_ENABLED: "0"
run: go build ./...

lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: false

- name: golangci-lint
uses: golangci/golangci-lint-action@v8
with:
version: v2.11.4
39 changes: 39 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Release

on:
push:
tags:
- "v*"

permissions:
contents: write
packages: write

jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true

- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
version: "~> v2"
args: release --clean
env:
# RELEASE_PAT is a classic PAT with `repo` scope, required for
# cross-repo pushes to captured-ventures/homebrew-rememberize and
# captured-ventures/scoop-rememberize. The default GITHUB_TOKEN
# cannot push to other repos.
GITHUB_TOKEN: ${{ secrets.RELEASE_PAT }}
30 changes: 30 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
version: "2"

run:
timeout: 5m
tests: true

linters:
default: none
enable:
- govet
- staticcheck
- ineffassign
- errcheck
settings:
errcheck:
exclude-functions:
- fmt.Fprint
- fmt.Fprintf
- fmt.Fprintln
- (io.Closer).Close
- (*os.File).Close
- (*text/tabwriter.Writer).Flush

formatters:
enable:
- gofmt

issues:
max-issues-per-linter: 0
max-same-issues: 0
102 changes: 102 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
version: 2

project_name: rememberize-cli

before:
hooks:
- go mod tidy

builds:
- id: rememberize
binary: rememberize
main: ./cmd/rememberize
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}}
goos:
- darwin
- linux
- windows
goarch:
- amd64
- arm64
ignore:
- goos: windows
goarch: arm64

archives:
- id: rememberize
name_template: >-
rememberize_{{ .Version }}_{{ .Os }}_{{ .Arch }}
formats:
- tar.gz
format_overrides:
- goos: windows
formats:
- zip
files:
- LICENSE
- README.md

checksum:
name_template: "checksums.txt"
algorithm: sha256

snapshot:
version_template: "{{ incpatch .Version }}-snapshot-{{.ShortCommit}}"

changelog:
use: github
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
- "^chore:"
- "^ci:"
- "Merge pull request"
- "Merge branch"

release:
github:
owner: captured-ventures
name: rememberize-cli
draft: false
prerelease: auto
mode: replace
name_template: "v{{ .Version }}"

brews:
- name: rememberize
repository:
owner: captured-ventures
name: homebrew-rememberize
branch: main
token: "{{ .Env.GITHUB_TOKEN }}"
directory: Formula
homepage: "https://rememberize.app"
description: "CLI client for rememberize — a portable, multi-directional memory system for AI."
license: "MIT"
commit_author:
name: rememberize-bot
email: bot@captured.ventures
install: |
bin.install "rememberize"
test: |
assert_match "rememberize", shell_output("#{bin}/rememberize --version")

scoops:
- name: rememberize
repository:
owner: captured-ventures
name: scoop-rememberize
branch: main
token: "{{ .Env.GITHUB_TOKEN }}"
directory: bucket
homepage: "https://rememberize.app"
description: "CLI client for rememberize — a portable, multi-directional memory system for AI."
license: MIT
commit_author:
name: rememberize-bot
email: bot@captured.ventures
26 changes: 26 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
.PHONY: build test lint install-dev clean release-snapshot

GIT_SHA := $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
VERSION ?= dev-$(GIT_SHA)
BIN := bin/rememberize
INSTALL_DIR ?= $(HOME)/.local/bin

build:
CGO_ENABLED=0 go build -o $(BIN) -ldflags "-s -w -X main.version=$(VERSION)" ./cmd/rememberize

test:
go test -race ./...

lint:
golangci-lint run

install-dev: build
mkdir -p $(INSTALL_DIR)
cp $(BIN) $(INSTALL_DIR)/rememberize
@echo "Installed to $(INSTALL_DIR)/rememberize"

clean:
rm -rf bin/ dist/

release-snapshot:
goreleaser release --snapshot --clean
18 changes: 13 additions & 5 deletions cmd/rememberize/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -644,14 +644,22 @@ func runImport(cmd *cobra.Command, args []string) error {
if err != nil {
return fmt.Errorf("create form file: %w", err)
}
part.Write(data)
if _, err := part.Write(data); err != nil {
return fmt.Errorf("write form part: %w", err)
}
if importNamespace != "" {
writer.WriteField("namespace", importNamespace)
if err := writer.WriteField("namespace", importNamespace); err != nil {
return fmt.Errorf("write namespace field: %w", err)
}
}
if importFormat != "" {
writer.WriteField("format", importFormat)
if err := writer.WriteField("format", importFormat); err != nil {
return fmt.Errorf("write format field: %w", err)
}
}
if err := writer.Close(); err != nil {
return fmt.Errorf("close multipart writer: %w", err)
}
writer.Close()

req, err := client.newRequest("POST", "/api/import", body)
if err != nil {
Expand Down Expand Up @@ -741,7 +749,7 @@ func runExport(cmd *cobra.Command, args []string) error {
}
fmt.Printf("Exported to %s\n", exportOutput)
} else {
os.Stdout.Write(data)
_, _ = os.Stdout.Write(data)
}
return nil
}
Expand Down
8 changes: 4 additions & 4 deletions cmd/rememberize/pair_flow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ type recordedRequest struct {
}

type exchangeResponse struct {
APIKey string `json:"api_key"`
ServerURL string `json:"server_url"`
Connection exchangeRespConnection `json:"connection"`
Namespaces []exchangeRespNamespace `json:"namespaces"`
APIKey string `json:"api_key"`
ServerURL string `json:"server_url"`
Connection exchangeRespConnection `json:"connection"`
Namespaces []exchangeRespNamespace `json:"namespaces"`
}

type exchangeRespConnection struct {
Expand Down
4 changes: 3 additions & 1 deletion cmd/rememberize/pair_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@ func TestWriteMCPConfig_MergesExistingFile(t *testing.T) {

data, _ := os.ReadFile(path)
var cfg map[string]any
json.Unmarshal(data, &cfg)
if err := json.Unmarshal(data, &cfg); err != nil {
t.Fatalf("unmarshal written config: %v", err)
}

servers := cfg["mcpServers"].(map[string]any)
if _, ok := servers["other-server"]; !ok {
Expand Down
Loading
Loading