Skip to content

Conversation

@ebowwa
Copy link
Owner

@ebowwa ebowwa commented Jan 25, 2026

No description provided.

ebowwa and others added 30 commits January 20, 2026 22:16
- Add LaneTool for installing lane CLI from bun-migration branch
- Remove outdated documentation files
- Add test scripts and lane test suite

Co-Authored-By: Claude <noreply@anthropic.com>
* feat: add Ralph Iterative plugin installer

- Add RalphTool for installing the ralph-iterative Claude Code plugin
- Ralph provides loop-until-completion task execution (Mr. Meeseeks mode)
- Clones from https://github.com/ebowwa/ralph
- Installs as Claude Code marketplace plugin
- Only installs when Claude Code is present

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve node-agent path from parent directory when run from v2

- Add parent directory (..) to possiblePaths search locations
- Use realpath shell command to resolve relative paths to absolute
- Fixes issue where setup run from v2 couldn't find node-agent

The Node Agent tool installer searches for the node-agent directory
in multiple locations. When setup.sh is run from the root, it uses
process.cwd() which points to v2/src during execution. This change
adds the parent directory to the search path and uses realpath for
proper path resolution.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: use symlink instead of bun install -g for lane

bun install -g . fails with dependency loop error on lane package.
Replaced with direct symlink from binDir to the built binary.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: use $HOME for bun PATH configuration

Was using /.bun/bin (root), corrected to ${HOME}/.bun/bin
for proper bun discovery across environments.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: add bun PATH to shell configs for persistence

Previously only tried /etc/environment which requires sudo.
Now falls back to shell config files (~/.zshrc, ~/.bashrc, etc.)
ensuring bun is available in new shell sessions.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: detect user shell and prioritize its config file

Previously tried configs in fixed order. Now:
1. Detects $SHELL (zsh, bash, sh)
2. Prioritizes that shell's config file
3. Falls back to other configs if needed

Works correctly on both macOS (zsh default) and Linux (bash common).

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
* feat: add Ralph Iterative plugin installer

- Add RalphTool for installing the ralph-iterative Claude Code plugin
- Ralph provides loop-until-completion task execution (Mr. Meeseeks mode)
- Clones from https://github.com/ebowwa/ralph
- Installs as Claude Code marketplace plugin
- Only installs when Claude Code is present

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve node-agent path from parent directory when run from v2

- Add parent directory (..) to possiblePaths search locations
- Use realpath shell command to resolve relative paths to absolute
- Fixes issue where setup run from v2 couldn't find node-agent

The Node Agent tool installer searches for the node-agent directory
in multiple locations. When setup.sh is run from the root, it uses
process.cwd() which points to v2/src during execution. This change
adds the parent directory to the search path and uses realpath for
proper path resolution.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: use symlink instead of bun install -g for lane

bun install -g . fails with dependency loop error on lane package.
Replaced with direct symlink from binDir to the built binary.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: use $HOME for bun PATH configuration

Was using /.bun/bin (root), corrected to ${HOME}/.bun/bin
for proper bun discovery across environments.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: add bun PATH to shell configs for persistence

Previously only tried /etc/environment which requires sudo.
Now falls back to shell config files (~/.zshrc, ~/.bashrc, etc.)
ensuring bun is available in new shell sessions.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: detect user shell and prioritize its config file

Previously tried configs in fixed order. Now:
1. Detects $SHELL (zsh, bash, sh)
2. Prioritizes that shell's config file
3. Falls back to other configs if needed

Works correctly on both macOS (zsh default) and Linux (bash common).

Co-Authored-By: Claude <noreply@anthropic.com>

* chore: move Ralph scripts to ralph repo

Ralph execution scripts moved to their canonical home:
- ralph (agent orchestration) is the right place
- seed (bootstrap) should only have environment setup

See: ralph@974509c

Co-Authored-By: Claude <noreply@anthropic.com>

* chore: move AUTONOMOUS.md to ralph repo

Documentation for autonomous Ralph belongs with the agent.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove docs/ prefix from tracked file paths

The docs/ directory doesn't exist in this repository. Changed paths to root level.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Tools are now installed concurrently using Promise.all(), with bun as
a prerequisite installed first. This significantly reduces setup time
since most tools are independent.

Co-Authored-By: Claude <noreply@anthropic.com>
BREAKING: Optimizes installation order for faster tool availability

