优化js-runner命令
This commit is contained in:
@@ -8,6 +8,18 @@ compatibility: Requires Bun runtime (https://bun.sh)
|
||||
|
||||
基于 Bun 的 JavaScript/TypeScript 执行技能,提供隔离的脚本执行和自动依赖管理。
|
||||
|
||||
## 快速参考
|
||||
|
||||
根据您的需求选择使用方式:
|
||||
|
||||
| 场景 | 描述 | 命令 |
|
||||
| --------- | ------------------------ | ---------------------------------- |
|
||||
| **场景1** | 直接执行已存在的脚本文件 | `bun <script-file>` |
|
||||
| **场景2** | 在指定路径创建脚本并执行 | 使用 Write 工具创建 → `bun <path>` |
|
||||
| **场景3** | 使用临时路径执行(默认) | 生成临时路径 → `bun <temp-file>` |
|
||||
|
||||
**重要提示:** 所有场景在执行脚本前都必须先检查 Bun 环境:`bun --version`
|
||||
|
||||
## 前置条件
|
||||
|
||||
### 安装 Bun
|
||||
@@ -34,16 +46,74 @@ bun --version
|
||||
|
||||
## 使用流程
|
||||
|
||||
执行 JavaScript/TypeScript 脚本的完整工作流程:
|
||||
**执行流程决策树:**
|
||||
|
||||
1. **检查环境** - 验证 Bun 是否已安装
|
||||
2. **生成临时路径** - 调用辅助脚本获取唯一的临时文件路径
|
||||
3. **写入脚本** - 将脚本内容保存到临时文件
|
||||
4. **执行脚本** - 使用 Bun 运行脚本
|
||||
5. **捕获输出** - 从执行结果读取 stdout/stderr
|
||||
6. **清理** - 临时文件由系统自动处理
|
||||
1. **步骤1:检查 Bun 环境**
|
||||
- 执行:`bun --version`
|
||||
- 失败 → 输出错误信息(包含安装说明)并停止执行
|
||||
- 成功 → 进入下一步
|
||||
- **重要:** 禁止使用 nodejs、npm、yarn、pnpm 等其他工具
|
||||
|
||||
### 完整示例
|
||||
2. **步骤2:选择执行场景**
|
||||
- 场景1:用户提供了已存在的脚本文件路径?
|
||||
- 是 → 直接执行:`bun <script-file>`
|
||||
- 否 → 进入下一步
|
||||
- 场景2:用户指定了脚本的生成路径?
|
||||
- 是 → 使用 Write 工具创建脚本,然后执行
|
||||
- 否 → 进入场景3
|
||||
|
||||
3. **场景3(默认)**:使用临时路径执行
|
||||
- 生成临时文件路径
|
||||
- 将脚本内容写入临时文件
|
||||
- 使用 Bun 运行脚本
|
||||
- 临时文件由系统自动处理
|
||||
|
||||
---
|
||||
|
||||
### 场景1:执行已存在的脚本文件
|
||||
|
||||
```bash
|
||||
# 步骤 1: 检查 Bun 是否已安装
|
||||
bun --version
|
||||
|
||||
# 步骤 2: 直接执行已存在的脚本
|
||||
bun ./scripts/my-script.js
|
||||
|
||||
# 脚本的输出将自动显示
|
||||
```
|
||||
|
||||
**关键特点:**
|
||||
- ✅ **无需生成临时文件** - 直接执行用户提供的脚本
|
||||
- ✅ **保持脚本位置** - 脚本留在原位置,不会被移动或复制
|
||||
- ✅ **简洁快速** - 跳过文件生成步骤,直接执行
|
||||
|
||||
### 场景2:在指定路径创建并执行脚本
|
||||
|
||||
```bash
|
||||
# 步骤 1: 检查 Bun 是否已安装
|
||||
bun --version
|
||||
|
||||
# 步骤 2: 使用 Write 工具在指定路径创建脚本
|
||||
# (以下步骤由大模型使用 Write 工具完成)
|
||||
# write content to "./scripts/new-script.js"
|
||||
|
||||
const greeting = "Hello from custom path!";
|
||||
console.log(greeting);
|
||||
|
||||
# 步骤 3: 执行脚本
|
||||
bun ./scripts/new-script.js
|
||||
```
|
||||
|
||||
**关键特点:**
|
||||
- ✅ **自定义路径** - 脚本创建到用户指定的位置
|
||||
- ✅ **持久化存储** - 脚本文件保存在指定位置,不会被自动清理
|
||||
- ✅ **灵活控制** - 用户可以精确控制脚本位置和命名
|
||||
|
||||
### 场景3:使用临时路径执行(默认流程)
|
||||
|
||||
当用户未提供任何路径信息时,使用临时路径执行脚本(默认流程):
|
||||
|
||||
#### 基础示例
|
||||
|
||||
```bash
|
||||
# 步骤 1: 检查 Bun 是否已安装
|
||||
@@ -65,53 +135,27 @@ bun "$TEMP_FILE"
|
||||
# 临时文件将由系统自动清理
|
||||
```
|
||||
|
||||
### 使用依赖
|
||||
#### TypeScript 示例
|
||||
|
||||
```bash
|
||||
# 生成临时文件
|
||||
TEMP_FILE=$(bun skills/js-runner/scripts/get_temp_path.js js)
|
||||
|
||||
# 写入包含外部依赖的脚本
|
||||
cat <<EOF > "$TEMP_FILE"
|
||||
import axios from 'axios';
|
||||
|
||||
const response = await axios.get('https://api.github.com');
|
||||
console.log('GitHub API status:', response.status);
|
||||
EOF
|
||||
|
||||
# 执行 - Bun 首次运行时会自动下载依赖
|
||||
bun "$TEMP_FILE"
|
||||
```
|
||||
|
||||
Bun 会自动:
|
||||
|
||||
- 检测 `import` 语句
|
||||
- 下载并缓存依赖(到 `~/.bun/install/cache`)
|
||||
- 根据需要处理 TypeScript 编译
|
||||
- 无需 `package.json` 或手动安装
|
||||
|
||||
## JavaScript 与 TypeScript
|
||||
|
||||
JavaScript 和 TypeScript 使用相同的工作流程:
|
||||
|
||||
```bash
|
||||
# JavaScript
|
||||
TEMP_JS=$(bun skills/js-runner/scripts/get_temp_path.js js)
|
||||
cat <<EOF > "$TEMP_JS"
|
||||
console.log('JavaScript execution');
|
||||
EOF
|
||||
bun "$TEMP_JS"
|
||||
|
||||
# TypeScript
|
||||
# 生成 TypeScript 临时文件
|
||||
TEMP_TS=$(bun skills/js-runner/scripts/get_temp_path.js ts)
|
||||
|
||||
# 写入 TypeScript 脚本
|
||||
cat <<EOF > "$TEMP_TS"
|
||||
const message: string = 'TypeScript execution';
|
||||
console.log(message);
|
||||
EOF
|
||||
|
||||
# 执行 - Bun 会自动转译 TypeScript
|
||||
bun "$TEMP_TS"
|
||||
```
|
||||
|
||||
Bun 会自动即时转译 TypeScript。
|
||||
**Bun 自动处理:**
|
||||
- 检测 `import` 语句
|
||||
- 即时转译 TypeScript
|
||||
- 下载并缓存依赖(到 `~/.bun/install/cache`)
|
||||
- 无需 `package.json` 或手动安装
|
||||
|
||||
## 依赖管理
|
||||
|
||||
@@ -179,11 +223,27 @@ $ bun skills/js-runner/scripts/get_temp_path.js ts
|
||||
|
||||
### 未安装 Bun
|
||||
|
||||
**症状:** `command not found: bun`
|
||||
**症状:** `bun --version` 失败或返回 "command not found: bun"
|
||||
|
||||
**解决方案:**
|
||||
**错误处理:**
|
||||
|
||||
提示用户 Bun 没有安装,并说明安装方式,禁止直接自动安装
|
||||
当检测到 Bun 未安装时,必须:
|
||||
|
||||
1. **停止执行** - 不进行任何后续操作
|
||||
2. **输出明确错误信息** - 清晰说明 "Bun 运行时未安装" 或类似提示
|
||||
3. **提供安装说明** - 参考"前置条件"章节的安装命令
|
||||
|
||||
**重要限制:**
|
||||
|
||||
- ❌ **禁止自动安装** - 不要尝试自动安装 Bun,由用户自行决定
|
||||
- ❌ **禁止使用其他工具** - 不要尝试使用 nodejs、npm、yarn、pnpm 等其他 JavaScript 运行时或包管理工具
|
||||
- ❌ **禁止格式转换** - 不要建议用户将脚本转换为其他运行时格式
|
||||
|
||||
**正确做法:**
|
||||
|
||||
- ✅ 仅输出错误信息和安装说明
|
||||
- ✅ 等待用户安装 Bun 后再继续
|
||||
- ✅ 保持使用 Bun 作为唯一运行时
|
||||
|
||||
### 脚本语法错误
|
||||
|
||||
@@ -258,9 +318,9 @@ process.exit(0) // 成功
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **始终检查 Bun 是否已安装**,然后再尝试执行脚本
|
||||
2. **使用辅助脚本为每次执行生成唯一的临时路径**
|
||||
3. **单独处理 stdout/stderr** 以区分输出和错误
|
||||
4. **检查退出码** 以检测脚本失败
|
||||
5. **使用 ESM imports** (`import from`) 编写现代 JavaScript
|
||||
6. **捕获并显示错误** 以帮助用户调试问题
|
||||
1. **始终先检查 Bun 环境** - 所有场景第一步都执行 `bun --version`
|
||||
2. **根据用户意图选择场景** - 查看快速参考选择合适的使用方式
|
||||
3. **单独处理 stdout/stderr** - 以区分输出和错误
|
||||
4. **检查退出码** - 以检测脚本失败
|
||||
5. **使用 ESM imports** - 使用 `import from` 编写现代 JavaScript
|
||||
6. **捕获并显示错误** - 以帮助用户调试问题
|
||||
|
||||
Reference in New Issue
Block a user