build(release): rename jane-ai packaging surfaces\n\n- Rename Makefile outputs, launcher artifact names, and frontend build commands toward jane-ai\n- Update Dockerfiles, GoReleaser config, launcher assets, and backend startup metadata to ship jane-ai branding\n- Refresh gitignore and workflow image naming for the new jane-ai artifact surface\n- Documentation updated in ObsidianVault/My_Vault/03-Projects/jane-ai/01-Working and 07-Sessions/28-03-26\n- Tests passed for pkg/runtimepaths and pkg/auth; targeted rg checks passed for the touched release/build files

This commit is contained in:
Wadah Adlan 2026-03-28 02:36:28 -04:00
parent da25deeae0
commit ef5a339b4c
16 changed files with 99 additions and 98 deletions

View file

@ -1,7 +1,7 @@
.git
.gitignore
build/
.picoclaw/
.jane-ai/
config/
.env
.env.example

View file

@ -10,7 +10,7 @@ on:
env:
GHCR_REGISTRY: ghcr.io
GHCR_IMAGE_NAME: ${{ github.repository_owner }}/picoclaw
GHCR_IMAGE_NAME: ${{ github.repository_owner }}/jane-ai
DOCKERHUB_REGISTRY: docker.io
DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }}

8
.gitignore vendored
View file

@ -8,14 +8,14 @@ build/
*.dylib
*.test
*.out
/picoclaw
/picoclaw-test
/jane-ai
/jane-ai-test
cmd/**/workspace
# Picoclaw specific
# PicoClaw
.picoclaw/
# Jane AI
.jane-ai/
config.json
sessions/
build/

View file

@ -6,22 +6,23 @@ before:
hooks:
- go mod tidy
- go generate ./...
- sh -c 'cd web/frontend && pnpm install && pnpm build:backend'
- sh -c 'cd web/frontend && bun install && bun run build:backend'
- go install github.com/tc-hib/go-winres@latest
- go-winres make --in web/backend/winres/winres.json --out web/backend/rsrc --product-version={{ .Version }} --file-version={{ .Version }}
builds:
- id: picoclaw
- id: jane-ai
binary: jane-ai
env:
- CGO_ENABLED=0
tags:
- stdjson
ldflags:
- -s -w
- -X github.com/sipeed/picoclaw/pkg/config.Version={{ .Version }}
- -X github.com/sipeed/picoclaw/pkg/config.GitCommit={{ .ShortCommit }}
- -X github.com/sipeed/picoclaw/pkg/config.BuildTime={{ .Date }}
- -X github.com/sipeed/picoclaw/pkg/config.GoVersion={{ .Env.GOVERSION }}
- -X jane/pkg/config.Version={{ .Version }}
- -X jane/pkg/config.GitCommit={{ .ShortCommit }}
- -X jane/pkg/config.BuildTime={{ .Date }}
- -X jane/pkg/config.GoVersion={{ .Env.GOVERSION }}
goos:
- linux
- windows
@ -45,8 +46,8 @@ builds:
- goos: windows
goarch: arm
- id: picoclaw-launcher
binary: picoclaw-launcher
- id: jane-ai-launcher
binary: jane-ai-launcher
env:
- CGO_ENABLED=0
tags:
@ -76,8 +77,8 @@ builds:
- goos: windows
goarch: arm
- id: picoclaw-launcher-tui
binary: picoclaw-launcher-tui
- id: jane-ai-launcher-tui
binary: jane-ai-launcher-tui
env:
- CGO_ENABLED=0
tags:
@ -108,14 +109,14 @@ builds:
goarch: arm
dockers_v2:
- id: picoclaw
- id: jane-ai
dockerfile: docker/Dockerfile.goreleaser
extra_files:
- docker/entrypoint.sh
ids:
- picoclaw
- jane-ai
images:
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw"
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/jane-ai"
- 'docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}'
tags:
- '{{ if isEnvSet "NIGHTLY_BUILD" }}nightly{{ else }}{{ .Tag }}{{ end }}'
@ -125,14 +126,14 @@ dockers_v2:
- linux/arm64
- linux/riscv64
- id: picoclaw-launcher
- id: jane-ai-launcher
dockerfile: docker/Dockerfile.goreleaser.launcher
ids:
- picoclaw
- picoclaw-launcher
- picoclaw-launcher-tui
- jane-ai
- jane-ai-launcher
- jane-ai-launcher-tui
images:
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw"
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/jane-ai"
- 'docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}'
tags:
- '{{ if isEnvSet "NIGHTLY_BUILD" }}nightly-launcher{{ else }}{{ .Tag }}-launcher{{ end }}'
@ -146,9 +147,9 @@ notarize:
macos:
- enabled: '{{ isEnvSet "MACOS_SIGN_P12" }}'
ids:
- picoclaw
- picoclaw-launcher
- picoclaw-launcher-tui
- jane-ai
- jane-ai-launcher
- jane-ai-launcher-tui
sign:
certificate: "{{.Env.MACOS_SIGN_P12}}"
password: "{{.Env.MACOS_SIGN_PASSWORD}}"
@ -175,32 +176,32 @@ archives:
formats: [zip]
nfpms:
- id: picoclaw
- id: jane-ai
ids:
- picoclaw
- picoclaw-launcher
- picoclaw-launcher-tui
package_name: picoclaw
- jane-ai
- jane-ai-launcher
- jane-ai-launcher-tui
package_name: jane-ai
file_name_template: >-
{{ .PackageName }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "arm64" }}aarch64
{{- else if eq .Arch "arm" }}armv{{ .Arm }}
{{- else }}{{ .Arch }}{{ end }}
vendor: picoclaw
homepage: https://github.com/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw
maintainer: picoclaw contributors
description: picoclaw - a tool for managing and running tasks
vendor: jane-ai
homepage: https://github.com/{{ .Env.GITHUB_REPOSITORY_OWNER }}/jane-ai
maintainer: jane-ai contributors
description: jane-ai - a tool for managing and running tasks
license: MIT
formats:
- rpm
- deb
bindir: /usr/bin
contents:
- src: web/picoclaw-launcher.desktop
dst: /usr/share/applications/picoclaw-launcher.desktop
- src: web/picoclaw-launcher.png
dst: /usr/share/icons/hicolor/512x512/apps/picoclaw-launcher.png
- src: web/jane-ai-launcher.desktop
dst: /usr/share/applications/jane-ai-launcher.desktop
- src: web/jane-ai-launcher.png
dst: /usr/share/icons/hicolor/512x512/apps/jane-ai-launcher.png
changelog:
sort: asc

