plugins/specweave/skills/umbrella/SKILL.md
Create and manage umbrella workspaces for multi-repo projects. Activate when the user wants to: create umbrella, umbrella init, wrap in umbrella, create workspace, setup multi-repo, migrate repos to umbrella, umbrella create, new workspace, restructure into umbrella, "wrap this repo", "create umbrella for these repos", "setup workspace with repos", "move repos into umbrella". Do NOT activate for: add a repo to existing umbrella (use sw:get), add a feature, add an increment, clone a repo (use sw:get).
npx skillsauth add anton-abyzov/specweave plugins/specweave/skills/umbrellaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Automates the creation of SpecWeave umbrella workspaces for multi-repo projects. Handles directory structure, repo cloning/migration, symlinks, .env consolidation, and SpecWeave initialization in a single flow.
| Mode | Use Case | |------|----------| | init | Create a new umbrella from scratch with remote and/or local repos | | wrap | Wrap an existing local repo (or set of repos) into a new umbrella |
Detect mode from context:
Create a new umbrella workspace from scratch.
Extract from the user's message or ask:
| Input | Required | Default |
|-------|----------|---------|
| Umbrella name | Yes | — |
| Target directory | No | ~/Projects/{name} |
| Repos to include | Yes | — |
Repo source formats (same as sw:get):
owner/repohttps://github.com/org/repo[email protected]:org/repo~/Projects/my-repo or ./my-repoFor local paths, also ask:
owner/repo-long-name as repo)TARGET="${HOME}/Projects/${NAME}"
mkdir -p "${TARGET}"
cd "${TARGET}"
Guard: If directory already exists and contains .specweave/, warn and ask whether to add repos to existing umbrella (delegates to sw:get) or abort.
specweave init "${NAME}"
This creates .specweave/, config.json, CLAUDE.md, AGENTS.md.
Guard: If .specweave/config.json already exists, skip this step.
For each remote repo:
specweave get <source> [--prefix PREFIX]
specweave get handles: clone into repositories/{org}/{repo}/, register in config.json, run specweave init in the repo.
For each local repo:
Local repos need special handling — specweave get expects a URL, not a local move.
# 1. Detect org/repo from git remote
REMOTE_URL=$(git -C "${LOCAL_PATH}" remote get-url origin 2>/dev/null)
# Parse org and repo name from URL (handle HTTPS, SSH, GitHub shorthand)
# Example: [email protected]:antonoly/claude-code-anymodel.git → org=antonoly, repo=claude-code-anymodel
# 2. Allow custom local name (user may want 'claude-code' instead of 'claude-code-anymodel')
REPO_DIR="${CUSTOM_NAME:-${REPO_NAME}}"
# 3. Create target directory
mkdir -p "${TARGET}/repositories/${ORG}"
# 4. Move repo (REQUIRES USER CONFIRMATION — destructive operation)
mv "${LOCAL_PATH}" "${TARGET}/repositories/${ORG}/${REPO_DIR}"
# 5. Create symlink at original location for session compatibility
ln -s "${TARGET}/repositories/${ORG}/${REPO_DIR}" "${LOCAL_PATH}"
# 6. Register in config.json
# Read current config, add to umbrella.childRepos array
Registration — after moving a local repo, add it to .specweave/config.json:
{
"umbrella": {
"childRepos": [
{
"id": "{repo-dir}",
"path": "repositories/{org}/{repo-dir}",
"name": "{repo-dir}",
"prefix": "{FIRST_3_UPPERCASE}",
"githubUrl": "{remote-url}"
}
]
}
}
Use jq to merge into existing config:
jq --arg id "${REPO_DIR}" \
--arg path "repositories/${ORG}/${REPO_DIR}" \
--arg name "${REPO_DIR}" \
--arg prefix "${PREFIX}" \
--arg url "${REMOTE_URL}" \
'.umbrella.childRepos += [{"id": $id, "path": $path, "name": $name, "prefix": $prefix, "githubUrl": $url}]' \
.specweave/config.json > .specweave/config.tmp && mv .specweave/config.tmp .specweave/config.json
Scan all repos for .env files and merge unique keys into umbrella root:
# 1. Find all .env files in repos (never display values)
ENV_FILES=$(find repositories -maxdepth 3 -name ".env" -not -path "*/node_modules/*" 2>/dev/null)
if [ -n "${ENV_FILES}" ]; then
echo "Found .env files:"
for f in ${ENV_FILES}; do
echo " ${f} ($(grep -c '=' "${f}" 2>/dev/null || echo 0) variables)"
done
# 2. Merge unique keys (preserving first occurrence of each key)
# NEVER display values — only key names and counts
for f in ${ENV_FILES}; do
while IFS= read -r line; do
KEY=$(echo "${line}" | cut -d'=' -f1)
if [ -n "${KEY}" ] && ! grep -q "^${KEY}=" "${TARGET}/.env" 2>/dev/null; then
echo "${line}" >> "${TARGET}/.env"
fi
done < "${f}"
done
echo "Consolidated $(grep -c '=' "${TARGET}/.env" 2>/dev/null || echo 0) variables into umbrella .env"
fi
Guard: If umbrella .env already exists, only add NEW keys (don't overwrite existing).
Write a manifest for future cleanup/reference:
# Create or update symlink manifest
cat > .specweave/state/symlinks.json << EOF
{
"created": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"symlinks": [
{
"target": "${TARGET}/repositories/${ORG}/${REPO_DIR}",
"link": "${LOCAL_PATH}",
"repo": "${REPO_DIR}"
}
]
}
EOF
Create a reproducible bootstrap script for new machines:
cat > "${TARGET}/setup.sh" << 'SETUP_EOF'
#!/bin/bash
# Fresh setup script for {NAME}
# Run this on a new machine to recreate the umbrella workspace
set -euo pipefail
UMBRELLA_DIR="${HOME}/Projects/{NAME}"
mkdir -p "${UMBRELLA_DIR}"
cd "${UMBRELLA_DIR}"
# Initialize SpecWeave
specweave init "{NAME}"
# Clone repositories
{FOR_EACH_REPO}
specweave get {SOURCE} {FLAGS}
{END_FOR_EACH}
# Create .env placeholder
cat > .env << 'ENV_EOF'
# Fill in your secrets:
{FOR_EACH_KEY}
{KEY}=
{END_FOR_EACH}
ENV_EOF
echo "Umbrella workspace ready at ${UMBRELLA_DIR}"
echo "Fill in .env with your secrets, then: cd ${UMBRELLA_DIR} && claude"
SETUP_EOF
chmod +x "${TARGET}/setup.sh"
Replace {PLACEHOLDERS} with actual values from the repos that were added.
Run these checks and report results:
# 1. All repos accessible
for repo in repositories/*/*; do
[ -d "${repo}/.git" ] && echo "OK: ${repo}" || echo "MISSING: ${repo}"
done
# 2. Config valid
jq '.umbrella.childRepos | length' .specweave/config.json
# 3. Symlinks valid (if any)
if [ -f .specweave/state/symlinks.json ]; then
jq -r '.symlinks[].link' .specweave/state/symlinks.json | while read link; do
[ -L "${link}" ] && echo "OK: ${link}" || echo "BROKEN: ${link}"
done
fi
# 4. .env exists (if consolidated)
[ -f .env ] && echo ".env: $(grep -c '=' .env) variables" || echo ".env: not created"
Umbrella workspace created: {NAME}
Location: {TARGET}
Repos: {COUNT} registered
Symlinks: {COUNT} created
.env: {COUNT} variables consolidated
Setup script: {TARGET}/setup.sh
Next steps:
cd {TARGET} && claude
sw:get <more-repos> # add more repos
sw:sync-setup # configure GitHub/JIRA/ADO sync
Wrap an existing repo (or set of repos) into a new umbrella.
# Must be inside a git repo
REMOTE_URL=$(git remote get-url origin 2>/dev/null)
# Parse org and repo name
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
If not in a git repo, abort with: "Must be inside a git repository. Use sw:umbrella init instead."
{repo-name}-umbTARGET="${HOME}/Projects/${UMBRELLA_NAME}"
Guard: If target already exists, ask whether to add this repo to it or choose a different name.
# 1. Create umbrella structure
mkdir -p "${TARGET}/repositories/${ORG}"
# 2. CONFIRM with user before moving (destructive)
echo "Will move: ${REPO_ROOT} → ${TARGET}/repositories/${ORG}/${REPO_NAME}"
# 3. Move repo
mv "${REPO_ROOT}" "${TARGET}/repositories/${ORG}/${REPO_NAME}"
# 4. Create symlink at old location
ln -s "${TARGET}/repositories/${ORG}/${REPO_NAME}" "${REPO_ROOT}"
cd "${TARGET}"
specweave init "${UMBRELLA_NAME}"
Same registration as init mode Step 4 (local repo section).
Ask: "Would you like to add more repos to this umbrella?"
If yes, for each additional repo use specweave get <source> or the local move flow from init mode.
Same as init mode Steps 5-8.
Symlinks are tracked in .specweave/state/symlinks.json for reference and cleanup.
To list symlinks:
jq -r '.symlinks[] | "\(.link) → \(.target)"' .specweave/state/symlinks.json
To remove symlinks (when no longer needed):
jq -r '.symlinks[].link' .specweave/state/symlinks.json | while read link; do
[ -L "${link}" ] && rm "${link}" && echo "Removed: ${link}"
done
grep -c '=' for counts, cut -d'=' -f1 for key names only.gitignore includes .env*| User says | Mode | Action | |-----------|------|--------| | "Create umbrella cloud-umb with org/api and org/web" | init | Clone 2 repos into new umbrella | | "Create umbrella for claude-code and anymodel" | init | Prompt for URLs/locations, clone/move | | "Wrap this repo in an umbrella" | wrap | Move current repo into new umbrella | | "Restructure these projects into an umbrella workspace" | init | Gather repo list, create umbrella | | "Setup multi-repo workspace" | init | Prompt for name and repos | | "I need an umbrella for my-api, my-web, and my-shared" | init | Parse 3 repos, create umbrella |
After creating the umbrella, verify all of these pass:
ls repositories/*/*/.git — all repos have .git directoriesjq '.umbrella.childRepos | length' .specweave/config.json — matches repo countjq '.umbrella.enabled' .specweave/config.json — returns true[ -f CLAUDE.md ] — instruction file exists[ -f .env ] || echo "no .env (expected if no secrets)" — .env handledfor l in $(jq -r '.symlinks[].link' .specweave/state/symlinks.json 2>/dev/null); do test -L "$l"; donetools
Generate AI videos from text prompts or images. Supports Google Veo 3.1 and Pollinations.ai (free). Use when generating video, creating animations, text-to-video, AI video, video generation, make clip, animate.
tools
Validate increment with rule-based checks and AI quality assessment. Use when saying "validate", "check quality", or "verify increment".
tools
--- description: Merge completed parallel agent work and trigger GitHub sync per increment. Activates for: team merge, merge agents, combine work, team finish. --- # Team Merge **Verify all teammates completed, run quality gates, close increments, and trigger sync.** ## Usage ```bash sw:team-merge sw:team-merge --dry-run # Preview merge plan sw:team-merge --skip-sync # Merge without GitHub/JIRA sync ``` ## What This Skill Does 1. **Verify all teammates completed** -- bl
tools
Phase-agnostic orchestrator for parallel multi-agent work — brainstorm, plan, implement, review, research, or test. Auto-detects mode from intent. Use for implementation (3+ domains or 15+ tasks), brainstorming (multiple perspectives), parallel planning (PM + Architect), code review (delegates to sw:code-reviewer), research (multiple topics), or testing (parallel test layers). Also use when user says "team setup", "parallel agents", "team lead", "agent teams", "brainstorm with agents", "plan in parallel", "review code", "research this".