1
0

优化js-runner命令

This commit is contained in:
2026-02-06 14:53:55 +08:00
parent 260b8966ed
commit 1726616c48
8 changed files with 426 additions and 60 deletions

View File

@@ -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. **捕获并显示错误** - 以帮助用户调试问题