From cd1fbea56affa9d3942d84ccb2833d1e05268a32 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Jan 2026 13:16:51 +0000 Subject: [PATCH 1/3] chore: standardize README header --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4157016..94be9ec 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +> **Part of [Tuulbelt](https://github.com/tuulbelt/tuulbelt)** — A collection of zero-dependency tools. + # CLI Progress Reporting / `prog` [![Tests](https://github.com/tuulbelt/cli-progress-reporting/actions/workflows/test.yml/badge.svg)](https://github.com/tuulbelt/cli-progress-reporting/actions/workflows/test.yml) From 5330caabcdf2ab7c7127ce36ae755c69bb09af4e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Jan 2026 14:25:40 +0000 Subject: [PATCH 2/3] chore: add benchmark framework with tatami-ng --- benchmarks/index.bench.ts | 103 ++++++++++++++++++++++++++++++++++++++ package.json | 2 + 2 files changed, 105 insertions(+) create mode 100644 benchmarks/index.bench.ts diff --git a/benchmarks/index.bench.ts b/benchmarks/index.bench.ts new file mode 100644 index 0000000..1867a37 --- /dev/null +++ b/benchmarks/index.bench.ts @@ -0,0 +1,103 @@ +#!/usr/bin/env node --import tsx +/** + * CLI Progress Reporting Benchmarks + * + * Measures performance of core operations using tatami-ng for statistical rigor. + * + * Run: npm run bench + * + * See: /docs/BENCHMARKING_STANDARDS.md + */ + +import { bench, baseline, group, run } from 'tatami-ng'; +import { ProgressReporter, ProgressState } from '../src/index.ts'; +import { mkdtempSync, rmSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; + +// Prevent dead code elimination +let result: ProgressReporter | ProgressState | undefined; +let tempDir: string; + +// Setup/teardown +function setup() { + tempDir = mkdtempSync(join(tmpdir(), 'prog-bench-')); +} + +function teardown() { + if (tempDir) { + rmSync(tempDir, { recursive: true, force: true }); + } +} + +// ============================================================================ +// Core Operations Benchmarks +// ============================================================================ + +group('Progress Reporter Creation', () => { + setup(); + + baseline('create: basic reporter', () => { + result = new ProgressReporter({ + total: 100, + stateDir: tempDir, + }); + }); + + bench('create: with custom message', () => { + result = new ProgressReporter({ + total: 100, + message: 'Processing files', + stateDir: tempDir, + }); + }); + + teardown(); +}); + +group('Progress Updates', () => { + setup(); + const reporter = new ProgressReporter({ + total: 1000, + stateDir: tempDir, + }); + + baseline('update: increment', () => { + reporter.increment(); + }); + + bench('update: set progress', () => { + reporter.setProgress(500); + }); + + bench('update: with message', () => { + reporter.setMessage('Step 500 of 1000'); + }); + + teardown(); +}); + +group('State Reading', () => { + setup(); + const reporter = new ProgressReporter({ + total: 100, + stateDir: tempDir, + }); + reporter.setProgress(50); + + baseline('read: get state', () => { + result = reporter.getState(); + }); + + teardown(); +}); + +// ============================================================================ +// Run Benchmarks +// ============================================================================ + +await run({ + units: false, + silent: false, + json: false, +}); diff --git a/package.json b/package.json index 05cc0ab..49a5da9 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "test:filesystem": "node --import tsx --test test/filesystem.test.ts", "test:fuzzy": "node --import tsx --test test/fuzzy.test.ts", "test:watch": "node --import tsx --test --watch test/index.test.ts test/cli.test.ts test/filesystem.test.ts test/fuzzy.test.ts", + "bench": "node --import tsx benchmarks/index.bench.ts", "dogfood": "npm run dogfood:flaky", "dogfood:flaky": "flaky --test 'npm test' --runs 10" }, @@ -42,6 +43,7 @@ "devDependencies": { "@tuulbelt/test-flakiness-detector": "git+https://github.com/tuulbelt/test-flakiness-detector.git", "@types/node": "^20.19.27", + "tatami-ng": "^0.8.0", "tsx": "^4.7.0", "typescript": "^5.3.0" } From 611fc3b935ccc7fc076c9d848eb23109ae155b79 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Jan 2026 16:03:53 +0000 Subject: [PATCH 3/3] fix: update package-lock.json for tatami-ng --- package-lock.json | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/package-lock.json b/package-lock.json index 66ba700..4cae10c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "devDependencies": { "@tuulbelt/test-flakiness-detector": "git+https://github.com/tuulbelt/test-flakiness-detector.git", "@types/node": "^20.19.27", + "tatami-ng": "^0.8.0", "tsx": "^4.7.0", "typescript": "^5.3.0" }, @@ -573,6 +574,16 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/peowly": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/peowly/-/peowly-1.3.2.tgz", + "integrity": "sha512-BYIrwr8JCXY49jUZscgw311w9oGEKo7ux/s+BxrhKTQbiQ0iYNdZNJ5LgagaeercQdFHwnR7Z5IxxFWVQ+BasQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.6.0" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -583,6 +594,22 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/tatami-ng": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/tatami-ng/-/tatami-ng-0.8.18.tgz", + "integrity": "sha512-Q22ZpW/yPXP1Hb4e2s1JQcTtoMaVHZLCt8AjAyBjARiXcorgHyvuWyIPFJOvmrTglXU2qQPLqL+7HEE0tIHdiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "peowly": "^1.3.2" + }, + "bin": { + "tatami": "cli.js" + }, + "peerDependencies": { + "typescript": "^5.4.3" + } + }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",