View file

@ -1,9 +1,9 @@
.PHONY: all build install uninstall clean help test
# Build variables
BINARY_NAME=picoclaw
BINARY_NAME=jane-ai
BUILD_DIR=build
CMD_DIR=cmd/$(BINARY_NAME)
CMD_DIR=cmd/picoclaw
MAIN_GO=$(CMD_DIR)/main.go
# Version
@ -11,7 +11,7 @@ VERSION?=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
GIT_COMMIT=$(shell git rev-parse --short=8 HEAD 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date +%FT%T%z)
GO_VERSION=$(shell $(GO) version | awk '{print $$3}')
CONFIG_PKG=github.com/sipeed/picoclaw/pkg/config
CONFIG_PKG=jane/pkg/config
LDFLAGS=-ldflags "-X $(CONFIG_PKG).Version=$(VERSION) -X $(CONFIG_PKG).GitCommit=$(GIT_COMMIT) -X $(CONFIG_PKG).BuildTime=$(BUILD_TIME) -X $(CONFIG_PKG).GoVersion=$(GO_VERSION) -s -w"
# Go variables
@ -50,8 +50,8 @@ INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1
INSTALL_TMP_SUFFIX=.new
# Workspace and Skills
PICOCLAW_HOME?=$(HOME)/.picoclaw
WORKSPACE_DIR?=$(PICOCLAW_HOME)/workspace
JANE_AI_HOME?=$(HOME)/.jane-ai
WORKSPACE_DIR?=$(JANE_AI_HOME)/workspace
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
BUILTIN_SKILLS_DIR=$(CURDIR)/skills
@ -103,7 +103,7 @@ generate:
@$(GO) generate ./...
@echo "Run generate complete"
## build: Build the picoclaw binary for current platform
## build: Build the jane-ai binary for current platform
build: generate
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR)
@ -111,17 +111,17 @@ build: generate
@echo "Build complete: $(BINARY_PATH)"
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)
## build-launcher: Build the picoclaw-launcher (web console) binary
## build-launcher: Build the jane-ai-launcher (web console) binary
build-launcher:
@echo "Building picoclaw-launcher for $(PLATFORM)/$(ARCH)..."
@echo "Building jane-ai-launcher for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR)
@if [ ! -f web/backend/dist/index.html ]; then \
echo "Building frontend..."; \
cd web/frontend && pnpm install && pnpm build:backend; \
cd web/frontend && bun install && bun run build:backend; \
fi
@$(GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-$(PLATFORM)-$(ARCH) ./web/backend
@ln -sf picoclaw-launcher-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/picoclaw-launcher
@echo "Build complete: $(BUILD_DIR)/picoclaw-launcher"
@$(GO) build $(GOFLAGS) -o $(BUILD_DIR)/jane-ai-launcher-$(PLATFORM)-$(ARCH) ./web/backend
@ln -sf jane-ai-launcher-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/jane-ai-launcher
@echo "Build complete: $(BUILD_DIR)/jane-ai-launcher"
## build-whatsapp-native: Build with WhatsApp native (whatsmeow) support; larger binary
build-whatsapp-native: generate
@ -167,7 +167,7 @@ build-linux-mipsle: generate
build-pi-zero: build-linux-arm build-linux-arm64
@echo "Pi Zero 2 W builds: $(BUILD_DIR)/$(BINARY_NAME)-linux-arm (32-bit), $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 (64-bit)"
## build-all: Build picoclaw for all platforms
## build-all: Build jane-ai for all platforms
build-all: generate
@echo "Building for multiple platforms..."
@mkdir -p $(BUILD_DIR)
@ -183,7 +183,7 @@ build-all: generate
GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
@echo "All builds complete"
## install: Install picoclaw to system and copy builtin skills
## install: Install jane-ai to system and copy builtin skills
install: build
@echo "Installing $(BINARY_NAME)..."
@mkdir -p $(INSTALL_BIN_DIR)
@ -194,7 +194,7 @@ install: build
@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
@echo "Installation complete!"
## uninstall: Remove picoclaw from system
## uninstall: Remove jane-ai from system
uninstall:
@echo "Uninstalling $(BINARY_NAME)..."
@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
@ -202,11 +202,11 @@ uninstall:
@echo "Note: Only the executable file has been deleted."
@echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'"
## uninstall-all: Remove picoclaw and all data
## uninstall-all: Remove jane-ai and all data
uninstall-all:
@echo "Removing workspace and skills..."
@rm -rf $(PICOCLAW_HOME)
@echo "Removed workspace: $(PICOCLAW_HOME)"
@rm -rf $(JANE_AI_HOME)
@echo "Removed workspace: $(JANE_AI_HOME)"
@echo "Complete uninstallation done!"
## clean: Remove build artifacts
@ -248,7 +248,7 @@ update-deps:
## check: Run vet, fmt, and verify dependencies
check: deps fmt vet test
## run: Build and run picoclaw
## run: Build and run jane-ai
run: build
@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)
@ -268,19 +268,19 @@ docker-test:
@chmod +x scripts/test-docker-mcp.sh
@./scripts/test-docker-mcp.sh
## docker-run: Run picoclaw gateway in Docker (Alpine-based)
## docker-run: Run jane-ai gateway in Docker (Alpine-based)
docker-run:
docker compose -f docker/docker-compose.yml --profile gateway up
## docker-run-full: Run picoclaw gateway in Docker (full-featured)
## docker-run-full: Run jane-ai gateway in Docker (full-featured)
docker-run-full:
docker compose -f docker/docker-compose.full.yml --profile gateway up
## docker-run-agent: Run picoclaw agent in Docker (interactive, Alpine-based)
## docker-run-agent: Run jane-ai agent in Docker (interactive, Alpine-based)
docker-run-agent:
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent
## docker-run-agent-full: Run picoclaw agent in Docker (interactive, full-featured)
## docker-run-agent-full: Run jane-ai agent in Docker (interactive, full-featured)
docker-run-agent-full:
docker compose -f docker/docker-compose.full.yml run --rm picoclaw-agent
@ -288,11 +288,11 @@ docker-run-agent-full:
docker-clean:
docker compose -f docker/docker-compose.yml down -v
docker compose -f docker/docker-compose.full.yml down -v
docker rmi picoclaw:latest picoclaw:full 2>/dev/null || true
docker rmi jane-ai:latest jane-ai:full 2>/dev/null || true
## help: Show this help message
help:
@echo "picoclaw Makefile"
@echo "jane-ai Makefile"
@echo ""
@echo "Usage:"
@echo " make [target]"
@ -310,7 +310,7 @@ help:
@echo ""
@echo "Environment Variables:"
@echo " INSTALL_PREFIX # Installation prefix (default: ~/.local)"
@echo " WORKSPACE_DIR # Workspace directory (default: ~/.picoclaw/workspace)"
@echo " WORKSPACE_DIR # Workspace directory (default: ~/.jane-ai/workspace)"
@echo " VERSION # Version string (default: git describe)"
@echo ""
@echo "Current Configuration:"

