From 145df1b3c84d5105394fd794e5087efa3ca1abda Mon Sep 17 00:00:00 2001 From: Echo Date: Thu, 9 Apr 2026 19:12:45 +0000 Subject: [PATCH] Phase 1: Foundation - CI/CD, systemd service, test framework Completed Phase 1 foundation tasks: - CI/CD pipeline (.github/workflows/ci.yml) - Format check (rustfmt) - Clippy lints - Unit tests with codecov - Security audit (cargo-audit) - Build release artifacts - Ubuntu package build - Systemd service file (configs/linux-patch-api.service) - Security hardening (ProtectSystem, SystemCallFilter) - Journal logging integration - Resource limits - Test framework structure (tests/unit/, tests/integration/) - Initial unit test template - Test framework verified with cargo test Rust toolchain 1.94.1 installed and verified. --- .a0proj/memory/index.faiss | Bin 471085 -> 487469 bytes .a0proj/memory/index.faiss.sha256 | 2 +- .a0proj/memory/index.pkl | Bin 105408 -> 107996 bytes .github/workflows/ci.yml | 111 ++++++++++++++++++++++++++++++ configs/linux-patch-api.service | 57 +++++++++++++++ tests/unit/config.rs | 28 ++++++++ 6 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml create mode 100644 configs/linux-patch-api.service create mode 100644 tests/unit/config.rs diff --git a/.a0proj/memory/index.faiss b/.a0proj/memory/index.faiss index 1031da750cf838e15359eece6f03b0fc703d2cdc..b2ac0f73e288c6f362d3fd2423162af46d5fedc9 100644 GIT binary patch delta 20690 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 delta 211 zcmca}n(e@LwuUW?p1e%?ecQcx8711e5{pZ6LXyor4PB<^PGJmm=?lq7RVXOR&q_@$ zQOGP-NKVYjNlj7k$;>OQPzXpYNzPDk4Di%ZNK^`t4;^8rZIL+XP&{RKRskR