Skip to content

feat: prepare for open source release with KPS v1.2 support - #2

Merged
zhexuany merged 29 commits into
mainfrom
opensource-prep
Jan 22, 2026
Merged

feat: prepare for open source release with KPS v1.2 support#2
zhexuany merged 29 commits into
mainfrom
opensource-prep

Conversation

@zhexuany

@zhexuany zhexuany commented Jan 20, 2026

Copy link
Copy Markdown
Contributor
Overview

  This is the initial open-source release of Robocodec v0.1.0. This PR adds comprehensive KPS (Kupas) dataset format support, complete pipeline architecture, CLI tools, and all necessary open-source
  infrastructure.

  📊 Statistics

  - 197 files changed
  - 44,363 insertions
  - 5,903 deletions
  - 782 tests passing

  🎯 Key Features

  1. KPS Dataset Format (New)

  - V1.2 Specification: Compliant directory structure with Robot-EndEffector-Scene naming
  - Fluent API: Type-safe builder for conversions
  - Statistics Tracking: Automatic directory naming with actual stats
  - Time Alignment: Linear, Nearest Neighbor, Hold Last strategies
  - Multi-format Output: HDF5, Parquet, MP4
  - Audio Support: WAV file output
  - Original Data: proprio_stats_original.hdf5 for unaligned data

  2. Pipeline Architecture
  ┌───────────────┬────────┬────────────┬────────────────────┐
  │   Pipeline    │ Stages │ Throughput │      Use Case      │
  ├───────────────┼────────┼────────────┼────────────────────┤
  │ Standard      │ 4      │ ~200 MB/s  │ Balanced           │
  ├───────────────┼────────┼────────────┼────────────────────┤
  │ HyperPipeline │ 7      │ ~1800 MB/s │ Max throughput     │
  ├───────────────┼────────┼────────────┼────────────────────┤
  │ KPS Pipeline  │ 5+     │ Varies     │ Dataset conversion │
  └───────────────┴────────┴────────────┴────────────────────┘
  3. CLI Tools

  robocodec convert    # Format conversion
  robocodec inspect    # File inspection
  robocodec extract    # Data extraction
  robocodec schema     # Schema utilities
  robocodec search     # Data search

  4. Open Source Infrastructure

  - ✅ MulanPSL-2.0 license (Chinese OSI-approved license)
  - ✅ Bilingual documentation (English & Chinese)
  - ✅ CI/CD workflows (test + publish)
  - ✅ Issue/PR templates
  - ✅ Contributing guidelines
  - ✅ Security policy
  - ✅ Code of conduct

  📝 Documentation

  - README.md / README_zh.md - Project overview
  - ARCHITECTURE.md - High-level architecture
  - PIPELINE.md - Pipeline details
  - MEMORY.md - Memory management
  - CONTRIBUTING.md - Contribution guide
  - examples/kps/ - KPS conversion examples

  🔧 Feature Flags
  ┌─────────────┬─────────────────────────┐
  │    Flag     │       Description       │
  ├─────────────┼─────────────────────────┤
  │ kps-hdf5    │ HDF5 dataset support    │
  ├─────────────┼─────────────────────────┤
  │ kps-parquet │ Parquet dataset support │
  ├─────────────┼─────────────────────────┤
  │ kps-depth   │ Depth video support     │
  ├─────────────┼─────────────────────────┤
  │ kps-all     │ All KPS features        │
  └─────────────┴─────────────────────────┘
  📦 Examples

  // KPS conversion with fluent API
  use robocodec::pipeline::kps::KpsConverter;

  let report = KpsConverter::new("input.mcap", "output_dir")
      .config("config.toml")
      .v12_delivery()
      .robot("Kuavo4Pro")
      .end_effector("Dexhand")
      .scene("Housekeeper")
      .sub_scene("Kitchen")
      .task("Dispose_of_takeout_containers")
      .with_statistics()
      .run()?;

  ✅ Test Results

  test result: ok. 782 passed; 0 failed

  📄 License

  This project is licensed under the MulanPSL v2 - see LICENSE for details.



