personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(runner): encode dream mode in log names

Derive mode-specific log names for sol dream invocations so runner output files and symlinks distinguish daily, segment, flush, activity, and weekly runs.

Add focused runner coverage for the dream mode name derivation logic.

+61
+48
tests/test_runner.py
··· 4 4 """Tests for think.runner and logs tract integration.""" 5 5 6 6 import os 7 + from io import StringIO 7 8 8 9 import pytest 9 10 ··· 324 325 assert exit_code == 0 325 326 assert target_day in str(log_path) 326 327 assert log_path.exists() 328 + 329 + 330 + @pytest.mark.parametrize( 331 + ("cmd", "expected_name"), 332 + [ 333 + (["sol", "dream", "--day", "20240115"], "daily_dream"), 334 + (["sol", "dream", "--day", "20240115", "--segment", "120000_300"], "segment_dream"), 335 + (["sol", "dream", "--weekly"], "weekly_dream"), 336 + (["sol", "dream", "--activity", "id", "--facet", "work", "--day", "20240115"], "activity_dream"), 337 + (["sol", "dream", "--day", "20240115", "--segment", "120000_300", "--flush"], "flush_dream"), 338 + (["sol", "dream", "--day", "20240115", "--segments"], "segment_dream"), 339 + ], 340 + ) 341 + def test_dream_mode_name_derivation( 342 + journal_path, mock_callosum, monkeypatch, cmd, expected_name 343 + ): 344 + """Dream commands produce mode-aware log names.""" 345 + 346 + class FakePopen: 347 + def __init__(self, *args, **kwargs): 348 + self.pid = 4321 349 + self.stdout = StringIO("") 350 + self.stderr = StringIO("") 351 + self.returncode = 0 352 + 353 + def wait(self, timeout=None): 354 + self.returncode = 0 355 + return 0 356 + 357 + def poll(self): 358 + return self.returncode 359 + 360 + def terminate(self): 361 + self.returncode = -15 362 + 363 + def kill(self): 364 + self.returncode = -9 365 + 366 + monkeypatch.setattr("think.runner.subprocess.Popen", FakePopen) 367 + 368 + managed = ManagedProcess.spawn(cmd, ref="testref") 369 + 370 + assert managed.name == expected_name 371 + assert managed.log_writer.path.name == f"testref_{expected_name}.log" 372 + 373 + managed.wait() 374 + managed.cleanup()
+13
think/runner.py
··· 243 243 # Derive name from command - use subcommand if invoked via sol 244 244 if cmd[0] == "sol" and len(cmd) > 1: 245 245 name = cmd[1] 246 + if name == "dream": 247 + for flag, mode in [ 248 + ("--activity", "activity"), 249 + ("--flush", "flush"), 250 + ("--segments", "segment"), 251 + ("--weekly", "weekly"), 252 + ("--segment", "segment"), 253 + ]: 254 + if flag in cmd: 255 + name = f"{mode}_dream" 256 + break 257 + else: 258 + name = "daily_dream" 246 259 else: 247 260 name = Path(cmd[0]).name 248 261