Timeline
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

36 check-ins

2026-01-31
01:00
title Leaf check-in: f93085b17f user: thetanil tags: trunk
2026-01-29
17:18
* think for me check-in: ba78e9578f user: thetanil tags: trunk
12:34
* plan: modulekit check-in: 00b17c9954 user: thetanil tags: trunk
09:38
* plan for module refactor check-in: 4b27db53eb user: thetanil tags: trunk
08:52
Implement Shep 0.2 task execution system

Add session-based command execution with persistent shell sessions and null-byte delimited command boundary detection. This enables running multiple commands on the same shell session with proper exit code capture.

New components:

  • PipeTriple interface for transport-agnostic shell I/O (local shell now, SSH/WinRM future)
  • SessionManager for session lifecycle (create, reuse, close)
  • Execute capability with FlatBuffer schema for request/response
  • Async task support with dedicated sessions per task
  • shep-module-shell for arbitrary command execution
  • shep-module-copy for file transfer via base64 encoding

Key design decisions:

  • Modules are stateless command executors; they don't know or choose which host they run on. Shep analyzes the playbook, establishes sessions to hosts, and connects modules to those sessions.
  • ExecuteRequest contains only: command, timeout_ms, env. No host or session fields - this prevents untrusted modules from targeting arbitrary hosts.
  • Shep owns all routing decisions based on playbook analysis.

Implementation details:

  • Command boundary protocol uses \0SHEP:%d\0 markers (null bytes ensure no collision with command output)
  • Line ending normalization (CR+LF -> LF) for cross-platform consistency
  • Sync tasks share default session per host; async tasks get isolated sessions
  • Sessions automatically cleaned up after async task completion

Files added:

  • internal/session/ (pipe.go, local_shell.go, session.go, manager.go)
  • internal/host/execute.go
  • modules/shell/main.go
  • modules/copy/main.go
  • flatbuffers/capabilities/execute.fbs
check-in: 07b10488a7 user: thetanil tags: trunk
08:49
(no comment) check-in: 76b4db0b2e user: thetanil tags: trunk
08:44
make[1]: Nothing to be done for 'changelog'. check-in: 766fb64184 user: thetanil tags: trunk
01:01
plan reviewed. ready check-in: ca6e620a10 user: thetanil tags: trunk
2026-01-28
23:59
v0.2 plan busted check-in: 885490583d user: thetanil tags: trunk
23:11
- plan taskexecutor, pipe capability, shell and cp check-in: 13dcee2ca2 user: thetanil tags: trunk
21:49
- add cov - change heading check-in: d273802d84 user: thetanil tags: trunk
21:44
make[1]: Nothing to be done for 'changelog'. check-in: b9084874e4 user: thetanil tags: trunk
21:16

make doclink

check-in: 0e7fba5fc1 user: thetanil tags: trunk
21:06

Coverage

check-in: 0e92225876 user: thetanil tags: trunk
17:05
get the notes out of readme check-in: f893fc01ce user: thetanil tags: trunk
17:04
get the notes out of readme check-in: fd0f2f8acc user: thetanil tags: trunk
17:03
get the notes out of readme check-in: 97ba15d35e user: thetanil tags: trunk
16:49
test refactor
  • Test Refactoring: Consolidated duplicate tests into table-driven tests using a structured testdata/table/ directory - Inventory tests: Migrated 6 inline tests to table-driven format (simple-ungrouped, hierarchical-groups, group-vars, empty-group, ansible-examples, inherit-group)
- Playbook tests: Migrated 11 inline tests to table-driven format (simple-tasks, with-handlers, with-block, with-roles, with-import, multi-play, fqcn-modules, with-loop, pre-post-tasks, become, pass-loop-var-prefix)
- Task tests: Migrated 5 inline tests to table-driven format (simple-task, passing-task, main-tasks, empty-blocks, local-action)
- Each test case now consists of a .yml input file paired with an .expected.json file containing the expected parsed output
- Standalone edge case tests retained for: invalid YAML, empty requests, FlatBuffer round-trips, and error responses
check-in: 81c3e18313 user: thetanil tags: trunk
2026-01-27
23:24
playbooks and tasks check-in: 1cf91b6f1f user: thetanil tags: trunk
22:54
more test data from ansible-lint check-in: 4ae50f856c user: thetanil tags: trunk
22:53
plan for playbook and tasks check-in: 6198530c48 user: thetanil tags: trunk
21:24
update for agents check-in: fabf732258 user: thetanil tags: trunk
21:12

Add shep-plugin-inventory with inventory capability

Implements the inventory plugin for parsing Ansible YAML inventory files and the shep inventory ls CLI command.

New Plugin: shep-plugin-inventory

  • Declares inventory capability (version 1)
  • Parses Ansible YAML inventory format
  • Handles nested group hierarchies with children
  • Collects host and group variables
  • Deduplicates hosts across multiple group definitions

FlatBuffers Schemas

  • flatbuffers/domain/inventory.fbs - Domain types: Var, Host, Group, Inventory
  • flatbuffers/capabilities/inventory.fbs - InventoryRequest/InventoryResponse

CLI Commands

  • shep inventory ls -i <file> - List hosts and groups
  • shep i ls -i <file> - Short form
  • --format json|yaml|text - Output format selection
  • -v verbose mode shows full variable details

Tests

  • Unit tests for YAML parsing and FlatBuffer round-trips
  • Integration tests for full plugin lifecycle via host manager
  • Tests against Ansible example inventory files

Documentation

  • Added "FlatBuffers Generated Code vs Go Structs" section to AGENTS.md
  • Explains rationale for plugin Go structs mirroring FlatBuffers types
check-in: d9863a8238 user: thetanil tags: trunk
20:21
inventory parser plan check-in: 0e967cded3 user: thetanil tags: trunk
18:12
inventory examples check-in: 1285984d3e user: thetanil tags: trunk
17:31
ansible docs check-in: 23705eee5b user: thetanil tags: trunk
11:53
first pass at host and plugin design check-in: eef6295ad6 user: thetanil tags: trunk
00:25
plan reviewed check-in: 8a6c889a26 user: thetanil tags: trunk
2026-01-26
23:09
thanks docker (not working) check-in: 4c5d7aeaff user: thetanil tags: trunk
23:07
still go 1.25.5 in the container, tho the dockerfile says otherwise. check-in: 45824b3373 user: thetanil tags: trunk
22:45
first arch pass check-in: 6afc9441fa user: thetanil tags: trunk
22:15
init project check-in: 59bff64f0f user: thetanil tags: trunk
22:05
init 3 check-in: 1741d086a9 user: thetanil tags: trunk
22:05
init2 check-in: 219bdfb392 user: thetanil tags: trunk
22:00
init check-in: cbac3b73ba user: thetanil tags: trunk
21:56
initial empty check-in check-in: 985c6f52b6 user: fossil tags: trunk