View file

@ -1,5 +1,5 @@
# ============================================================
# Stage 1: Build the picoclaw binary
# Stage 1: Build the jane-ai binary
# ============================================================
FROM golang:1.25-alpine AS builder
@ -27,17 +27,17 @@ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -q --spider http://localhost:18790/health || exit 1
# Copy binary
COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw
COPY --from=builder /src/build/jane-ai /usr/local/bin/jane-ai
# Create non-root user and group
RUN addgroup -g 1000 picoclaw && \
adduser -D -u 1000 -G picoclaw picoclaw
RUN addgroup -g 1000 jane-ai && \
adduser -D -u 1000 -G jane-ai jane-ai
# Switch to non-root user
USER picoclaw
USER jane-ai
# Run onboard to create initial directories and config
RUN /usr/local/bin/picoclaw onboard
RUN /usr/local/bin/jane-ai onboard
ENTRYPOINT ["picoclaw"]
ENTRYPOINT ["jane-ai"]
CMD ["gateway"]

View file

@ -1,5 +1,5 @@
# ============================================================
# Stage 1: Build the picoclaw binary
# Stage 1: Build the jane-ai binary
# ============================================================
FROM golang:1.26.0-alpine AS builder
@ -35,10 +35,10 @@ RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
uv --version
# Copy binary
COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw
COPY --from=builder /src/build/jane-ai /usr/local/bin/jane-ai
# Create picoclaw home directory
RUN /usr/local/bin/picoclaw onboard
# Create jane-ai home directory
RUN /usr/local/bin/jane-ai onboard
ENTRYPOINT ["picoclaw"]
ENTRYPOINT ["jane-ai"]
CMD ["gateway"]

