Add comprehensive project shortcuts system

- Create config/projects.nix for project definitions with templates
- Add scripts/templates/ with basic, content, and research workflows
- Create universal project-launcher.sh for template execution
- Integrate project system into zsh with dynamic alias generation
- Generate projects.json config file for shell script consumption
- Update README.md with project shortcuts documentation

Projects supported:
- blog: Personal blog (content workflow)
- mdshortcut: Research project (research workflow)
- nix-config: Nix configuration (basic workflow)

Usage: proj, blog, mdshortcut, nix-config commands

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Yan Lin 2025-07-26 22:38:23 +02:00
parent 539ba9fef7
commit af7b855faf
7 changed files with 260 additions and 3 deletions

64
scripts/project-launcher.sh Executable file
View file

@ -0,0 +1,64 @@
#!/bin/bash
# Universal project launcher - reads project config and launches appropriate template
# Usage: project-launcher.sh PROJECT_NAME
PROJECT_NAME="$1"
CONFIG_DIR="$(dirname "$0")/../config"
PROJECTS_JSON="$CONFIG_DIR/projects.json"
TEMPLATES_DIR="$(dirname "$0")/templates"
if [ -z "$PROJECT_NAME" ]; then
echo "Available projects:"
if [ -f "$PROJECTS_JSON" ]; then
jq -r '.projects | keys[]' "$PROJECTS_JSON" 2>/dev/null || echo "No projects configured"
else
echo "No projects configured - run 'home-manager switch' to generate config"
fi
exit 1
fi
if [ ! -f "$PROJECTS_JSON" ]; then
echo "Error: Projects configuration not found. Run 'home-manager switch' to generate config."
exit 1
fi
# Extract project configuration
PROJECT_CONFIG=$(jq -r ".projects.\"$PROJECT_NAME\"" "$PROJECTS_JSON" 2>/dev/null)
if [ "$PROJECT_CONFIG" = "null" ]; then
echo "Error: Project '$PROJECT_NAME' not found."
echo "Available projects:"
jq -r '.projects | keys[]' "$PROJECTS_JSON" 2>/dev/null
exit 1
fi
TEMPLATE=$(echo "$PROJECT_CONFIG" | jq -r '.template')
SESSION_NAME=$(echo "$PROJECT_CONFIG" | jq -r '.name')
CODE_PATH=$(echo "$PROJECT_CONFIG" | jq -r '.codePath')
CONTENT_PATH=$(echo "$PROJECT_CONFIG" | jq -r '.contentPath // empty')
PAPER_PATH=$(echo "$PROJECT_CONFIG" | jq -r '.paperPath // empty')
# Launch appropriate template
case "$TEMPLATE" in
"basic")
exec "$TEMPLATES_DIR/basic.sh" "$SESSION_NAME" "$CODE_PATH"
;;
"content")
if [ -z "$CONTENT_PATH" ]; then
echo "Error: Content template requires contentPath"
exit 1
fi
exec "$TEMPLATES_DIR/content.sh" "$SESSION_NAME" "$CODE_PATH" "$CONTENT_PATH"
;;
"research")
if [ -z "$PAPER_PATH" ]; then
echo "Error: Research template requires paperPath"
exit 1
fi
exec "$TEMPLATES_DIR/research.sh" "$SESSION_NAME" "$CODE_PATH" "$PAPER_PATH"
;;
*)
echo "Error: Unknown template '$TEMPLATE'"
exit 1
;;
esac

33
scripts/templates/basic.sh Executable file
View file

@ -0,0 +1,33 @@
#!/bin/bash
# Basic development template - single directory with nvim, ai, git, shell
# Usage: basic.sh SESSION_NAME CODE_PATH
SESSION_NAME="$1"
CODE_PATH="$2"
if [ -z "$SESSION_NAME" ] || [ -z "$CODE_PATH" ]; then
echo "Usage: $0 SESSION_NAME CODE_PATH"
exit 1
fi
if tmux has-session -t $SESSION_NAME 2>/dev/null; then
tmux attach-session -t $SESSION_NAME
exit 0
fi
tmux new-session -d -s $SESSION_NAME -c "$CODE_PATH"
tmux rename-window -t $SESSION_NAME:1 "nvim"
tmux send-keys -t $SESSION_NAME:1 "nvim" C-m
tmux new-window -t $SESSION_NAME:2 -n "ai"
tmux send-keys -t $SESSION_NAME:2 "claude -r" C-m
tmux split-window -t $SESSION_NAME:2 -h
tmux split-window -t $SESSION_NAME:2.2 -v
tmux select-pane -t $SESSION_NAME:2.1
tmux new-window -t $SESSION_NAME:3 -n "git"
tmux send-keys -t $SESSION_NAME:3 "gitui" C-m
tmux new-window -t $SESSION_NAME:4 -n "shell"
tmux select-window -t $SESSION_NAME:1
tmux attach-session -t $SESSION_NAME