Changes:
- Phase 1: curl tools (claude, doppler) - parallel, no deps
- Phase 2: bun - verification only
- Phase 3: bun-dependent tools (lane, node-agent) - parallel, requires bun
- Phase 4: apt tools (node, tmux, gh) - serial (dpkg lock constraint)
- Helper functions runToolsParallel() and runToolsSerial() to reduce duplication
- Per-phase timing logs for debugging

Benefits:
- 4 common tools finish 45-60s earlier (claude, doppler, lane, node-agent)
- Better user experience with faster access to commonly-used tools
- Only apt-based tools wait until end (unavoidable dpkg lock)

Co-authored-by: Clawdbot <assistant@clawdbot.ai>
Remove duplicate scripts from root and organize into scripts/ directory.
Also add Claude Code tracking files.

Co-Authored-By: Claude <noreply@anthropic.com>
The old Yarn repository has an expired GPG key that causes apt-get update
to fail. Remove it before updating packages since Node.js is installed via
apt, not Yarn.

Co-Authored-By: Claude <noreply@anthropic.com>
- Changed setup.sh to use regular bun run instead of exec (allows continuation)
- Added systemd service setup in setup.sh after TypeScript setup completes
- Removed ~115 lines of systemd logic from node-agent.ts
- Removed runDirectly() method that handled background process spawning
- Node-agent now only installs and builds; startup delegated to bash script

Co-Authored-By: Claude <noreply@anthropic.com>
Remove interactive prompt that was blocking parallel installation
in Phase 3. Node-agent now always installs when detected.

Co-Authored-By: Claude <noreply@anthropic.com>
- Check checkInstalled() before running install to skip existing tools
- Start node-agent directly when systemd unavailable (containers)
- This saves ~90s by skipping node on codespaces (already installed)

Co-Authored-By: Claude <noreply@anthropic.com>
Update setup.sh to detect if systemd is available. In containers
(codespaces), start node-agent directly with bun instead of using
systemd which doesn't run in containers.

Co-Authored-By: Claude <noreply@anthropic.com>
Previous check only verified systemctl exists, but codespaces has
systemctl without running systemd. Use is-system-running to verify
systemd is actually active before using it.

Co-Authored-By: Claude <noreply@anthropic.com>
- Check port 8911 instead of unreliable pgrep for verification
- Save PID to file for proper process tracking
- Redirect output to log file for debugging
- Show log content if startup fails

Co-Authored-By: Claude <noreply@anthropic.com>
systemctl is-system-running returns exit code 0 even when systemd
is not running (error goes to stderr). Check for the systemd
runtime directory which only exists when systemd is active.

Co-Authored-By: Claude <noreply@anthropic.com>
- Handle root's home directory (/root not /home/root)
- Update Group field in service file
- Use actual NODE_AGENT_PATH for WorkingDirectory
- Update ExecStart path to use correct bun location
- Update ReadWritePaths to use correct directories

Co-Authored-By: Claude <noreply@anthropic.com>
Add support for monitoring .claude/.ralph-iterative.*.json files:
- Add RalphIterativeStateFile type matching the JSON schema
- Scan /root/seed and /root/seed/worktrees recursively
- Skip node_modules and hidden dirs (except .claude)
- Extract prompt, iteration, SLAM phase, completion promise
- Backward compatible with legacy markdown state files

Co-Authored-By: Claude <noreply@anthropic.com>
Add support for monitoring .claude/.ralph-iterative.*.json files:
- Add RalphIterativeStateFile type matching the JSON schema
- Scan /root/seed and /root/seed/worktrees recursively
- Skip node_modules and hidden dirs (except .claude)
- Extract prompt, iteration, SLAM phase, completion promise
- Backward compatible with legacy markdown state files

Co-Authored-By: Claude <noreply@anthropic.com>
Enhance RalphLoop response with Ralph Iterative specific fields:
- phase: planning/executing/review/complete
- current_task: current subtask being worked on
- total_subtasks: total number of subtasks
- completed_subtasks: count of completed subtasks
- subtasks: array of subtask summaries (id, title, status)

Co-Authored-By: Claude <noreply@anthropic.com>
Add relative path display showing where each Ralph loop is running:
- project_path: ~/seed or ~/seed/worktrees/feature-x
- Extracted from state file location
- Formatted relative to home directory

Co-Authored-By: Claude <noreply@anthropic.com>
Fetch and display git context for each running Ralph loop:
- git_info.remote: e.g., "ebowwa/seed" (extracted from origin URL)
- git_info.branch: current checked out branch
- Fallback to null if not a git repo

Co-Authored-By: Claude <noreply@anthropic.com>
- index.ts: Worktree CRUD endpoints not tested with actual git worktrees
- ralph.ts: Add caching and fs.watch() for real-time state updates