View file

@ -4,7 +4,7 @@ ARG TARGETPLATFORM
RUN apk add --no-cache ca-certificates tzdata
COPY $TARGETPLATFORM/picoclaw /usr/local/bin/picoclaw
COPY $TARGETPLATFORM/jane-ai /usr/local/bin/jane-ai
COPY docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

View file

@ -4,9 +4,9 @@ ARG TARGETPLATFORM
RUN apk add --no-cache ca-certificates tzdata
COPY $TARGETPLATFORM/picoclaw /usr/local/bin/picoclaw
COPY $TARGETPLATFORM/picoclaw-launcher /usr/local/bin/picoclaw-launcher
COPY $TARGETPLATFORM/picoclaw-launcher-tui /usr/local/bin/picoclaw-launcher-tui
COPY $TARGETPLATFORM/jane-ai /usr/local/bin/jane-ai
COPY $TARGETPLATFORM/jane-ai-launcher /usr/local/bin/jane-ai-launcher
COPY $TARGETPLATFORM/jane-ai-launcher-tui /usr/local/bin/jane-ai-launcher-tui
ENTRYPOINT ["picoclaw-launcher"]
ENTRYPOINT ["jane-ai-launcher"]
CMD ["-public", "-no-browser"]

View file

@ -16,7 +16,7 @@ RUN go mod tidy && make build && make build-launcher
FROM alpine:3.23
RUN apk add --no-cache ca-certificates tzdata
COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw
COPY --from=builder /src/build/picoclaw-launcher /usr/local/bin/picoclaw-launcher
ENTRYPOINT ["picoclaw-launcher"]
COPY --from=builder /src/build/jane-ai /usr/local/bin/jane-ai
COPY --from=builder /src/build/jane-ai-launcher /usr/local/bin/jane-ai-launcher
ENTRYPOINT ["jane-ai-launcher"]
CMD ["-public", "-no-browser"]

View file

