- wizard.sh: interactive bash wizard that scaffolds new CS projects - lib/: utils, core install, project structure, workflow generation - templates/: Dockerfile, devcontainer.json, agent presets (minimal/standard), system.json, roles, hook rules - README: setup, usage, mobility workflow Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
166 lines
4.1 KiB
Bash
166 lines
4.1 KiB
Bash
#!/usr/bin/env bash
|
|
# workflow.sh — generate or clone workflow config
|
|
|
|
WIZARD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
|
# generate_workflow PROJECT_DIR PROJECT_NAME PROJECT_DESC TECH_STACK PRESET
|
|
generate_workflow() {
|
|
local project_dir="$1"
|
|
local project_name="$2"
|
|
local project_desc="$3"
|
|
local tech_stack="$4"
|
|
local preset="$5"
|
|
local workflow_dir="$project_dir/workflow"
|
|
|
|
info "Generating workflow config ($preset preset)..."
|
|
|
|
mkdir -p "$workflow_dir/agents"
|
|
mkdir -p "$workflow_dir/roles"
|
|
mkdir -p "$workflow_dir/hooks/rules"
|
|
mkdir -p "$workflow_dir/project-docs/tasks"
|
|
mkdir -p "$workflow_dir/users/default/tasks"
|
|
mkdir -p "$workflow_dir/data"
|
|
|
|
# workflow.json
|
|
cat > "$workflow_dir/workflow.json" <<EOF
|
|
{
|
|
"name": "$(slugify "$project_name")",
|
|
"version": "1.0.0",
|
|
"description": "$project_desc",
|
|
"techStack": "$tech_stack",
|
|
"requirements": {
|
|
"tools": [],
|
|
"cliProviders": [
|
|
{
|
|
"name": "claude-code",
|
|
"command": "claude",
|
|
"versionFlag": "--version",
|
|
"installHint": "npm install -g @anthropic-ai/claude-code"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# system.json
|
|
cp "$WIZARD_DIR/templates/system.json" "$workflow_dir/system.json"
|
|
|
|
# agents.json — based on preset
|
|
local agents_template
|
|
case "$preset" in
|
|
standard) agents_template="$WIZARD_DIR/templates/agents-standard.json" ;;
|
|
*) agents_template="$WIZARD_DIR/templates/agents-minimal.json" ;;
|
|
esac
|
|
|
|
sed "s/{{PROJECT_NAME}}/$project_name/g; s/{{PROJECT_DESC}}/$project_desc/g" \
|
|
"$agents_template" > "$workflow_dir/agents.json"
|
|
|
|
# Create agent directories from agents.json
|
|
local agent_ids
|
|
agent_ids=$(grep '"id"' "$workflow_dir/agents.json" | sed 's/.*"id": *"\([^"]*\)".*/\1/')
|
|
for agent_id in $agent_ids; do
|
|
_create_agent_dir "$workflow_dir" "$agent_id"
|
|
done
|
|
|
|
# Copy role files
|
|
cp "$WIZARD_DIR/templates/roles/"*.md "$workflow_dir/roles/" 2>/dev/null || true
|
|
|
|
# Copy hook rules
|
|
cp "$WIZARD_DIR/templates/hooks/rules/"*.json "$workflow_dir/hooks/rules/" 2>/dev/null || true
|
|
|
|
# project-docs/project-vision.md
|
|
cat > "$workflow_dir/project-docs/project-vision.md" <<EOF
|
|
# $project_name — Project Vision
|
|
|
|
## Description
|
|
$project_desc
|
|
|
|
## Tech Stack
|
|
$tech_stack
|
|
|
|
## Goals
|
|
- [ ] Define requirements
|
|
- [ ] Implement core features
|
|
- [ ] Test and review
|
|
|
|
## Roadmap
|
|
- Phase 1: Project setup and scaffolding
|
|
- Phase 2: Core implementation
|
|
- Phase 3: Testing and hardening
|
|
EOF
|
|
|
|
# CLAUDE.md
|
|
cat > "$workflow_dir/CLAUDE.md" <<EOF
|
|
# $project_name
|
|
|
|
## Project Overview
|
|
$project_desc
|
|
|
|
**Tech Stack**: $tech_stack
|
|
|
|
## Context Studio Setup
|
|
- Workflow directory: \`CS_WORKFLOW_DIR\`
|
|
- Core directory: \`CS_CORE_DIR\`
|
|
- Start system: \`node \$CS_CORE_DIR/core/start.js\`
|
|
|
|
## Agent Roles
|
|
See \`roles/\` directory for agent role definitions.
|
|
Read \`project-docs/project-vision.md\` for project goals.
|
|
|
|
## Communication
|
|
Use \`/sm <agent> "message"\` to send messages between agents.
|
|
EOF
|
|
|
|
success "Workflow generated at $workflow_dir"
|
|
}
|
|
|
|
_create_agent_dir() {
|
|
local workflow_dir="$1"
|
|
local agent_id="$2"
|
|
local agent_dir="$workflow_dir/agents/$agent_id/.claude"
|
|
|
|
mkdir -p "$agent_dir/hooks"
|
|
mkdir -p "$agent_dir/commands"
|
|
|
|
# settings.json
|
|
cat > "$agent_dir/settings.json" <<EOF
|
|
{
|
|
"model": "sonnet",
|
|
"spinnerTipsEnabled": false,
|
|
"permissions": {
|
|
"allow": [
|
|
"Bash(*)",
|
|
"Read(*)",
|
|
"Write(*)",
|
|
"Edit(*)",
|
|
"Glob(*)",
|
|
"Grep(*)",
|
|
"Task",
|
|
"SlashCommand:/prime:*",
|
|
"SlashCommand:/sm:*"
|
|
],
|
|
"deny": [
|
|
"Bash(node \$CS_CORE_DIR/core/stop.js:*)"
|
|
]
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# CLAUDE.md per agent
|
|
cat > "$workflow_dir/agents/$agent_id/CLAUDE.md" <<EOF
|
|
# Agent: $agent_id
|
|
|
|
Load your role with \`/prime\` at session start.
|
|
EOF
|
|
}
|
|
|
|
clone_workflow() {
|
|
local project_dir="$1"
|
|
local repo_url="$2"
|
|
local workflow_dir="$project_dir/workflow"
|
|
|
|
info "Cloning workflow from $repo_url..."
|
|
git clone "$repo_url" "$workflow_dir" \
|
|
|| die "Failed to clone workflow repo: $repo_url"
|
|
success "Workflow cloned to $workflow_dir"
|
|
}
|