From 5b8d0c632631cbceb3109e2a73e69991c3a6a1ec Mon Sep 17 00:00:00 2001 From: Daniel Pupius Date: Fri, 18 Apr 2025 16:18:16 -0700 Subject: [PATCH] Update build process and add proper .gitignore and .env.example --- .env.example | 12 + .gitignore | 71 + CLAUDE.md | 1 + Makefile | 7 +- meshstream | Bin 8511776 -> 0 bytes proto/tmp/admin.proto | 474 ------- proto/tmp/apponly.proto | 31 - proto/tmp/atak.proto | 263 ---- proto/tmp/cannedmessages.proto | 19 - proto/tmp/channel.proto | 156 --- proto/tmp/clientonly.proto | 58 - proto/tmp/config.proto | 1147 --------------- proto/tmp/connection_status.proto | 120 -- proto/tmp/device_ui.proto | 290 ---- proto/tmp/deviceonly.proto | 291 ---- proto/tmp/interdevice.proto | 44 - proto/tmp/localonly.proto | 140 -- proto/tmp/mesh.proto | 2151 ----------------------------- proto/tmp/module_config.proto | 849 ------------ proto/tmp/mqtt.proto | 106 -- proto/tmp/nanopb.proto | 185 --- proto/tmp/paxcount.proto | 29 - proto/tmp/portnums.proto | 232 ---- proto/tmp/powermon.proto | 104 -- proto/tmp/remote_hardware.proto | 75 - proto/tmp/rtttl.proto | 19 - proto/tmp/storeforward.proto | 218 --- proto/tmp/telemetry.proto | 593 -------- proto/tmp/xmodem.proto | 27 - 29 files changed, 88 insertions(+), 7624 deletions(-) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 CLAUDE.md delete mode 100755 meshstream delete mode 100644 proto/tmp/admin.proto delete mode 100644 proto/tmp/apponly.proto delete mode 100644 proto/tmp/atak.proto delete mode 100644 proto/tmp/cannedmessages.proto delete mode 100644 proto/tmp/channel.proto delete mode 100644 proto/tmp/clientonly.proto delete mode 100644 proto/tmp/config.proto delete mode 100644 proto/tmp/connection_status.proto delete mode 100644 proto/tmp/device_ui.proto delete mode 100644 proto/tmp/deviceonly.proto delete mode 100644 proto/tmp/interdevice.proto delete mode 100644 proto/tmp/localonly.proto delete mode 100644 proto/tmp/mesh.proto delete mode 100644 proto/tmp/module_config.proto delete mode 100644 proto/tmp/mqtt.proto delete mode 100644 proto/tmp/nanopb.proto delete mode 100644 proto/tmp/paxcount.proto delete mode 100644 proto/tmp/portnums.proto delete mode 100644 proto/tmp/powermon.proto delete mode 100644 proto/tmp/remote_hardware.proto delete mode 100644 proto/tmp/rtttl.proto delete mode 100644 proto/tmp/storeforward.proto delete mode 100644 proto/tmp/telemetry.proto delete mode 100644 proto/tmp/xmodem.proto diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5e798ef --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +# MQTT Broker Configuration +MQTT_BROKER=mqtt.bayme.sh +MQTT_PORT=1883 +MQTT_USERNAME=meshdev +MQTT_PASSWORD=large4cats + +# Topic Configuration +MQTT_TOPIC_PREFIX=msh/US/CA/Motherlode + +# Application Settings +# Set to "true" to enable debug logging +DEBUG=false \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8831e1f --- /dev/null +++ b/.gitignore @@ -0,0 +1,71 @@ +# Binaries and build artifacts +/dist/ +/bin/ + +# Go specific +*.exe +*.exe~ +*.dll +*.so +*.dylib +*.test +*.out +go.work + +# Protocol buffer generated files +proto/tmp/ + +# IDE specific files +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Dependency directories +vendor/ + +# Log files +*.log + +# Testing +/coverage.txt +/profile.out + +# Environment files +.env +.envrc +.env.local +.env.development.local +.env.test.local +.env.production.local + +# direnv +.direnv + +# Local development files +*.local +.air.toml + +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Debug files +debug +debug.test + +# Temporary files +tmp/ +temp/ \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..865f78c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +- Never run the program, you may build it and run tests, but I will run the program manually. \ No newline at end of file diff --git a/Makefile b/Makefile index b32cec3..279a4a4 100644 --- a/Makefile +++ b/Makefile @@ -9,11 +9,12 @@ PROTOC_GEN_GO := $(TOOLS_DIR)/protoc-gen-go # Build the application build: - go build -o meshstream + mkdir -p dist + go build -o dist/meshstream # Run the application run: build - ./meshstream + ./dist/meshstream # Generate Go code from Protocol Buffers gen-proto: tools @@ -26,7 +27,7 @@ gen-proto: tools # Clean generated files clean: - rm -f meshstream + rm -rf dist rm -rf $(BIN_DIR) find . -name "*.pb.go" -type f -delete diff --git a/meshstream b/meshstream deleted file mode 100755 index ba547626f4122013927f51f6ca7b64b40ba5d8ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8511776 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