ContextStudioWizard/lib/workflow.sh
Karamelmar 7c9b61bfce Fix end-to-end startup: project registration, credentials, trust dialog, ready marker
- start.sh: auto-register project in ~/.config/context-studio/projects/ before
  launching Electron — without this acquireProjectLock() silently skips writing
  the lock file, waitForServers() never finds the registry port, all agent ports
  stay null (localhost:null errors)

- start.sh: mount all known Claude Code credential locations into container
  (~/.claude/.credentials.json, ~/.claude.json, $CLAUDE_CONFIG_DIR variants)
  not just ~/.anthropic which was empty on this system

- bin/claude: create /tmp/cs-ready-<agentId> on host after 3s delay so CS Core's
  CLI ready marker poll resolves instead of timing out after 10s

- workflow.sh: add hasTrustDialogAccepted:true to all agent settings.json so
  claude goes straight to priming without the folder trust dialog

- prereqs.sh: add ensure_api_key() — checks all credential locations, prompts
  with masked input if none found, offers to save to shell profile

- wizard.sh: trap SIGINT for graceful abort — gum confirm popup, reverts created
  project dir and cloned core dir, leaves installed packages untouched

- core.sh: set _WIZARD_CORE_CLONED=true before clone for cleanup tracking

- electron-config.js: increase serverStartupTimeout 30s→90s (config file in
  core/config/, not source — safe to edit)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 21:20:25 +01:00

168 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 ($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"
}
_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,
"hasTrustDialogAccepted": true,
"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"
spin "Cloning workflow..." \
git clone "$repo_url" "$workflow_dir" \
|| die "Failed to clone workflow repo: $repo_url"
success "Workflow cloned"
}