@ -5,7 +5,7 @@
*.dylib
*.test
*.out
picoclaw-web
jane-ai-web
# Frontend build artifacts (embedded by Go)
dist/*

View file

@ -133,7 +133,7 @@ func isCmdProcessAliveLocked(cmd *exec.Cmd) bool {
}
func (h *Handler) startGatewayLocked() (int, error) {
// Locate the picoclaw executable
// Locate the Jane AI executable
execPath := utils.FindPicoclawBinary()
cmd := exec.Command(execPath, "gateway")
@ -173,7 +173,7 @@ func (h *Handler) startGatewayLocked() (int, error) {
gateway.cmd = cmd
pid := cmd.Process.Pid
logger.InfoCF("gateway", "Started picoclaw gateway", map[string]any{"pid": pid, "execPath": execPath})
logger.InfoCF("gateway", "Started Jane AI gateway", map[string]any{"pid": pid, "execPath": execPath})
// Broadcast starting event
gateway.events.Broadcast(GatewayEvent{Status: "starting", PID: pid})
@ -235,7 +235,7 @@ func (h *Handler) startGatewayLocked() (int, error) {
return pid, nil
}
// handleGatewayStart starts the picoclaw gateway subprocess.
// handleGatewayStart starts the Jane AI gateway subprocess.
//
// POST /api/gateway/start
func (h *Handler) handleGatewayStart(w http.ResponseWriter, r *http.Request) {

View file

@ -492,7 +492,7 @@ func (h *Handler) handleOAuthLogout(w http.ResponseWriter, r *http.Request) {
func renderOAuthCallbackPage(w http.ResponseWriter, flowID, status, title, errMsg string) {
payload := map[string]string{
"type": "picoclaw-oauth-result",
"type": "jane-ai-oauth-result",
"flowId": flowID,
"status": status,
}
@ -515,7 +515,7 @@ func renderOAuthCallbackPage(w http.ResponseWriter, flowID, status, title, errMs
_, _ = fmt.Fprintf(
w,
"<!doctype html><html><head><meta charset=\"utf-8\"><title>PicoClaw OAuth</title></head><body><script>(function(){var payload=%s;var hasOpener=false;try{if(window.opener&&!window.opener.closed){window.opener.postMessage(payload,window.location.origin);hasOpener=true}}catch(e){}var target='/credentials?oauth_flow_id='+encodeURIComponent(payload.flowId||'')+'&oauth_status='+encodeURIComponent(payload.status||'');setTimeout(function(){if(hasOpener){window.close();return}window.location.replace(target)},800)})();</script><div style=\"font-family:Inter,system-ui,sans-serif;padding:24px\"><h2>%s</h2><p>%s</p><p>You can close this window.</p></div></body></html>",
"<!doctype html><html><head><meta charset=\"utf-8\"><title>Jane AI OAuth</title></head><body><script>(function(){var payload=%s;var hasOpener=false;try{if(window.opener&&!window.opener.closed){window.opener.postMessage(payload,window.location.origin);hasOpener=true}}catch(e){}var target='/credentials?oauth_flow_id='+encodeURIComponent(payload.flowId||'')+'&oauth_status='+encodeURIComponent(payload.status||'');setTimeout(function(){if(hasOpener){window.close();return}window.location.replace(target)},800)})();</script><div style=\"font-family:Inter,system-ui,sans-serif;padding:24px\"><h2>%s</h2><p>%s</p><p>You can close this window.</p></div></body></html>",
string(payloadJSON),
html.EscapeString(title),
html.EscapeString(message),

View file

@ -14,8 +14,8 @@ import (
)
const (
autoStartEntryName = "PicoClawLauncher"
launchAgentLabel = "io.picoclaw.launcher"
autoStartEntryName = "JaneAILauncher"
launchAgentLabel = "io.jane-ai.launcher"
)
type autoStartRequest struct {
@ -215,7 +215,7 @@ func buildDarwinPlist(exePath string, args []string) string {
func linuxAutoStartPath() string {
home, _ := os.UserHomeDir()
return filepath.Join(home, ".config", "autostart", "picoclaw-web.desktop")
return filepath.Join(home, ".config", "autostart", "jane-ai-web.desktop")
}
func shellQuote(s string) string {
@ -247,8 +247,8 @@ func setLinuxAutoStart(enabled bool, exePath string, args []string) error {
"[Desktop Entry]",
"Type=Application",
"Version=1.0",
"Name=PicoClaw Web",
"Comment=Start PicoClaw Web on login",
"Name=Jane AI Web",
"Comment=Start Jane AI Web on login",
"Exec=" + buildLinuxExecLine(exePath, args),
"Terminal=false",
"X-GNOME-Autostart-enabled=true",

View file

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB