Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
8206bf2
Refactor setup.sh to remove user-specific references
ryaneggz Mar 6, 2026
890e967
init
ryaneggz Mar 26, 2026
1a99d4e
Replace OpenClaw with Claude Code, rename ubuntu/ to sandbox/
ryaneggz Mar 26, 2026
7dfd323
Move Dockerfile to root, sandbox/ contains only copied-in files
ryaneggz Mar 26, 2026
4194187
Add run, shell, stop, and clean targets to Makefile
ryaneggz Mar 26, 2026
f7d65de
Add sandbox user, install user-level tools under sandbox account
ryaneggz Mar 26, 2026
ebe7472
Mount sandbox/ as shared volume at /home/sandbox, add rebuild target
ryaneggz Mar 26, 2026
f0c619b
Add .bashrc with claude --dangerously-skip-permissions alias
ryaneggz Mar 26, 2026
1e1287c
Restructure to install/ and workspace/, system-wide installs, update …
ryaneggz Mar 26, 2026
32fec00
Add standalone install instructions with curl/wget from branch
ryaneggz Mar 26, 2026
a1221b5
Update tag schema to claude-v* format
ryaneggz Mar 26, 2026
25652ba
Commit plans
ryaneggz Mar 26, 2026
e6f87de
Add usage examples to README
ryaneggz Mar 26, 2026
8954976
Add multi-agent support, Docker, tmux, named sandboxes, and AgentMail
ryaneggz Mar 27, 2026
f32f107
Rebrand tagging and CI to open-harness
ryaneggz Mar 27, 2026
fdac360
Fix Docker socket permissions so sandbox user needs no sudo
ryaneggz Mar 27, 2026
23cc385
Make Docker opt-in, require NAME, add error handling
ryaneggz Mar 27, 2026
2c9c95b
Add agent builder configs, symlink .codex to .claude
ryaneggz Mar 27, 2026
ca6a4a9
Add heartbeat, soul, and memory system (OpenClaw-style)
ryaneggz Mar 27, 2026
4209b14
Add pi example banner extension
ryaneggz Mar 27, 2026
a62b332
docs: restyle README with project intentions, benefits, and emoji sec…
ryaneggz Mar 27, 2026
f44c668
feat: add quickstart — three commands from clone to coding with AI
ryaneggz Mar 27, 2026
4ffa230
chore: add MIT license and LinkedIn launch post
ryaneggz Mar 27, 2026
6a4010c
fix: update license year to 2026
ryaneggz Mar 27, 2026
3c30f58
docs: rework LinkedIn post opener
ryaneggz Mar 27, 2026
cbd5188
docs: detail unique architecture in LinkedIn post
ryaneggz Mar 27, 2026
8946cd4
docs: shift LinkedIn post focus to shared multi-agent workspace
ryaneggz Mar 27, 2026
fc015d2
docs: add X launch post
ryaneggz Mar 27, 2026
d18bbe8
docs: trim X post to 268 chars
ryaneggz Mar 27, 2026
abebab7
chore: update heartbeat interval to 900s for dev testing
ryaneggz Mar 27, 2026
5e0f7bc
feat: restructure project layout and add GitHub issue templates
ryaneggz Mar 29, 2026
82d24da
feat: add root CLAUDE.md/AGENTS.md and rename worktrees to .worktrees
ryaneggz Mar 29, 2026
5112201
fix: restore issue templates with .worktrees paths
ryaneggz Mar 29, 2026
dc660e7
feat: mirror branch paths in worktree folders and add /provision skill
ryaneggz Mar 30, 2026
5994190
Commit plans
ryaneggz Mar 30, 2026
c684add
Merge pull request #8 from ryaneggz/feat/root-orchestrator-docs
ryaneggz Mar 30, 2026
cc6763f
Delete .worktrees fodler from repo
ryaneggz Mar 30, 2026
26b02d0
feat: add example agents section to README with 3 starter agents
ryaneggz Mar 30, 2026
4c723dd
fix: simplify example agents to single-prompt setup flow
ryaneggz Mar 30, 2026
0ea6494
fix: require plan mode for agent setup so orchestrator asks questions…
ryaneggz Mar 30, 2026
da1328d
Small tweak
ryaneggz Mar 30, 2026
ab02963
feat: make portfolio-mgr agent the quickstart hero example
ryaneggz Mar 30, 2026
7ceaba0
fix: make portfolio-mgr prompt a copyable code block
ryaneggz Mar 30, 2026
00cdf57
Store plans
ryaneggz Mar 30, 2026
704fcac
feat: add scaffolding phase to provisioning, fix Dockerfile permissio…
ryaneggz Mar 30, 2026
da4f726
Commit unstaged plans
ryaneggz Apr 1, 2026
e46f65e
feat: add plan for openharness CLI built on Pi SDK (#17)
ryaneggz Apr 2, 2026
8c9b36a
feat: implement openharness CLI built on Pi Agent SDK (#17)
ryaneggz Apr 2, 2026
fea5b6f
feat: custom --help with openharness branding and sandbox commands se…
ryaneggz Apr 2, 2026
3ffa86d
feat: add CLI subcommands, remove Makefile (#17)
ryaneggz Apr 2, 2026
c9989fd
feat: rebrand banner to Open Harness
ryaneggz Apr 2, 2026
0b7cf6a
feat: rename .pi/ to .openharness/ across workspace
ryaneggz Apr 2, 2026
af96544
feat: split openharness into core agent + @openharness/sandbox package
ryaneggz Apr 2, 2026
fd50c3d
feat: update plan for core agent + sandbox package split
ryaneggz Apr 2, 2026
c0fa883
commit plans
ryaneggz Apr 2, 2026
75de49c
Adds orchestrator dev container
ryaneggz Apr 4, 2026
5942db1
Fix pipeline
ryaneggz Apr 4, 2026
aa0b448
Merge pull request #18 from ryaneggz/feat/cli
ryaneggz Apr 4, 2026
09404e6
feat: add Claude Code and Codex CLI to devcontainer
ryaneggz Apr 4, 2026
54e8298
feat: fix devcontainer auth, restructure .openharness config to proje…
ryaneggz Apr 4, 2026
0213675
feat: scaffold next-postgres-shadcn full stack developer harness
ryaneggz Apr 4, 2026
4d10b4a
fix: replace make commands with openharness CLI throughout
ryaneggz Apr 4, 2026
8bbc4fe
fix: move .ralph to workspace root
ryaneggz Apr 4, 2026
8f2f715
feat: add Ralph CLI workflow and Slack hooks
ryaneggz Apr 5, 2026
d50319e
fix: remove .env.claude from git tracking
ryaneggz Apr 5, 2026
3299035
task: update workspace config, lock files, and agent templates
ryaneggz Apr 5, 2026
26c9d89
task: expand README with devcontainer docs and full project reference
ryaneggz Apr 5, 2026
b2d4aec
fix: dev server binding, turbopack compat, font rendering, cloudflare…
ryaneggz Apr 7, 2026
f7a3315
fix: allow cloudflared tunnel origin in next dev
ryaneggz Apr 7, 2026
c661fb9
task: re-scaffold CLAUDE.md and AGENTS.md for current harness
ryaneggz Apr 7, 2026
a706956
task: update README with npm run setup, optional devcontainer, tunnel…
ryaneggz Apr 7, 2026
5950247
task: replace orchestrator CLAUDE.md with agent workspace identity
ryaneggz Apr 7, 2026
4709230
fix: prettier formatting for CI
ryaneggz Apr 7, 2026
0f391cc
fix: add next-pwa type declaration for strict tsc
ryaneggz Apr 7, 2026
f64b4f9
fix: CI branch filter, Prisma 7 schema compat, Node 22 enforcement
ryaneggz Apr 7, 2026
b73c435
fix: name CI for agent branch, pass with no tests
ryaneggz Apr 7, 2026
125c252
skill: add /ci-status to monitor pipeline after push
ryaneggz Apr 7, 2026
35ded89
task: document all 6 skills in AGENTS.md and workspace AGENTS.md
ryaneggz Apr 7, 2026
7e7b672
feat: add .claude/rules/ for path-scoped coding standards
ryaneggz Apr 7, 2026
6ae9c29
feat: landing page for OpenHarness Next + Postgres + shadcn
ryaneggz Apr 7, 2026
efb1eee
fix: quickstart clones agent/next-postgres-shadcn branch directly
ryaneggz Apr 7, 2026
ef4a85b
feat: full provisioning flow in quickstart, syntax highlighting, dark…
ryaneggz Apr 7, 2026
fa83625
fix: improve syntax highlighting contrast in dark mode
ryaneggz Apr 7, 2026
3ce742b
fix: prettier formatting on layout.tsx
ryaneggz Apr 7, 2026
25432ec
feat: agent-driven quickstart flow on landing page
ryaneggz Apr 7, 2026
73a2aee
feat: plan mode quickstart with SSH key gen and example query
ryaneggz Apr 7, 2026
285f875
feat: separate quickstart into terminal, prompt, and steps blocks
ryaneggz Apr 7, 2026
0d1424d
feat: inline prompt in claude -p, quickstart front and center
ryaneggz Apr 7, 2026
8135b71
fix: green comments, simplified prompt, backslash clone formatting
ryaneggz Apr 7, 2026
6e85276
feat: side-by-side hero + quickstart on desktop
ryaneggz Apr 7, 2026
14790da
feat: marquee tech stack with icons, GitHub links to branch
ryaneggz Apr 7, 2026
d340321
task: update README title, stack versions, live demo link
ryaneggz Apr 7, 2026
8c4841a
feat: polished marquee tech stack with gradient fades
ryaneggz Apr 7, 2026
0a09356
feat: single-row marquee tech stack with gradient fades
ryaneggz Apr 7, 2026
eca2806
feat: emoji tech cards matching ruska.ai style, slower marquee
ryaneggz Apr 7, 2026
4b0df98
feat: add FAQ section, agent-browser skill, reframe landing copy arou…
ryaneggz Apr 7, 2026
dd1af28
fix: correct base branch from main to development in README
ryaneggz Apr 7, 2026
fd677bd
fix: set base branch to agent/next-postgres-shadcn in README
ryaneggz Apr 7, 2026
695d621
fix: align quickstart across landing page, root README, and next-app …
ryaneggz Apr 7, 2026
c5fc228
fix: only run CI when next-app source files change
ryaneggz Apr 7, 2026
67fe490
fix: prettier formatting on faq, hero, and accordion
ryaneggz Apr 7, 2026
d95ba1c
feat: add release workflow, calver versioning, update all URLs to new…
ryaneggz Apr 7, 2026
9376a43
fix: add development branch to CI trigger
ryaneggz Apr 7, 2026
07ef453
feat: add emoji prefixes to README sections matching open-harness style
ryaneggz Apr 7, 2026
34f7ada
skill: add issue-triage skill with parallel sub-agents and AI council
ryaneggz Apr 7, 2026
5c74331
Merge pull request #1 from ryaneggz/agent/next-postgres-shadcn
ryaneggz Apr 7, 2026
3340041
task: refactor workspace to OpenClaw 7-file structure
ryaneggz Apr 7, 2026
7aafdea
Addds icons, layout, etc
ryaneggz Apr 7, 2026
376c6d3
task: add skills, infra updates, landing page refinements
ryaneggz Apr 8, 2026
daf4b27
fix: align landing page quick-start with README setup steps
ryaneggz Apr 8, 2026
d4c4260
Revert "fix: align landing page quick-start with README setup steps"
ryaneggz Apr 8, 2026
d20b659
fix: align READMEs with landing page quick-start steps
ryaneggz Apr 8, 2026
a628e50
feat: add /provision, /diagnose, /release, /destroy skills and harden…
ryaneggz Apr 8, 2026
e5294dd
feat: add nightly release heartbeat at 23:50
ryaneggz Apr 8, 2026
48618cf
task: add Slack notify hook, replace settings.json with settings.loca…
ryaneggz Apr 8, 2026
34d6499
feat: add 5-expert strategic council, /roadmap page, implementer hear…
ryaneggz Apr 9, 2026
9773ddd
task: align README with roadmap, fix doc gaps across IDENTITY, HEARTB…
ryaneggz Apr 9, 2026
3092602
feat: US-001 - Create /api/health route handler with basic response
Apr 9, 2026
6c92160
feat: US-002 - Add PostgreSQL health check via Prisma
Apr 9, 2026
a49410d
feat: US-003 - Add unit tests for the health endpoint
Apr 9, 2026
d8b00bd
task: archive Ralph run for feat/4-api-health
Apr 9, 2026
964a49a
fix: format health route with prettier
Apr 9, 2026
199fd4b
fix: resolve 6 Ralph process gaps, seed roadmap, clean nested .git
ryaneggz Apr 9, 2026
d6f64ec
fix: align last 2 archive path references (archive → archives)
ryaneggz Apr 9, 2026
ec41807
fix: sync package-lock.json and reorder CI steps
ryaneggz Apr 9, 2026
6431cbd
fix: format 4 files failing Prettier check in CI
ryaneggz Apr 9, 2026
812fd44
fix: resolve merge conflicts with development (package-lock.json)
ryaneggz Apr 9, 2026
bb985ce
task: add /diagnose to pre-commit hook and session rules
ryaneggz Apr 9, 2026
af78744
Merge pull request #7 from ryaneggz/feat/4-api-health
ryaneggz Apr 9, 2026
75df3ef
fix: add jq to Dockerfile, archive Ralph run, sync ralph.sh
ryaneggz Apr 9, 2026
349fa47
feat: US-001 - Create OG image and add Open Graph + Twitter Card meta…
Apr 9, 2026
42ca466
feat: US-002 - Add page-specific OG metadata to /roadmap page
Apr 9, 2026
21fdede
feat: US-003 - Add tests for OG metadata configuration
Apr 9, 2026
a7d48e6
Remove false files
ryaneggz Apr 9, 2026
c4af30b
Merge branch 'agent/next-postgres-shadcn' of github.com:ryaneggz/next…
ryaneggz Apr 9, 2026
c81610e
Merge branch 'development' of github.com:ryaneggz/next-postgres-shadc…
ryaneggz Apr 9, 2026
7fcad63
simpler arch around devcontainer
ryaneggz Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions .claude/hooks/notify_slack.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
#!/usr/bin/env bash

set -euo pipefail

# Get script directory for fallback env path
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# Prefer global env file, fall back to repo-local .claude/.env.claude
PREFERRED_ENV_PATH="$HOME/.env/.claude/.env.claude"
FALLBACK_ENV_PATH="$(dirname "$SCRIPT_DIR")/.env.claude"

if [[ -f "$PREFERRED_ENV_PATH" ]]; then
DOTENV_PATH="$PREFERRED_ENV_PATH"
else
DOTENV_PATH="$FALLBACK_ENV_PATH"
fi

# Load env file if it exists
if [[ -f "$DOTENV_PATH" ]]; then
# Export variables from env file (handles quoted values and comments)
set -a
# shellcheck disable=SC1090
source "$DOTENV_PATH"
set +a
echo "Loaded env from: $DOTENV_PATH" >&2
else
echo "No env file found at $PREFERRED_ENV_PATH or $FALLBACK_ENV_PATH" >&2
fi

# Check for SLACK_WEBHOOK_URL
if [[ -z "${SLACK_WEBHOOK_URL:-}" ]]; then
echo "SLACK_WEBHOOK_URL is not set" >&2
exit 1
fi

# Read input JSON from stdin
INPUT_JSON=$(cat)

if [[ -z "$INPUT_JSON" ]]; then
echo "Failed to read input from stdin" >&2
exit 1
fi

# Parse JSON fields using jq
EVENT=$(echo "$INPUT_JSON" | jq -r '.hook_event_name // ""')
CWD=$(echo "$INPUT_JSON" | jq -r '.cwd // ""')
SESSION_ID=$(echo "$INPUT_JSON" | jq -r '.session_id // ""')

# Get current timestamp
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# Function to extract final response from transcript JSONL file
get_final_response() {
local transcript_path="$1"
local max_length="${2:-1500}"

# Expand ~ in path
transcript_path="${transcript_path/#\~/$HOME}"

if [[ -z "$transcript_path" || ! -f "$transcript_path" ]]; then
echo "(transcript not found)"
return
fi

# Extract final assistant response from JSONL
# Look for entries with type=assistant and extract text content
local final_response=""
final_response=$(jq -rs '
[.[] | select(.type == "assistant" and .message.role == "assistant" and .message.content)]
| last
| .message.content
| if type == "array" then
[.[] | if type == "object" and .type == "text" then .text elif type == "string" then . else empty end]
| join("\n")
elif type == "string" then
.
else
""
end
// ""
' "$transcript_path" 2>/dev/null || echo "")

if [[ -z "$final_response" ]]; then
echo "(no response found)"
return
fi

# Truncate if too long
if [[ ${#final_response} -gt $max_length ]]; then
echo "${final_response:0:$max_length}...
_(truncated)_"
else
echo "$final_response"
fi
}

# Build Slack message based on event type
TEXT=""
case "$EVENT" in
"Notification")
NOTIFICATION_TYPE=$(echo "$INPUT_JSON" | jq -r '.notification_type // ""')
MESSAGE=$(echo "$INPUT_JSON" | jq -r '.message // ""')
TEXT="🧠 Claude Code: *${NOTIFICATION_TYPE}*
${MESSAGE}
• time: \`${TIMESTAMP}\`
• cwd: \`${CWD}\`
• session: \`${SESSION_ID}\`"
;;
"Stop")
STOP_HOOK_ACTIVE=$(echo "$INPUT_JSON" | jq -r '.stop_hook_active // false')
TRANSCRIPT_PATH=$(echo "$INPUT_JSON" | jq -r '.transcript_path // ""')
FINAL_RESPONSE=$(get_final_response "$TRANSCRIPT_PATH")
TEXT="✅ Claude Code: *Stop*
• time: \`${TIMESTAMP}\`
• cwd: \`${CWD}\`
• session: \`${SESSION_ID}\`
• stop_hook_active: \`${STOP_HOOK_ACTIVE}\`

*Final Response:*
\`\`\`
${FINAL_RESPONSE}
\`\`\`"
;;
*)
TEXT="Claude Code hook: ${EVENT}
• time: \`${TIMESTAMP}\`
• cwd: ${CWD}
• session: ${SESSION_ID}"
;;
esac

# Build Slack payload
SLACK_PAYLOAD=$(jq -n --arg text "$TEXT" '{"text": $text}')

# Send to Slack
HTTP_RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST "$SLACK_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "$SLACK_PAYLOAD" \
--max-time 10 \
2>&1) || {
echo "Failed to send Slack notification: curl error" >&2
exit 1
}

# Extract HTTP status code (last line)
HTTP_CODE=$(echo "$HTTP_RESPONSE" | tail -n1)

# Check for success (2xx status codes)
if [[ ! "$HTTP_CODE" =~ ^2[0-9][0-9]$ ]]; then
RESPONSE_BODY=$(echo "$HTTP_RESPONSE" | sed '$d')
echo "Failed to send Slack notification: HTTP $HTTP_CODE - $RESPONSE_BODY" >&2
exit 1
fi
63 changes: 63 additions & 0 deletions .claude/plans/agile-waddling-pixel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Plan: Root-Level CLAUDE.md and AGENTS.md

## Context

The project has a `workspace/` folder that serves as the template for all agent sandboxes, but the project root has no CLAUDE.md or AGENTS.md. The root-level Claude Code instance currently has no instructions defining its role. We need root-level files that clearly scope the orchestrator's purpose: managing sandboxed agents via `.worktrees/`, not writing application code.

Additionally, the Makefile and `.gitignore` still reference `worktrees/` (no dot) while the actual directory on disk is `.worktrees/`. This needs to be reconciled.

## Changes

### 1. Create `/home/ryaneggz/ruska-ai/sandboxes/AGENTS.md` (new file)

The canonical root instruction file. Content defines:

- **Identity**: You are the harness orchestrator, not a coding agent
- **Permissions**: Git-only operations (per `.claude/settings.local.json`)
- **Lifecycle** with three phases:
- **Setup**: Create GitHub issue → `make NAME=X quickstart` → `make NAME=X shell` → start agent
- **Validate**: `make list` to check running sandboxes, `make NAME=X shell` to verify workspace files exist (`AGENTS.md`, `SOUL.md`, `MEMORY.md`), `make NAME=X heartbeat-status` for heartbeat health
- **Teardown**: Commit/push any unmerged work → `make NAME=X stop` → `make NAME=X clean`
- **Git workflow**: Branch conventions (`agent/<name>` from `development`), commit format, PR targets
- **Project structure**: Brief map pointing to key directories
- **Boundary**: All coding/building/testing happens inside sandboxes, never at root

### 2. Create `/home/ryaneggz/ruska-ai/sandboxes/CLAUDE.md` as symlink → `AGENTS.md`

Matches the `workspace/` convention where `CLAUDE.md` symlinks to `AGENTS.md`.

```bash
cd /home/ryaneggz/ruska-ai/sandboxes && ln -s AGENTS.md CLAUDE.md
```

### 3. Update Makefile: `worktrees/` → `.worktrees/`

Line 16: Change `WORKTREE = worktrees/$(NAME)` → `WORKTREE = .worktrees/$(NAME)`

### 4. Update `.gitignore`: `worktrees/` → `.worktrees/`

```
worktrees/* → .worktrees/*
!worktrees/.gitkeep → !.worktrees/.gitkeep
```

### 5. Track `.worktrees/.gitkeep`

Ensure `.worktrees/.gitkeep` exists and is tracked (replacing the deleted `worktrees/.gitkeep`).

## Files to Modify

| File | Action |
|------|--------|
| `AGENTS.md` | Create (new) |
| `CLAUDE.md` | Create symlink → `AGENTS.md` |
| `Makefile` | Edit line 16: `worktrees/` → `.worktrees/` |
| `.gitignore` | Edit: `worktrees/` → `.worktrees/` |
| `.worktrees/.gitkeep` | Ensure exists and tracked |

## Verification

1. `cat CLAUDE.md` resolves through symlink and shows AGENTS.md content
2. `make list` still works (references `.worktrees/` correctly)
3. `git status` shows the new files staged cleanly
4. `.worktrees/` contents are still gitignored (except `.gitkeep`)
Loading
Loading