npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

oimp

v1.4.8

Published

A CLI tool for generating OI problem and packages

Readme

OI Tools (oimp)

一个强大的OI(信息学奥林匹克)题目生成和管理工具,支持题目创建、测试数据生成、打包导出以及实时预览功能。

最新版本: v1.4.7 | 发布日期: 2026-02-10

📖 查看完整更新日志

✨ 功能特性

  • 🚀 题目初始化: 快速创建标准化的OI题目结构
  • 💻 Web IDE集成开发环境: 完整的浏览器内开发环境
    • 📁 文件管理、🧑‍💻 代码编辑、🔍 查找替换、🖥️ 集成终端
    • 📝 实时预览(GitHub 风格、数学公式、图片)、📊 状态面板
    • 🎯 工作流按钮、🖼️ 图片粘贴/上传、⚡ 离线可用
  • 🔧 题目编辑: 交互式编辑题目信息、支持目录重命名和模板补全
  • 🛠️ 修复功能: 自动补全标准目录和文件
  • 📥 导入功能: 从hydrooj格式的zip文件导入题目
  • 🧪 智能状态管理: 基于文件修改时间的精细化状态管理
    • std.cpp/validator.cpp 修改触发 testsample 重新测试
    • generator.cpp 修改不触发 testsample(智能检查)
    • 核心文件修改触发 data/check/package 重新做
  • 🧪 多解法支持: 支持 std.cpp、std-force.cpp、std-fast.cpp、std-error.cpp
  • 📦 题目打包: 支持非交互式打包(--default 参数)
  • 完整性检查: 自动编译 checker.cpp 确保判题准确
  • 📸 快照管理: 管理题目版本快照
  • 🛡️ 判题安全: checker.cpp 自动编译,变更必定生效
  • 🛡️ 编译安全: std.cpp 编译失败时立即退出并更新状态
  • 🧑‍💻 编码兼容: 强制使用 UTF-8 编码
  • 🔨 一键编译: 实时显示编译过程和错误信息
  • 🧪 自动测试: diff 功能自动测试样例
  • 📝 样例导入/导出: 预览区支持与 sample 文件双向同步

📦 安装

# 克隆项目
git clone https://github.com/chjshen/oimp.git
cd oimp

# 安装依赖
yarn install

# 全局可用
yarn link

# 全局安装(可选)
yarn global add oimp

🚦 推荐使用流程

  1. 初始化题目

    oimp init <题目ID>
    # 或使用参数
    oimp init <题目ID> --name <题目名称> --tag <标签1,标签2> --memory 256m --time 1000ms --checker wcmp.cpp
  2. 启动 Web IDE

    oimp watch <题目ID>
  3. 在 Web IDE 中完成开发

    • 编辑题面、标准程序、数据生成器、验证器等
    • 使用底部工作流按钮快速执行命令
    • 实时查看题目开发状态
  4. 命令行操作(可选)

    • oimp testsample <题目ID> - 测试样例
    • oimp check <题目ID> - 检查完整性
    • oimp gendata <题目ID> - 生成测试数据
    • oimp package <题目ID> - 打包题目
    • oimp import <zip-file-path> - 从zip文件导入题目
    • oimp fix <题目ID> - 自动补全文件

🚀 快速开始

1. 创建新题目

# 创建题目
oimp init fibonacci

# 强制覆盖
oimp init fibonacci --force

# 使用参数初始化
oimp init fibonacci --name "斐波那契数列" --tag "数学,动态规划" --memory 256m --time 1000ms --checker wcmp.cpp

# 非交互式(使用默认值)
oimp init fibonacci --default

2. 修复题目文件

oimp fix fibonacci

3. 启动 Web IDE

oimp watch fibonacci
# 指定端口
oimp watch fibonacci -p 8080

4. 生成测试数据

# 生成默认数量
oimp gendata fibonacci

# 生成指定数量
oimp gendata fibonacci -c 10

智能检查:仅 generator.cpp 修改时跳过样例检测直接生成数据。

5. 检查题目完整性

oimp check fibonacci

检查项目:目录结构、必要文件、配置格式、测试数据、程序编译。

6. 查看题目状态

oimp status fibonacci

显示各步骤状态(done、need-redo、pending),智能跟踪文件变更。

7. 查看测试样例

oimp testsample fibonacci

功能特性

  • 自动编译所有 std-*.cpp 文件
  • 自动验证样例输入是否符合 validator 要求
  • std.cpp 编译失败时立即退出并更新状态
  • 使用 checker.cpp 进行精确答案比对

8. 打包题目

# 交互式打包
oimp package fibonacci

# 非交互式打包
oimp package fibonacci --default

生成 fibonacci.zip 文件,--default 参数自动使用默认选项。

9. 导入题目

# 从hydrooj格式的zip文件导入题目
oimp import /path/to/fibonacci_hydrooj.zip

# 强制覆盖已存在的目录
oimp import /path/to/fibonacci_hydrooj.zip --force

