agnes-the-ai-analyst/docs/setup/bootstrap.yaml
Petr 508d92771f Generate setup instructions from bootstrap.yaml (single source of truth)
- Rewrite bootstrap.yaml as clean structured YAML with steps, commands,
  descriptions, conditions, and notes
- Add _generate_setup_instructions() in app.py that reads YAML, substitutes
  placeholders, and produces clipboard-ready plain text
- Replace 50-line hardcoded JS string builder with single tojson variable
- All setup instructions now editable in one YAML file
2026-03-15 00:37:19 +01:00

80 lines
3.3 KiB
YAML

# AI Data Analyst - Setup Instructions
#
# Single source of truth for local environment setup.
# Webapp reads this, substitutes placeholders, and generates clipboard text.
#
# Placeholders (filled from instance.yaml by webapp):
# {server_host} - server IP or hostname
# {ssh_alias} - SSH config alias (instance.yaml: server.ssh_alias)
# {ssh_key} - SSH private key path (instance.yaml: server.ssh_key)
# {username} - analyst username on server
# {webapp_url} - webapp URL
# {project_dir} - local project folder name (instance.yaml: server.project_dir)
header: |
Set up my AI Data Analyst local environment.
connection:
server_host: "{server_host}"
webapp_url: "{webapp_url}"
username: "{username}"
ssh_key: "{ssh_key}"
steps:
- name: "SSH config"
description: |
Check ~/.ssh/config - if a Host entry named "{ssh_alias}" already exists
with a DIFFERENT server, ask me what name to use instead.
Otherwise add:
Host {ssh_alias}
HostName {server_host}
User {username}
IdentityFile {ssh_key}
StrictHostKeyChecking accept-new
Then test: ssh {ssh_alias} echo ok
- name: "Create project folders"
commands:
- "mkdir -p server/docs server/scripts server/parquet server/metadata server/examples"
- "mkdir -p user/duckdb user/notifications user/artifacts user/scripts user/parquet user/sessions"
- 'printf "ssh_alias={ssh_alias}\nserver_host={server_host}\nwebapp_url={webapp_url}\n" > .sync_connection'
- name: "Download from server"
description: |
Use rsync with --no-perms --no-group to avoid macOS permission errors.
Skip directories that don't exist on the server (rsync exit code 23 = missing source).
commands:
- "rsync -avz --no-perms --no-group {ssh_alias}:server/scripts/ ./server/scripts/"
- "rsync -avz --no-perms --no-group {ssh_alias}:server/docs/ ./server/docs/"
- "rsync -avz --no-perms --no-group {ssh_alias}:server/examples/ ./server/examples/"
- "rsync -avz --no-perms --no-group {ssh_alias}:server/metadata/ ./server/metadata/"
- "rsync -avz --no-perms --no-group --progress {ssh_alias}:server/parquet/ ./server/parquet/"
note: "Some folders may be empty if data sync hasn't run on the server yet. That's OK."
- name: "Set up Python venv"
commands:
- "python3 -m venv .venv"
- "source .venv/bin/activate"
- "pip install pandas pyarrow duckdb pyyaml python-dotenv"
- name: "Initialize DuckDB"
condition: "only if server/scripts/setup_views.sh exists"
commands:
- "bash server/scripts/setup_views.sh"
- name: "Create CLAUDE.md"
condition: "if server/docs/setup/claude_md_template.txt exists"
description: |
Copy the template and replace these placeholders:
{username} -> {username}
{ssh_alias} -> {ssh_alias}
{server_host} -> {server_host}
{webapp_url} -> {webapp_url}
Also create CLAUDE.local.md for personal notes (never overwritten by sync).
Also copy server/docs/setup/claude_settings.json to .claude/settings.json.
existing_project:
check: "If CLAUDE.md already exists and contains 'AI Data Analyst'"
message: |
This directory is already set up. Just sync latest data:
bash server/scripts/sync_data.sh