41
scripts/templates/content.sh Executable file
View file

@ -0,0 +1,41 @@
#!/bin/bash
# Content workflow template - code + separate content directory
# Usage: content.sh SESSION_NAME CODE_PATH CONTENT_PATH
SESSION_NAME="$1"
CODE_PATH="$2"
CONTENT_PATH="$3"
if [ -z "$SESSION_NAME" ] || [ -z "$CODE_PATH" ] || [ -z "$CONTENT_PATH" ]; then
echo "Usage: $0 SESSION_NAME CODE_PATH CONTENT_PATH"
exit 1
fi
if tmux has-session -t $SESSION_NAME 2>/dev/null; then
tmux attach-session -t $SESSION_NAME
exit 0
fi
# Create windows for code
tmux new-session -d -s $SESSION_NAME -c "$CODE_PATH"
tmux rename-window -t $SESSION_NAME:1 "code"
tmux send-keys -t $SESSION_NAME:1 "nvim" C-m
tmux new-window -t $SESSION_NAME:2 -n "code-ai" -c "$CODE_PATH"
tmux send-keys -t $SESSION_NAME:2 "claude -r" C-m
tmux split-window -t $SESSION_NAME:2 -h -c "$CODE_PATH"
tmux split-window -t $SESSION_NAME:2.2 -v -c "$CODE_PATH"
tmux select-pane -t $SESSION_NAME:2.1
tmux new-window -t $SESSION_NAME:3 -n "git" -c "$CODE_PATH"
tmux send-keys -t $SESSION_NAME:3 "gitui" C-m
# Create windows for content
tmux new-window -t $SESSION_NAME:4 -n "content-ai" -c "$CONTENT_PATH"
tmux send-keys -t $SESSION_NAME:4 "claude -r" C-m
tmux split-window -t $SESSION_NAME:4 -h -c "$CONTENT_PATH"
tmux split-window -t $SESSION_NAME:4.2 -v -c "$CONTENT_PATH"
tmux select-pane -t $SESSION_NAME:4.1
tmux select-window -t $SESSION_NAME:1
tmux attach-session -t $SESSION_NAME

42
scripts/templates/research.sh Executable file
View file

@ -0,0 +1,42 @@
#!/bin/bash
# Research workflow template - code + separate paper directory
# Usage: research.sh SESSION_NAME CODE_PATH PAPER_PATH
SESSION_NAME="$1"
CODE_PATH="$2"
PAPER_PATH="$3"
if [ -z "$SESSION_NAME" ] || [ -z "$CODE_PATH" ] || [ -z "$PAPER_PATH" ]; then
echo "Usage: $0 SESSION_NAME CODE_PATH PAPER_PATH"
exit 1
fi
if tmux has-session -t $SESSION_NAME 2>/dev/null; then
tmux attach-session -t $SESSION_NAME
exit 0
fi
# Create windows for code
tmux new-session -d -s $SESSION_NAME -c "$CODE_PATH"
tmux rename-window -t $SESSION_NAME:1 "code"
tmux send-keys -t $SESSION_NAME:1 "nvim" C-m
tmux new-window -t $SESSION_NAME:2 -n "code-ai" -c "$CODE_PATH"
tmux send-keys -t $SESSION_NAME:2 "claude -r" C-m
tmux split-window -t $SESSION_NAME:2 -h -c "$CODE_PATH"
tmux split-window -t $SESSION_NAME:2.2 -v -c "$CODE_PATH"
tmux select-pane -t $SESSION_NAME:2.1
# Create windows for paper
tmux new-window -t $SESSION_NAME:3 -n "paper" -c "$PAPER_PATH"
tmux select-window -t $SESSION_NAME:3
tmux send-keys -t $SESSION_NAME:3 "nvim" C-m
tmux new-window -t $SESSION_NAME:4 -n "paper-ai" -c "$PAPER_PATH"
tmux send-keys -t $SESSION_NAME:4 "claude -r" C-m
tmux split-window -t $SESSION_NAME:4 -h -c "$PAPER_PATH"
tmux split-window -t $SESSION_NAME:4.2 -v -c "$PAPER_PATH"
tmux select-pane -t $SESSION_NAME:4.1
tmux select-window -t $SESSION_NAME:1
tmux attach-session -t $SESSION_NAME