<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Initial open-source setup, repo restructure, and CI/CD.
> 
> - **Licensing & compliance**: Add MulanPSL-2.0 `LICENSE`, `NOTICE`, REUSE config, and Code of Conduct
> - **Docs**: New bilingual README, `ARCHITECTURE.md`, `PIPELINE.md` refs, `MEMORY.md`, ROADMAP, SECURITY, CONTRIBUTING, CLAUDE guidance
> - **CI/CD**: GitHub Actions for lint/tests (Rust/Python), type-checking, coverage (Codecov), and publish to PyPI/crates.io
> - **Templates & tooling**: Issue/PR templates, Makefile, codecov config, Serena/Claude settings
> - **Workspace & build**: Convert to Cargo workspace (`roboflow` + `robocodec`), update `Cargo.toml` metadata, dependencies, and features (`python`, `kps-*`, `profiling`, `jemalloc`, `gpu`)
> - **CLIs & bench**: Add binaries `convert`, `extract`, `inspect`, `schema`, `search`; add `benches/profiler` with flamegraph support; remove `extract_sample`
> - **Housekeeping**: Expanded `.gitignore` and initial CHANGELOG
> 
> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 6216f603e8b92a15d6f02dc092a63c1a349182e3. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->


- Add MulanPSL-2.0 LICENSE
- Add comprehensive README (English & Chinese)
- Add contributing guidelines (English & Chinese)
- Add security policy (English & Chinese)
- Add code of conduct (English & Chinese)
- Add CHANGELOG.md
- Add GitHub issue/PR templates
- Add CI/CD workflow for testing
- Update license in Cargo.toml and pyproject.toml

move reader test to tests

fmt and fix doc tests

prepare for open-sourcing

support kps
@zhexuany zhexuany changed the title Opensource prep feat: prepare for open source release with KPS v1.2 support Jan 20, 2026
cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

zhexuany and others added 3 commits January 21, 2026 19:00
- Fix test_factory_no_feature: add cfg guard to only run when kps features disabled
- Fix test_map_topic_to_v12_path: check for both "velocity" and "velocities"
- Fix dead_code warnings in NvComCompressor and IoUringPrefetcher
- Replace manual modulo check with is_multiple_of()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

zhexuany and others added 3 commits January 21, 2026 21:20
The name TransformPipeline was confusing as it conflicted with the
actual processing pipelines (Standard Pipeline, HyperPipeline) in the
roboflow crate.

The new name MultiTransform better reflects that this is a composite
transform that applies multiple metadata transforms (topic rename, type
rename) in sequence, not a message processing pipeline.

Changes:
- Rename TransformPipeline struct to MultiTransform
- Update all references across robocodec and roboflow crates
- Update documentation and comments

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

@05F3759DF

05F3759DF commented Jan 22, 2026

Copy link
Copy Markdown
  1. As MulanPSL2 says, the whole licence should be contained(including Chinese version). The Chinese verison should prevail if there are conflicts.
  2. The newest version of Contributor Covenant is 3.0, which boosts cultural sensitivity, restorative justice, and customization.
  3. MCAP maybe is for Modular Container for Associated Protocols, not Mission data CAPture.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

Comment thread benches/profiler.rs
let profile_dir = profile_output.parent().unwrap_or(Path::new("."));
if !profile_dir.exists() {
std::fs::create_dir_all(profile_dir)?;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Profile command fails with filename-only output path

Medium Severity

When --profile-output is a filename without a directory component (e.g., myprofile), parent() returns Some(Path::new("")) (empty path) rather than None. The unwrap_or(Path::new(".")) doesn't trigger because Some was returned, so profile_dir becomes an empty string. Then create_dir_all("") fails with a confusing error about creating an empty-named directory, rather than correctly defaulting to the current directory.

Fix in Cursor Fix in Web

@zhexuany
zhexuany merged commit 8a64e34 into main Jan 22, 2026
17 checks passed
@zhexuany
zhexuany deleted the opensource-prep branch January 22, 2026 03:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants