Skip to content

Commit b73ae81

Browse files
authored
feat: render v2 — reset default, additive re-render, consolidated skills (#25)
* feat: render v2 — reset default, additive re-render, consolidated skills * feat: hero GIFs with real Claude session, split into init and status * docs: rebuild all command GIFs * update readme * docs: style flow keyword with teal color in README * docs: use cyan monospace for flow keyword in README
1 parent 4d8c63f commit b73ae81

37 files changed

Lines changed: 885 additions & 643 deletions

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ snapshot:
2727
demo: build
2828
bash demo-setup.sh
2929
vhs demo.tape
30+
vhs demo-status.tape
3031

3132
gendocs:
3233
go run ./cmd/gendocs

README.md

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
CLI for managing multi-repo development workspaces using git worktrees.
66

7-
Working across multiple repos means repetitive setup, scattered branches, and cleanup debt. Flow uses a YAML state file to define which repos and branches belong together, then materializes the workspace with bare clone caching and git worktrees.
8-
9-
![flow demo](demo.gif)
7+
Working across multiple repos means repetitive setup, scattered branches, and cleanup debt. ${\color{cyan}\texttt{flow}}$ uses a YAML state file to define which repos and branches belong together, then materializes the workspace with bare clone caching and git worktrees.
108

119
## Features
1210

@@ -16,13 +14,25 @@ Working across multiple repos means repetitive setup, scattered branches, and cl
1614

1715
🤖 **AI agent integration** — Generate shared context files and agent instructions across repos so your AI tools have the right skills and knowledge from the start.
1816

19-
## Why flow?
17+
## Why ${\color{cyan}\texttt{flow}}$?
2018

2119
AI agents work best when they have deterministic tools instead of freeform instructions. Asking an agent to "set up a multi-repo workspace" produces inconsistent results — but giving it a CLI that manages YAML state files, bare clone caches, and git worktrees produces the same result every time.
2220

23-
Flow is that deterministic layer. It gives agents (and humans) a small set of reliable commands for workspace lifecycle: create, define repos in YAML, render worktrees, check status. Agents call these tools through embedded skills rather than interpreting setup instructions on their own.
21+
${\color{cyan}\texttt{flow}}$ is that deterministic layer. It gives agents (and humans) a small set of reliable commands for workspace lifecycle: create, define repos in YAML, render worktrees, check status. Agents call these tools through embedded skills rather than interpreting setup instructions on their own.
22+
23+
Beyond workspace creation, ${\color{cyan}\texttt{flow}}$ centralizes agent skills across all your workspaces and lets you check the status of many workstreams in parallel. It is not opinionated about which agent or editor you use — configure Claude, Cursor, or anything else in a single config file. Everything is customizable: status checks, agent skills, workspace structure.
24+
25+
### Describe the problem, ${\color{cyan}\texttt{flow}}$ does the rest
26+
27+
`flow init` creates a workspace pre-configured with agent instructions and skills, then launches you directly into your preferred agent — Claude, Cursor, or anything else you configure. The agent reads the embedded flow skill to understand how workspaces work, plus any custom skills you've added (like resolving repos by friendly names). Describe what you're working on and the agent handles the rest: editing the state file, rendering worktrees, and getting everything ready to go.
28+
29+
![flow init](demo.gif)
30+
31+
### Track all your workstreams in one place
2432

25-
Beyond workspace creation, flow centralizes agent skills across all your workspaces and lets you check the status of many workstreams in parallel. It is not opinionated about which agent or editor you use — configure Claude, Cursor, or anything else in a single config file. Everything is customizable: status checks, agent skills, workspace structure.
33+
`flow status` gives you a live view across all active workspaces. Statuses are fully customizable — they're just one-line shell commands in a config file, not hardcoded logic. Have your AI generate complex status checks (query GitHub PRs, check CI, inspect git state) and hide them behind simple labels. Nothing in ${\color{cyan}\texttt{flow}}$ is opinionated; anything that could be is configurable.
34+
35+
![flow status](demo-status.gif)
2636

2737
## Getting started
2838

@@ -51,30 +61,19 @@ make install
5161

5262
### Create a workspace and start working
5363

54-
Flow creates a workspace and launches your configured agent. Describe what you're working on and the agent handles the rest.
64+
${\color{cyan}\texttt{flow}}$ creates a workspace and launches your configured agent. Describe what you're working on and the agent handles the rest.
5565

5666
```bash
57-
flow init my-project
67+
flow init
5868
```
5969

6070
The agent reads its embedded skills to edit `state.yaml`, run `flow render`, and begin working in the repos.
6171

62-
### Manual workflow
63-
64-
Use `--no-exec` to skip the agent launch and set things up yourself:
65-
66-
```bash
67-
flow init my-project --no-exec
68-
flow edit state my-project # add repos and branches
69-
flow render my-project # clone repos, create worktrees
70-
flow exec my-project # launch agent manually
71-
```
72-
7372
See the [spec reference](docs/specs/) for YAML file schemas and the [command reference](docs/commands/) for all commands.
7473

7574
## How it works
7675

77-
Flow stores everything under `~/.flow` (override with `$FLOW_HOME`):
76+
${\color{cyan}\texttt{flow}}$ stores everything under `~/.flow` (override with `$FLOW_HOME`):
7877

7978
```
8079
~/.flow/
@@ -84,8 +83,7 @@ Flow stores everything under `~/.flow` (override with `$FLOW_HOME`):
8483
│ └── claude/
8584
│ ├── CLAUDE.md # Shared agent instructions
8685
│ └── skills/
87-
│ ├── flow-cli/SKILL.md # Built-in: workspace management
88-
│ ├── workspace-structure/SKILL.md # Built-in: directory layout
86+
│ ├── flow/SKILL.md # Built-in: workspace management
8987
│ └── find-repo/SKILL.md # Your own custom skill
9088
├── workspaces/
9189
│ └── calm-delta/ # Workspace ID
@@ -94,7 +92,7 @@ Flow stores everything under `~/.flow` (override with `$FLOW_HOME`):
9492
│ ├── CLAUDE.md # Generated workspace context
9593
│ ├── .claude/
9694
│ │ ├── CLAUDE.md → agents/claude/CLAUDE.md
97-
│ │ └── skills → agents/claude/skills/
95+
│ │ └── skills/ # Consolidated from shared + repo skills
9896
│ ├── vpc-service/ # Worktree
9997
│ └── subnet-manager/ # Worktree
10098
└── repos/
@@ -105,13 +103,13 @@ Flow stores everything under `~/.flow` (override with `$FLOW_HOME`):
105103

106104
Bare clones are shared across workspaces. Worktrees are cheap — they share the object store with the bare clone, so multiple workspaces pointing at the same repo don't duplicate data.
107105

108-
Flow ships two built-in skills (`flow-cli` and `workspace-structure`) and preserves any custom skills you add to the same directory. Run `flow reset skills` to update the built-in skills without touching your own.
106+
${\color{cyan}\texttt{flow}}$ ships a built-in `flow` skill and consolidates skills from all repos into each workspace's `.claude/skills/` directory on render. Add your own skills to the shared directory or to individual repos. Run `flow reset skills` to update the built-in skill without touching your own.
109107

110108
See the [spec reference](docs/specs/) for YAML file schemas and the [command reference](docs/commands/) for usage, flags, and GIF demos.
111109

112110
## Customization
113111

114-
Flow stores everything under `~/.flow` (override with `$FLOW_HOME`). Edit these files to customize your setup:
112+
${\color{cyan}\texttt{flow}}$ stores everything under `~/.flow` (override with `$FLOW_HOME`). Edit these files to customize your setup:
115113

116114
| Command | What it configures |
117115
|---------|-------------------|

demo-setup.sh

Lines changed: 50 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,41 @@ FLOW="$(pwd)/flow"
88
rm -rf /tmp/flow-demo /tmp/demo
99
mkdir -p /tmp/demo "$FLOW_HOME/workspaces" "$FLOW_HOME/repos"
1010

11-
# --- Create a fake claude binary that simulates an interactive agent session ---
11+
# --- Configure flow agent ---
12+
# A launcher script writes .claude/settings.json to pre-approve tools before
13+
# launching claude. This avoids permission dialogs during the demo.
1214

13-
mkdir -p /tmp/flow-demo/bin
14-
cat > /tmp/flow-demo/bin/claude <<'SCRIPT'
15+
cat > /tmp/flow-demo/launch-claude.sh <<'LAUNCHER'
1516
#!/bin/bash
16-
DIM='\033[2m'
17-
CYAN='\033[36m'
18-
GREEN='\033[32m'
19-
BOLD='\033[1m'
20-
RESET='\033[0m'
21-
22-
echo ""
23-
echo -e " ${DIM}[mocked agent session]${RESET}"
24-
echo ""
25-
echo -e " ${DIM}Flow includes skills that teach your agent to manage workspaces.${RESET}"
26-
echo -e " ${DIM}Add your own skills for repo discovery, PR lookup, or any custom workflow.${RESET}"
27-
echo -e " ${DIM}Paste a Slack thread, dictate a bug report — the agent handles the rest.${RESET}"
28-
echo ""
29-
echo -e " ${BOLD}Enter your prompt:${RESET}"
30-
echo ""
31-
printf " > "
32-
read -r task
33-
34-
echo ""
35-
sleep 0.5
36-
echo -e " ${CYAN}● Reading skill: flow-cli${RESET}"
37-
sleep 0.6
38-
echo -e " ${CYAN}● Reading skill: find-repo${RESET}"
39-
echo -e " ${DIM}→ github.com/acme/web${RESET}"
40-
sleep 0.6
41-
echo -e " ${CYAN}● Editing state.yaml${RESET}"
42-
echo -e " ${DIM}name: fix-dashboard-charts${RESET}"
43-
echo -e " ${DIM}repo: github.com/acme/web @ fix/dashboard-charts${RESET}"
44-
sleep 0.6
45-
echo -e " ${CYAN}● Running flow render...${RESET}"
46-
sleep 0.8
47-
echo ""
48-
echo -e " ${GREEN}✓ Workspace ready${RESET}"
49-
echo ""
50-
echo -e " ${CYAN}● Analyzing web/src/components/Charts.tsx...${RESET}"
51-
sleep 0.8
52-
echo ""
53-
printf " > "
54-
read -r cmd
55-
echo ""
56-
SCRIPT
57-
chmod +x /tmp/flow-demo/bin/claude
17+
echo '{"permissions":{"allow":["Bash","Edit","Write","Read","Glob","Grep","Skill"]}}' > .claude/settings.json
18+
exec claude --model haiku
19+
LAUNCHER
20+
chmod +x /tmp/flow-demo/launch-claude.sh
21+
22+
cat > "$FLOW_HOME/config.yaml" <<YAML
23+
apiVersion: flow/v1
24+
kind: Config
25+
spec:
26+
agents:
27+
- name: claude
28+
exec: /tmp/flow-demo/launch-claude.sh
29+
default: true
30+
YAML
31+
32+
# --- Pre-trust the demo directory so Claude skips the workspace trust dialog ---
33+
34+
CLAUDE_JSON="$HOME/.claude.json"
35+
if [ -f "$CLAUDE_JSON" ]; then
36+
python3 -c "
37+
import json, sys
38+
with open('$CLAUDE_JSON') as f:
39+
config = json.load(f)
40+
config.setdefault('projects', {})
41+
config['projects']['/tmp/flow-demo'] = {'hasTrustDialogAccepted': True}
42+
with open('$CLAUDE_JSON', 'w') as f:
43+
json.dump(config, f, indent=2)
44+
"
45+
fi
5846

5947
# --- Create local git repos with feature branches ---
6048

@@ -67,29 +55,36 @@ create_repo() {
6755
echo "package main" > "$dir/main.go"
6856
git -C "$dir" add .
6957
git -C "$dir" commit -q -m "initial commit"
70-
git -C "$dir" checkout -q -b "$branch"
58+
git -C "$dir" checkout -q -b "$branch" 2>/dev/null || true
7159
echo "// $msg" >> "$dir/$file"
7260
git -C "$dir" add .
7361
git -C "$dir" commit -q -m "$msg"
7462
}
7563

76-
create_repo "app" "feature/ipv6" "main.go" "add ipv6 support"
77-
create_repo "api" "feat/auth" "main.go" "add auth endpoints"
78-
create_repo "docs" "update/guides" "README.md" "update setup guide"
79-
create_repo "web" "feat/dashboard" "main.go" "add dashboard page"
80-
create_repo "billing" "feat/billing-v2" "main.go" "billing v2 migration"
81-
create_repo "gateway" "feat/rate-limits" "main.go" "add rate limiting"
82-
create_repo "config" "feat/env-vars" "main.go" "add env var support"
64+
create_repo "app" "feature/ipv6" "main.go" "add ipv6 support"
65+
create_repo "api" "feat/auth" "main.go" "add auth endpoints"
66+
create_repo "docs" "update/guides" "README.md" "update setup guide"
67+
create_repo "web" "feat/dashboard" "main.go" "add dashboard page"
68+
create_repo "billing" "feat/billing-v2" "main.go" "billing v2 migration"
69+
create_repo "gateway" "feat/rate-limits" "main.go" "add rate limiting"
70+
create_repo "config" "feat/env-vars" "main.go" "add env var support"
71+
create_repo "apps" "main" "main.go" "initial app setup"
72+
create_repo "infrastructure" "main" "main.go" "initial infra setup"
8373

8474
# --- Pre-populate bare clone cache for realistic URLs ---
8575

86-
for name in app api docs web billing gateway config; do
76+
for name in app api docs web billing gateway config apps infrastructure; do
8777
bare="$FLOW_HOME/repos/github.com/acme/${name}.git"
8878
mkdir -p "$(dirname "$bare")"
8979
git clone --bare "/tmp/demo/$name" "$bare" -q
9080
# Add fetch refspec so worktrees can resolve origin/* refs
9181
git -C "$bare" config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
9282
git -C "$bare" fetch -q origin
83+
84+
# Also create under SSH URL path (in case Claude uses git@ format)
85+
ssh_bare="$FLOW_HOME/repos/git@github.com:acme/${name}.git"
86+
mkdir -p "$(dirname "$ssh_bare")"
87+
cp -a "$bare" "$ssh_bare"
9388
done
9489

9590
# --- Create and render pre-existing workspaces ---
@@ -184,7 +179,7 @@ YAML
184179
)"
185180

186181
# Render all workspaces
187-
# Use --reset=false to skip interactive prompt when branches already exist
182+
# Use --reset=false to use existing branches as-is instead of creating fresh from base
188183
$FLOW render bold-creek --reset=false
189184
$FLOW render swift-pine --reset=false
190185
$FLOW render calm-ridge --reset=false

demo-status.gif

85.5 KB
Loading

demo-status.tape

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Regenerate: make demo
2+
Output demo-status.gif
3+
4+
Set Shell "bash"
5+
Set FontFamily "Menlo"
6+
Set FontSize 16
7+
Set Width 1100
8+
Set Height 650
9+
Set Padding 20
10+
Set Theme "Catppuccin Mocha"
11+
Set TypingSpeed 30ms
12+
Set PlaybackSpeed 1
13+
Set LetterSpacing 0
14+
Set LineHeight 1.2
15+
16+
# --- Hidden env setup ---
17+
Hide
18+
19+
Type `export FLOW_HOME=/tmp/flow-demo/.flow`
20+
Enter
21+
Sleep 200ms
22+
23+
Type `export PATH="$(pwd):$PATH"`
24+
Enter
25+
Sleep 200ms
26+
27+
# Swap in local-only status spec (no gh needed for demo)
28+
Type `cp "$FLOW_HOME/status-local.yaml" "$FLOW_HOME/status.yaml"`
29+
Enter
30+
Sleep 200ms
31+
32+
Type@0ms `clear`
33+
Enter
34+
Sleep 500ms
35+
36+
Show
37+
38+
# === See all workstreams at a glance ===
39+
40+
Sleep 500ms
41+
42+
Type "flow status"
43+
Sleep 500ms
44+
Enter
45+
Sleep 5s
46+
47+
Type "flow status api-refactor"
48+
Sleep 500ms
49+
Enter
50+
Sleep 4s
51+
52+
Sleep 4s

demo.gif

186 KB
Loading

demo.tape

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Output demo.gif
44
Set Shell "bash"
55
Set FontFamily "Menlo"
66
Set FontSize 16
7-
Set Width 900
8-
Set Height 550
7+
Set Width 1100
8+
Set Height 650
99
Set Padding 20
1010
Set Theme "Catppuccin Mocha"
1111
Set TypingSpeed 30ms
@@ -20,63 +20,37 @@ Type `export FLOW_HOME=/tmp/flow-demo/.flow`
2020
Enter
2121
Sleep 200ms
2222

23-
Type `export PATH="/tmp/flow-demo/bin:$(pwd):$PATH"`
23+
Type `export PATH="$(pwd):$PATH"`
2424
Enter
2525
Sleep 200ms
2626

27-
# Swap in local-only status spec (no gh needed for demo)
28-
Type `cp "$FLOW_HOME/status-local.yaml" "$FLOW_HOME/status.yaml"`
29-
Enter
30-
Sleep 200ms
31-
32-
# Clear screen and print first section comment (hidden from recording)
33-
Type@0ms `clear && printf '\033[2;3m# create a workspace — agent launches automatically\033[0m\n'`
27+
Type@0ms `clear`
3428
Enter
3529
Sleep 500ms
3630

3731
Show
3832

39-
# === Create a workspace — agent launches automatically ===
40-
41-
Sleep 500ms
42-
43-
Type "flow init dashboard"
44-
Sleep 500ms
45-
Enter
46-
Sleep 3s
33+
# === flow init — launches Claude automatically ===
4734

48-
# The fake claude is now running and showing its prompt.
49-
# Type the task description into the agent.
50-
Type "dashboard charts broke after the auth migration, check the web frontend"
5135
Sleep 500ms
52-
Enter
53-
Sleep 5s
5436

55-
# Agent has finished setting up. Exit the session.
56-
Type "/exit"
37+
Type "flow init"
5738
Sleep 500ms
5839
Enter
59-
Sleep 2s
6040

61-
# === See all workstreams at a glance ===
41+
# Wait for Claude to launch and show the workspace trust dialog
42+
Sleep 3s
6243

63-
# Clear screen and print second section comment (hidden from recording)
44+
# Accept the workspace trust dialog
6445
Hide
65-
Type@0ms `clear && printf '\033[2;3m# see all workstreams at a glance\033[0m\n'`
6646
Enter
67-
Sleep 500ms
6847
Show
48+
Sleep 3s
6949

70-
Sleep 500ms
71-
72-
Type "flow status"
73-
Sleep 500ms
74-
Enter
75-
Sleep 5s
76-
77-
Type "flow status api-refactor"
50+
# Type the task into Claude
51+
Type "Our auth migration broke prod — API errors in github.com/acme/apps, wrong docs in github.com/acme/docs, and infra config drift in github.com/acme/infrastructure. Set up a workspace for this, then ask me what to look at first."
7852
Sleep 500ms
7953
Enter
80-
Sleep 4s
8154

82-
Sleep 4s
55+
# Wait for Claude to read skills, edit state.yaml, run flow render
56+
Sleep 40s

0 commit comments

Comments
 (0)