Co-Authored-By: Claude <noreply@anthropic.com>
- Add Ralph Iterative options to CreateRalphLoopRequest (enable_subagents, auto_commit, auto_pr, base_branch)
- Rewrite startRalphLoop() to use .claude/.ralph-iterative.local.json instead of legacy markdown format
- Add detectMachineResources() for SLAM capacity scoring (CPU, memory, disk, platform)
- Add checkIfContainer() to detect if running in Docker/containerd
- Add parseSizeToGB() helper for parsing df output
- Update permissions to use Skill(ralph-iterative:ralph-iterative)

Co-Authored-By: Claude <noreply@anthropic.com>
- Remove --porcelain flag which outputs key-value pairs
- Parse regular output format: /path commit [branch]
- Fix broken worktree display in GUI

Co-Authored-By: Claude <noreply@anthropic.com>
Resolved conflicts:
- ralph.ts: Combined Ralph Iterative features with TODO comments
- lane.ts: Use bun-migration branch for lane tool
- claude-code-* files: Kept renamed versions in docs/

Co-Authored-By: Claude <noreply@anthropic.com>
* feat: Add PM Daemon - Telegram-Connected Node Orchestrator

Implements the PM Daemon design from docs/internal/docs/PM-DAEMON-DESIGN.md.

The PM Daemon is an LLM-powered AI agent that runs as a persistent loop on
each seed node, providing a 24/7 project manager interface via Telegram.

**New Services:**
- services/telegram.ts - Telegram Bot API client (long-polling, exponential backoff)
- services/node-registry.ts - Multi-node registry with health checks
- services/pm-commands.ts - Slash command router (/status, /loops, /start, /stop, etc.)
- services/pm-monitor.ts - Monitor loop (detects completions, errors, stalls)
- services/pm-brain.ts - Claude Code session manager via doppler subprocess

**Configuration:**
- src/config/nodes.yaml - Node registry template
- .env.example - Added PM_DAEMON_ENABLED, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID
- CLAUDE.md - PM daemon persona/system prompt

**Changes:**
- src/types/index.ts - Added PM daemon types (Telegram, NodeRegistry, MonitorEvent, etc.)
- src/index.ts - Conditional PM daemon startup when PM_DAEMON_ENABLED=true

**Doppler Secrets (seed/prd):**
- TELEGRAM_BOT_TOKEN - Bot token for @SimulationapiBot
- TELEGRAM_CHAT_ID - Allowed chat ID for operator
- PM_DAEMON_ENABLED - Enables PM daemon on all nodes

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: PM brain now uses persistent session with conversation memory

Previously spawned a new Claude Code session per message (stateless).
Now maintains a persistent virtual session with conversation history.

Changes:
- pmBrain.start() called on PM daemon startup
- pmBrain.stop() called on shutdown
- Each message includes last 20 messages for context
- Max 100 messages stored (with system prompt preserved)
- Processing lock prevents concurrent messages

This gives the PM "memory" - it remembers previous context and can
reference earlier parts of the conversation.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: PM brain now uses true persistent Claude session + workers

Two types of Claude sessions:
1. Persistent session (main brain)
   - One long-running doppler run -- claude process
   - Communicates via stdin/stdout pipes
   - Maintains conversation memory
   - Auto-restarts on crash

2. Spawned workers (for isolated tasks)
   - Fresh claude -p instances for one-off tasks
   - Don't affect persistent session memory
   - Can run multiple in parallel

Changes:
- Added PersistentClaudeSession class with stdin/stdout handling
- pmBrain.processMessage() uses persistent session
- pmBrain.spawnWorker() spawns fresh instances
- pmBrain.spawnWorkers() for parallel execution

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: strip PM brain to essentials - let Claude handle memory

Removed all the manual conversation tracking that I overengineered.
Claude Code already has built-in memory and context management.

What it does now:
- Spawn ONE persistent doppler run -- claude process
- Pipe stdin/stdout for communication
- Claude handles all memory (no manual tracking needed)
- Monitor loop injects context as messages
- Spawned workers available for parallel tasks

600+ lines → 410 lines

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: organize PM daemon services into /daemon subdirectory

PM daemon services now live in src/services/daemon/:
- telegram.ts
- pm-brain.ts
- pm-commands.ts
pm-monitor.ts
- node-registry.ts

Core services remain in src/services/:
- git.ts
-ralph.ts
-setup.ts

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: Add WebSocket oversight for PM daemon

