Forked clean from public hackathon repo (Starfire-AgentTeam, BSL 1.1) with full rebrand to Molecule AI under github.com/Molecule-AI/molecule-monorepo. Brand: Starfire → Molecule AI. Slug: starfire / agent-molecule → molecule. Env vars: STARFIRE_* → MOLECULE_*. Go module: github.com/agent-molecule/platform → github.com/Molecule-AI/molecule-monorepo/platform. Python packages: starfire_plugin → molecule_plugin, starfire_agent → molecule_agent. DB: agentmolecule → molecule. History truncated; see public repo for prior commits and contributor attribution. Verified green: go test -race ./... (platform), pytest (workspace-template 1129 + sdk 132), vitest (canvas 352), build (mcp). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
138 lines
3.3 KiB
Bash
Executable File
138 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# import-agent.sh — Import any agent folder into Molecule AI as a workspace template.
|
|
#
|
|
# Usage:
|
|
# ./import-agent.sh ~/path/to/my-openclaw-agent
|
|
# ./import-agent.sh ~/path/to/my-openclaw-agent my-custom-name
|
|
#
|
|
# Supports: OpenClaw, Claude Code, Codex, or any folder with .md files + skills/
|
|
|
|
set -euo pipefail
|
|
|
|
SOURCE="${1:?Usage: ./import-agent.sh <agent-folder> [template-name]}"
|
|
TEMPLATES_DIR="workspace-configs-templates"
|
|
|
|
# Derive template name from folder name or second argument
|
|
TEMPLATE_NAME="${2:-$(basename "$SOURCE")}"
|
|
# Normalize: lowercase, replace spaces with hyphens
|
|
TEMPLATE_NAME=$(echo "$TEMPLATE_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
|
|
DEST="$TEMPLATES_DIR/$TEMPLATE_NAME"
|
|
|
|
if [[ -d "$DEST" ]]; then
|
|
echo "Template '$TEMPLATE_NAME' already exists at $DEST"
|
|
echo "Delete it first or choose a different name."
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== Importing Agent ==="
|
|
echo "Source: $SOURCE"
|
|
echo "Template: $TEMPLATE_NAME"
|
|
echo "Dest: $DEST"
|
|
echo ""
|
|
|
|
# Copy the folder
|
|
cp -r "$SOURCE" "$DEST"
|
|
|
|
# Detect what kind of agent this is by looking at files
|
|
PROMPT_FILES=()
|
|
for f in SOUL.md BOOTSTRAP.md AGENTS.md HEARTBEAT.md TOOLS.md USER.md IDENTITY.md MEMORY.md; do
|
|
[[ -f "$DEST/$f" ]] && PROMPT_FILES+=("$f")
|
|
done
|
|
|
|
# Claude Code style
|
|
[[ -f "$DEST/CLAUDE.md" ]] && PROMPT_FILES+=("CLAUDE.md")
|
|
|
|
# Codex style
|
|
if [[ ${#PROMPT_FILES[@]} -eq 0 && -f "$DEST/AGENTS.md" ]]; then
|
|
PROMPT_FILES+=("AGENTS.md")
|
|
fi
|
|
|
|
# Fallback: system-prompt.md
|
|
if [[ ${#PROMPT_FILES[@]} -eq 0 ]]; then
|
|
if [[ -f "$DEST/system-prompt.md" ]]; then
|
|
PROMPT_FILES+=("system-prompt.md")
|
|
else
|
|
# Use any .md file in root
|
|
for f in "$DEST"/*.md; do
|
|
[[ -f "$f" ]] && PROMPT_FILES+=("$(basename "$f")")
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# Detect skills
|
|
SKILLS=()
|
|
if [[ -d "$DEST/skills" ]]; then
|
|
for d in "$DEST/skills"/*/; do
|
|
[[ -d "$d" ]] && SKILLS+=("$(basename "$d")")
|
|
done
|
|
fi
|
|
|
|
# Build prompt_files YAML list
|
|
PROMPT_YAML=""
|
|
for f in "${PROMPT_FILES[@]}"; do
|
|
PROMPT_YAML+=" - $f\n"
|
|
done
|
|
|
|
# Build skills YAML list
|
|
SKILLS_YAML=""
|
|
for s in "${SKILLS[@]}"; do
|
|
SKILLS_YAML+=" - $s\n"
|
|
done
|
|
|
|
# Generate config.yaml if it doesn't exist
|
|
if [[ ! -f "$DEST/config.yaml" ]]; then
|
|
DISPLAY_NAME=$(echo "$TEMPLATE_NAME" | sed 's/-/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)}1')
|
|
|
|
cat > "$DEST/config.yaml" << EOF
|
|
name: $DISPLAY_NAME
|
|
description: Imported from $(basename "$SOURCE")
|
|
version: 1.0.0
|
|
tier: 1
|
|
|
|
model: anthropic:claude-haiku-4-5-20251001
|
|
|
|
prompt_files:
|
|
$(echo -e "$PROMPT_YAML")
|
|
skills:
|
|
$(echo -e "${SKILLS_YAML:- []}")
|
|
tools: []
|
|
|
|
a2a:
|
|
port: 8000
|
|
streaming: true
|
|
push_notifications: true
|
|
|
|
delegation:
|
|
retry_attempts: 3
|
|
retry_delay: 5
|
|
timeout: 120
|
|
escalate: true
|
|
|
|
sub_workspaces: []
|
|
|
|
env:
|
|
required:
|
|
- ANTHROPIC_API_KEY
|
|
optional: []
|
|
EOF
|
|
echo "Generated config.yaml"
|
|
else
|
|
echo "config.yaml already exists, keeping it"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== Import Complete ==="
|
|
echo ""
|
|
echo "Prompt files: ${PROMPT_FILES[*]}"
|
|
echo "Skills: ${SKILLS[*]:-none}"
|
|
echo ""
|
|
echo "To deploy:"
|
|
echo " 1. Open http://localhost:3000"
|
|
echo " 2. Click the template palette (grid icon, top-left)"
|
|
echo " 3. Click '$DISPLAY_NAME' to deploy"
|
|
echo ""
|
|
echo "Or set API key first:"
|
|
echo " 1. Deploy the workspace"
|
|
echo " 2. Click it → Settings tab → set ANTHROPIC_API_KEY"
|
|
echo " 3. Click Details tab → Restart"
|