- Add ProcessExecutor class wrapping PIProcess with proper cleanup - Add CMake FAKE option (-DFAKE=ON) for testing without opencode - Add 3 FAKE-mode tests for full pipeline execution, status transitions, output - Fix PIThread lifecycle: use startOnce() instead of start(), track threads, wait + delete in destructor to prevent use-after-free of PIDeque<PIChar> - Update build.sh with --fake flag and automatic cache invalidation - Upgrade CMake to C++17 standard - Update AGENTS.md with build commands and FAKE mode
3.8 KiB
3.8 KiB
AGENTS.md
Repo layout
pipeline-runner/— C++11 application built with PIP (Platform Independent Primitives).pipeline-runner/src/main.cpp— entry point, config loading, server start.pipeline-runner/src/server.h/.cpp— PIHTTPServer routes, all API endpoints.pipeline-runner/src/pipeline.h/.cpp— Pipeline/Prompt structs, JSON file I/O, log functions.pipeline-runner/src/runner.h/.cpp— async pipeline execution (PIThread + PIProcess per step).pipeline-runner/src/messageutils.h/.cpp— HTTP response helpers (JSON, error, success).pipeline-runner/pipeline-runner.conf— JSON config file (port, directories).pipeline-runner/tests/— gtest tests for pipeline storage and runner.pipeline-runner/CMakeLists.txt— CMake build config with PIP + gtest (FetchContent).pipeline-runner/build.sh— build + test script (incremental by default,--rebuildfor clean).pipeline-runner/storage/pipelines/— JSON files for persisted pipelines.pipeline-runner/storage/logs/— execution logs (one file per run).
Dev commands
- Build + test:
./pipeline-runner/build.sh(incremental, auto-configures on first run). - Clean build + test:
./pipeline-runner/build.sh --rebuild. - Build with FAKE mode:
./pipeline-runner/build.sh --rebuild --fake(uses fake process executor, no opencode needed). - Switching
--fakeon/off triggers a clean + reconfigure automatically. - Run:
cd pipeline-runner/build && ./pipeline-runner ../pipeline-runner.conf - Test XML report: generated at
pipeline-runner/build/test-results.xmlafter each test run. - CMake uses
-S <src> -B <build>andcmake --build <build> -j$(nproc)(nocd build && make).
Build requirements
- PIP library must be installed system-wide (
find_package(PIP REQUIRED)). - gtest is fetched via custom mirror:
https://git.shstk.ru/mirrors/googletest.git(v1.14.0). CMAKE_EXPORT_COMPILE_COMMANDS ON—compile_commands.jsonis generated in build dir for LSP.CMakeLists.txtusesfile(GLOB ...)for sources — new.cppfiles require re-runningcmake ...- RPATH is set to
$ORIGIN;$ORIGIN/libso the binary finds PIP shared libs from its directory.
Formatting
- Tabs (width 4), LF line endings, UTF-8 — enforced by
.editorconfig. .clang-formatcolumn limit: 140. Useclang-format -ion changed files.
API endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/pipelines |
List all pipelines |
| POST | /api/pipelines |
Create pipeline (JSON body) |
| GET | /api/pipelines/{id} |
Get single pipeline |
| DELETE | /api/pipelines/{id} |
Delete pipeline |
| POST | /api/runs |
Start execution ({"pipeline_id": "..."}) |
| GET | /api/runs/{run_id}/status |
Poll run status + step results |
| GET | /api/runs/{run_id}/log |
Get log file contents |
Key behaviors
- C++11 standard — no modern C++ features (no
autoreturn type deduction, nostd::optional, etc.). - All source code is in the global namespace (no namespace wrapping).
- Pipeline execution runs
opencode run <text> --title <title>per step viaPIProcess(not a shell). - Each step has a 300-second timeout (
proc.waitForFinish(PISystemTime::fromSeconds(300))). - Pipeline stops on first step error (non-zero return code).
- Each run executes in a separate
PIThread(thread object is intentionally leaked; PIP manages lifetime). - Run state is in-memory only — lost on server restart. Log files persist to disk.
- CORS headers are added to all responses (
Access-Control-Allow-Origin: *). - Config paths (
pipelines_dir,logs_dir) are relative to the process working directory, not the binary path. - Tests use
/tmp/pipeline-runner-test/with manual setup/cleanup per test — not isolated, do not run in parallel.