- Add real-time bidirectional WebSocket for peeking into running Claude sessions
- Store process handles (stdin/stdout) for active Ralph loops
- Add WS endpoint: /api/ralph-loops/:id/ws
- Stream Claude stdout → WebSocket for visibility
- Relay WebSocket messages → Claude stdin for oversight
- Remove node-registry (deferred to multi-node architecture)
- Update PM daemon to single-node mode
- Add NODE-REGISTRY-DESIGN.md for future multi-node reference

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: Rename PmBrainService to DaemonLayerAgentService

- Rename pm-brain.ts → daemon-layer-agent.ts
- Update class name: PmBrainService → DaemonLayerAgentService
- Update imports and references in index.ts

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: Install lane from npm via bun install + symlink

- Install @ebowwa/lane from npm using bun install
- Symlink ~/.lane-install/node_modules/.bin/lane to ~/.local/bin/lane
- Avoids broken bun -g and unnecessary git clone
- Update tests for npm-based installation

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
- Add architecture overview with ASCII diagram
- Document integration points for @codespaces/tooling
- Add 17 TODO markers for future tooling integration
- Enhance JSDoc comments for all public methods
- Add placeholder methods (syncRepos, getRepoStatus, validate)

Co-Authored-By: Claude <noreply@anthropic.com>
ebowwa and others added 15 commits February 1, 2026 11:35
…atus

- Add ConsoleLoggerService with periodic status updates
- Track all Claude Code processes with PID, worktree, loop info
- Display full Ralph loop state (iteration, phase, subtasks, git info, PID)
- Detect and display active plugins (MCP servers, skills, hooks)
- Beautiful box-drawing character formatting

Co-Authored-By: Claude <noreply@anthropic.com>
- Check if Claude Code process is actually running before returning loop
- Skip stopped loops completely
- Skip complete loops older than 6 minutes
- Add process_id to RalphLoop response
- This fixes GUI showing old/stale loop data

Co-Authored-By: Claude <noreply@anthropic.com>
- Add log buffer to ConsoleLoggerService (stores last 100 entries)
- Add console_logs to NodeStatus type
- Include recent 20 logs in /api/status response
- Export ConsoleLogEntry type for backend use

This allows the backend to fetch and display node-agent console logs.

Co-Authored-By: Claude <noreply@anthropic.com>
- Override console.log and console.error to capture output to buffer
- Store last 100 log entries for /api/status response
- Restore original console functions on stop

This ensures all console output is captured without needing to update
every console.log call in the codebase.

Co-Authored-By: Claude <noreply@anthropic.com>
- Remove box-drawing ASCII art and fancy formatting
- Output simple [NodeAgent] prefixed log lines
- Focus on the information, not presentation

Before: Massive ASCII blocks with borders
After:  Clean single-line logs

Co-Authored-By: Claude <noreply@anthropic.com>
- Add cpuPercent and memoryPercent to ClaudeCodeProcess type
- Add active_claude_processes to NodeStatus response
- Add claude_cpu_total and claude_process_count to Capacity
- Add getActiveClaudeProcesses() function to fetch processes via ps aux
- Map PIDs to loop IDs using ~/.node-agent/pids/ files
- Update /api/status endpoint to include active Claude processes

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Node agent:
- Add console logger service
- Add daemon layer agent with PM integration
- Add git, ralph, and setup services
- Add TypeScript type definitions

V2 tools:
- Add environment detection and packages tools
- Add health check utilities
- Add base tool interface and implementations
- Add tools for: bun, claude, doppler, gh, lane, node-agent, node, ralph, registry, tmux
Add @codespaces/rolling-keys integration for API key rotation:
- Add KeyManager class with round-robin key rotation
- Integrate with daemon-layer-agent for GLM API calls
- Integrate with ralph service for Anthropic API calls
- Add health tracking with exponential backoff on errors
- Support multiple keys from ANTHROPIC_API_KEYS Doppler config

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Removed stale duplicate of seed repo from inside itself
- Preserved all current changes in parent seed directory
…m package

- Update package.json to use published @ebowwa/rolling-keys@^1.0.0
- Update all TypeScript imports from @codespaces/rolling-keys to @ebowwa/rolling-keys
- Update build script to use --target bun for Node.js built-ins
- Update integration comments in daemon-layer-agent to reference @ebowwa/tooling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Published version is 0.1.0, not 1.0.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The @ebowwa/rolling-keys package uses catalog: for zod which doesn't
resolve in bun/npm. Adding zod directly as a workaround.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The new version has proper dist/ entry points and concrete zod dependency,
resolving the "catalog: failed to resolve" error in bun.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant