# xworkspace-console — Agent 规范

## GitHub Actions Workflow 编写规则

### 禁止内嵌脚本（shell heredoc / python heredoc）

**严禁**在 `.github/workflows/` 的 `run:` 块里使用任何内嵌 heredoc：

```yaml
# ❌ 禁止 — shell heredoc
run: |
  cat > file.tf << EOF
  content
  EOF

# ❌ 禁止 — python 内联 heredoc
run: |
  python3 - <<'PYEOF'
  import os
  ...
  PYEOF
```

**原因：**
- Shell heredoc 内容从列 1 开始，超出 YAML literal block 缩进范围，导致整个 workflow 文件 YAML 解析失败，GitHub 丢失 `on:` 触发器。
- Python 内联 heredoc 同理，且难以维护和测试。

**正确做法：外置脚本，workflow 只做调用。**

```yaml
# ✅ 正确 — 外置 Python 脚本（放在 infra repo，通过已有 checkout 引用）
- name: Configure remote backend
  env:
    TF_STATE_ENDPOINT: ${{ steps.vault.outputs.TF_STATE_ENDPOINT }}
  run: python3 $GITHUB_WORKSPACE/${{ env.VPS_ROOT }}/scripts/render_backend_tf.py backend.tf
```

渲染脚本存放在 `ai-workspace-infra/iac_modules/terraform-hcl-standard/vultr-vps/scripts/`，
通过 workflow 内已有的 `Checkout iac_modules` 步骤引用，无需额外 self-checkout。
workflow 内的 `run:` 块调用外置脚本，命名规范 `动词_名词.py` 或 `动词-名词.sh`。

### 其他规范

- workflow 使用的外置脚本必须在 `scripts/` 目录下，不得内嵌在 `run:` 块里。
- workflow 文件修改后必须用 `python3 -c "import yaml; yaml.safe_load(open(...))"` 验证 YAML 语法再提交。
- 不使用 GitHub Actions Secrets，所有机密统一从 Vault (https://vault.svc.plus) OIDC 读取。