# 指定目标目录名称
oimp import /path/to/fibonacci_hydrooj.zip --name my_fibonacci_problem

从hydrooj格式的zip文件导入题目到本地,自动还原目录结构和文件路径。

🛠️ 可用命令和参数说明

所有可用命令

| 命令 | 描述 | |------|------| | oimp init <题目ID> | 初始化新题目 | | oimp edit <题目ID> | 编辑题目信息 | | oimp watch <题目ID> | 启动Web IDE | | oimp check <题目ID> | 检查题目完整性 | | oimp gendata <题目ID> | 生成测试数据 | | oimp testsample <题目ID> | 测试样例 | | oimp package <题目ID> | 打包题目 | | oimp import <zip-file-path> | 从zip文件导入题目 | | oimp status <题目ID> | 显示题目状态 | | oimp fix <题目ID> | 修复题目文件 | | oimp snapshot <题目ID> | 管理题目快照 |

通用参数说明

| 参数 | 描述 | 示例 | |------|------|------| | -c <value> | 指定生成测试数据的数量(用于gendata命令) | oimp gendata prob -c 20 | | --force-f | 强制覆盖现有目录或文件 | oimp init prob --force | | --default-d | 使用默认选项进行非交互式操作 | oimp package prob --default | | --name <value> | 指定题目名称 | oimp init prob --name "My Problem" | | --tag <value> | 指定标签(多个标签用逗号分隔) | oimp init prob --tag "动态规划,图论" | | --memory <value> | 指定内存限制 | oimp init prob --memory 512m | | --time <value> | 指定时间限制 | oimp init prob --time 2000ms | | --checker <value> | 指定检查器类型 | oimp init prob --checker wcmp.cpp | | --port <value>-p | 指定端口号(用于watch命令) | oimp watch prob -p 3000 | | --name <value> | 指定导入时的目标目录名称(用于import命令) | oimp import prob.zip --name new_prob |

📁 项目结构

oi-tools/
├── bin/oimp.js              # 主入口
├── lib/
│   ├── commands/            # 命令模块
│   │   ├── init.js          # 初始化
│   │   ├── edit.js          # 编辑
│   │   ├── watch.js         # Web IDE
│   │   ├── genrate.js       # 生成数据
│   │   ├── check.js         # 检查
│   │   ├── testsample.js    # 测试样例
│   │   ├── package.js       # 打包
│   │   ├── import.js        # 导入
│   │   ├── status.js        # 状态
│   │   ├── fix.js           # 修复
│   │   └── snapshot.js      # 快照
│   ├── templates/           # 模板文件
│   │   ├── problem_zh.md
│   │   ├── std.cpp
│   │   ├── validator.cpp
│   │   ├── generator.cpp
│   │   ├── checker.cpp
│   │   └── static/          # Web IDE 资源
│   └── utils.js
├── package.json
└── README.md

📂 题目目录结构

题目名称/
├── problem_zh.md          # 题目描述
├── problem.yaml           # 题目配置
├── std.cpp               # 标准解答
├── validator.cpp         # 数据验证器
├── generator.cpp         # 数据生成器
├── checker.cpp           # 自定义评测器
├── solution/stdsol.md    # 标准题解
├── additional_file/      # 附加文件(图片、文档等)
├── sample/               # 样例输入输出
└── testdata/             # 测试数据

🎨 Web IDE 功能

核心组件

  • 文件树:浏览、切换、编辑文件
  • 代码编辑器:Monaco Editor,语法高亮、智能提示
  • 集成终端:xterm.js,执行命令、显示输出
  • 实时预览:GitHub 风格 Markdown、数学公式、图片

C++ 编辑器功能

  • 保存(Ctrl+S)
  • 编译:实时显示编译过程和错误
  • 运行:编译并运行当前程序
  • diff 测试:自动测试样例并与标准答案比对
  • 测试验证器:专门测试 validator.cpp

样例管理

  • 预览区自动检测样例代码块
  • 读入:从 sample 文件导入内容
  • 写入:将内容写入 sample 文件
  • 取消:跳过当前代码块

工作流按钮

  • 题目状态、编辑元数据、修复、快照
  • 编辑题面、编辑标程、编辑数据生成器、编辑验证器
  • 测试样例、检查、生成数据、打包

🔧 配置说明

题目配置 (problem.yaml)

title: "斐波那契数列"
tag: ["入门", "动态规划"]

评测配置 (testdata/config.yaml)

time: "1000ms"
memory: "256m"

🌐 跨平台支持

工具全面支持 Windows、Linux、macOS,自动适配:

  • 文件比较命令:fc (Windows) / diff (Unix)
  • 文件清理命令:del (Windows) / rm (Unix)
  • 文件检查:if exist (Windows) / if [ -f ] (Unix)

📝 许可证

MIT License

🤝 贡献

欢迎提交 Issue 和 Pull Request!