macOS or Linux
Windows works via WSL 2 (Ubuntu / Debian). Native cmd / PowerShell is not supported.
Install · est. 60 seconds
Happy Cowork installs as symlinks from core/ into each
AI tool's native home. No build step, no package manager,
no background service. Re-runs are idempotent.
curl -fsSL https://ai.happynguyen.name.vn/install.sh | bash
The installer auto-detects the AI tools already on your machine.
Pick specific tools ·
Inspect then run ·
Manual clone
A typical developer machine already has these.
Windows works via WSL 2 (Ubuntu / Debian). Native cmd / PowerShell is not supported.
macOS's bundled /bin/bash is fine. Homebrew's bash 5 is also fine.
For cloning and for the git pull update path.
Any recent version. Launch Cursor once so ~/.cursor/ exists before installing.
gh CLI optionalUsed by create-pr, review-pr, triage-issues, release-notes. gh auth login once.
jq & direnv optionalJSON wrangling in scripts and per-repo env vars — nice to have.
The bootstrap accepts a --tool= flag. Leave it off and every detected tool gets configured.
curl -fsSL https://ai.happynguyen.name.vn/install.sh | bash -s -- --tool=cursor
Install for Cursor only.
curl -fsSL https://ai.happynguyen.name.vn/install.sh | bash -s -- --tool=cursor,claude
Install for multiple tools at once.
bin/cowork install --tool=cursor --only=skills,rules
After clone: install only certain categories (skills, rules, hooks, mcp, agents).
Never pipe a URL into your shell without knowing what it does.
curl -fsSL https://ai.happynguyen.name.vn/install.sh -o happy-cowork-install.sh
less happy-cowork-install.sh
It's a thin wrapper: clones
nguyenhappy92/happy-cowork
into ~/code/happy-cowork and runs the repo's
install.sh.
Nothing leaves your machine.
bash happy-cowork-install.sh
Same result, zero curl magic.
git clone https://github.com/nguyenhappy92/happy-cowork.git ~/code/happy-cowork
SSH variant:
git@github.com:nguyenhappy92/happy-cowork.git. Any path works; ~/code/happy-cowork is just a convention.
cd ~/code/happy-cowork && ./install.sh
Idempotent — safe to re-run. Existing files at the target paths are
renamed with a .bak suffix before a symlink replaces them.
Open Cursor and ask the agent:
› List the skills you have available.
You should see create-pr, rebase,
review-pr, daily-standup,
triage-issues, and release-notes.
No magic. Just symlinks.
skills/*
~/.cursor/skills/
rules/*
~/.cursor/rules/
hooks/hooks.json
~/.cursor/hooks/hooks.json
hooks/scripts
~/.cursor/hooks/scripts
<path>.bak.hooks/scripts/ are made executable by the installer.CURSOR_HOME=/custom/path.Everything below is an environment variable you can prefix to the curl command.
Where to clone the repo. Default $HOME/code/happy-cowork.
Branch, tag, or SHA to install. Default main. Pin to a tag for reproducibility.
Git URL. Default https://github.com/nguyenhappy92/happy-cowork.git. Useful for forks.
Target Cursor config dir. Default $HOME/.cursor.
HAPPY_COWORK_REF=v1.0.0 \
bash -c "$(curl -fsSL https://ai.happynguyen.name.vn/install.sh)"
Install a pinned version (once you cut a release).
HAPPY_COWORK_DIR=~/dev/happy-cowork \
bash -c "$(curl -fsSL https://ai.happynguyen.name.vn/install.sh)"
Install into a custom directory.
Works with the default /bin/bash (3.2). Homebrew bash 5 works too.
Any distro with bash and git. Tested on Ubuntu LTS and Debian stable.
Install into your WSL home, not /mnt/c/…. Symlinks don't survive the DrvFs boundary reliably.
Since everything is symlinked, updating is a single git pull:
cd ~/code/happy-cowork && git pull --rebase
Or re-run the one-liner — it's idempotent and will fast-forward to main.
Remove the symlinks. Nothing else is touched —
any .bak files stay where they are.
cd ~/code/happy-cowork && \
find ~/.cursor/skills ~/.cursor/rules ~/.cursor/hooks -maxdepth 2 -type l \
-lname "$(pwd)/*" -print -delete
ls -la ~/.cursor/skills.~/.cursor/ doesn't exist.install.sh.chmod +x automatically. If you cloned manually: chmod +x install.sh.bash regardless of your interactive shell.CURSOR_HOME=/some/path bash -c "$(curl -fsSL https://ai.happynguyen.name.vn/install.sh)".In any chat, say /standup or /triage. The agent picks the matching skill by its description.
Combine skills into daily workflows — see workflow recipes.
Say "use the create-skill skill to add a new skill called my-thing" — or create skills/my-thing/SKILL.md by hand.