# repostack run <script>

> 

执行 `repostack.yaml` 中定义的命名脚本。

```bash
repostack run <script>
```

## 脚本定义

脚本在 `repostack.yaml` 的 `scripts` 字段中声明：

```yaml
scripts:
  # 无范围：在 stack root 执行一次
  deploy:
    command: pnpm changeset publish

  # 指定 views：切进每个匹配 repo 执行
  build:
    command: pnpm build
    views: [runtime]

  # 指定多个 views（取并集）
  test:
    command: pnpm test
    views: [runtime, tools]

  # 指定 repos
  lint:
    command: pnpm lint
    repos: [foo, bar]

  # 指定 tags
  check:
    command: pnpm typecheck
    tags: [publishable]
```

**执行模式由脚本定义决定：**

- 脚本未指定任何范围（`repos`/`views`/`tags`）→ 在 stack root 执行一次
- 脚本指定了范围 → 切进每个匹配 repo 的目录并发执行

## 执行流程

<steps level="4">

#### **加载配置**- 读取 `repostack.yaml` 和 `.repostackrc`（如果启用了用户配置）。





#### **查找脚本**- 在 `config.scripts` 中查找 `<script>`，未找到时报错并列出可用脚本。





#### **确定执行模式**- 若脚本有 `repos`/`views`/`tags`：解析目标 repo 列表后逐 repo 执行。

  - 多个 `views` 先各自解析再取**并集**，再按 `repos`/`tags` 过滤（取交集）。
  - 若 `views` 中存在未知视图名，抛出 `Unknown view: <name>`。
- 若脚本无任何范围：在 stack root 目录执行一次。





#### **确定 Shell**- 从 `config.settings.shell` 获取，未配置时回退到 `$SHELL`，再回退到系统默认。





#### **执行命令**- 跨 repo 模式：并发数 = `min(config.settings.concurrency, 目标 repo 数量)`，默认 **4**。
- **TTY 进度提示**：跨 repo 模式下显示 spinner，实时展示执行状态。





#### **结果输出**- 跨 repo 模式：每个 repo 结果前打印 `== <repo> ==` 分隔符。
- 若 `settings.continueOnError` 为 `false`（默认），任一 repo 失败后停止调度新任务。





</steps>

## 涉及文件

| 文件               | 操作  |
| ---------------- | --- |
| `repostack.yaml` | 读取  |
| `.repostackrc`   | 读取  |

## 错误信息

| 场景     | 错误信息                                            |
| ------ | ----------------------------------------------- |
| 未指定脚本名 | 列出 `config.scripts` 中所有可用脚本                     |
| 未知脚本名  | `Unknown script: "<script>". Available: <list>` |
| 未知视图名  | `Unknown view: <name>`                          |
| 命令执行失败 | 输出 stderr，并返回该命令的 exit code                     |

## 示例

```bash
# 在 stack root 执行一次（无范围脚本）
repostack run deploy

# 在脚本指定的 repos/views/tags 范围内执行
repostack run build
repostack run test
repostack run lint

# 查看可用脚本列表（不带脚本名）
repostack run
```
