modestbench 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +39 -31
- package/dist/bootstrap.cjs +10 -10
- package/dist/bootstrap.cjs.map +1 -1
- package/dist/bootstrap.d.cts.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +5 -5
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/commands/history.cjs +108 -266
- package/dist/cli/commands/history.cjs.map +1 -1
- package/dist/cli/commands/history.d.cts +75 -12
- package/dist/cli/commands/history.d.cts.map +1 -1
- package/dist/cli/commands/history.d.ts +75 -12
- package/dist/cli/commands/history.d.ts.map +1 -1
- package/dist/cli/commands/history.js +105 -268
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/run.cjs +18 -5
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.d.cts +1 -0
- package/dist/cli/commands/run.d.cts.map +1 -1
- package/dist/cli/commands/run.d.ts +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +18 -5
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.cjs +307 -91
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +308 -92
- package/dist/cli/index.js.map +1 -1
- package/dist/core/engine.cjs +8 -1
- package/dist/core/engine.cjs.map +1 -1
- package/dist/core/engine.d.cts +3 -0
- package/dist/core/engine.d.cts.map +1 -1
- package/dist/core/engine.d.ts +3 -0
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +8 -1
- package/dist/core/engine.js.map +1 -1
- package/dist/core/output-path-resolver.cjs +34 -0
- package/dist/core/output-path-resolver.cjs.map +1 -0
- package/dist/core/output-path-resolver.d.cts +10 -0
- package/dist/core/output-path-resolver.d.cts.map +1 -0
- package/dist/core/output-path-resolver.d.ts +10 -0
- package/dist/core/output-path-resolver.d.ts.map +1 -0
- package/dist/core/output-path-resolver.js +30 -0
- package/dist/core/output-path-resolver.js.map +1 -0
- package/dist/formatters/history/base.cjs +9 -0
- package/dist/formatters/history/base.cjs.map +1 -0
- package/dist/formatters/history/base.d.cts +26 -0
- package/dist/formatters/history/base.d.cts.map +1 -0
- package/dist/formatters/history/base.d.ts +26 -0
- package/dist/formatters/history/base.d.ts.map +1 -0
- package/dist/formatters/history/base.js +8 -0
- package/dist/formatters/history/base.js.map +1 -0
- package/dist/formatters/history/compare.cjs +127 -0
- package/dist/formatters/history/compare.cjs.map +1 -0
- package/dist/formatters/history/compare.d.cts +21 -0
- package/dist/formatters/history/compare.d.cts.map +1 -0
- package/dist/formatters/history/compare.d.ts +21 -0
- package/dist/formatters/history/compare.d.ts.map +1 -0
- package/dist/formatters/history/compare.js +123 -0
- package/dist/formatters/history/compare.js.map +1 -0
- package/dist/formatters/history/list.cjs +74 -0
- package/dist/formatters/history/list.cjs.map +1 -0
- package/dist/formatters/history/list.d.cts +25 -0
- package/dist/formatters/history/list.d.cts.map +1 -0
- package/dist/formatters/history/list.d.ts +25 -0
- package/dist/formatters/history/list.d.ts.map +1 -0
- package/dist/formatters/history/list.js +70 -0
- package/dist/formatters/history/list.js.map +1 -0
- package/dist/formatters/history/show.cjs +98 -0
- package/dist/formatters/history/show.cjs.map +1 -0
- package/dist/formatters/history/show.d.cts +21 -0
- package/dist/formatters/history/show.d.cts.map +1 -0
- package/dist/formatters/history/show.d.ts +21 -0
- package/dist/formatters/history/show.d.ts.map +1 -0
- package/dist/formatters/history/show.js +94 -0
- package/dist/formatters/history/show.js.map +1 -0
- package/dist/formatters/history/trends.cjs +194 -0
- package/dist/formatters/history/trends.cjs.map +1 -0
- package/dist/formatters/history/trends.d.cts +22 -0
- package/dist/formatters/history/trends.d.cts.map +1 -0
- package/dist/formatters/history/trends.d.ts +22 -0
- package/dist/formatters/history/trends.d.ts.map +1 -0
- package/dist/formatters/history/trends.js +190 -0
- package/dist/formatters/history/trends.js.map +1 -0
- package/dist/formatters/history/visualization.cjs +79 -0
- package/dist/formatters/history/visualization.cjs.map +1 -0
- package/dist/formatters/history/visualization.d.cts +24 -0
- package/dist/formatters/history/visualization.d.cts.map +1 -0
- package/dist/formatters/history/visualization.d.ts +24 -0
- package/dist/formatters/history/visualization.d.ts.map +1 -0
- package/dist/formatters/history/visualization.js +74 -0
- package/dist/formatters/history/visualization.js.map +1 -0
- package/dist/index.cjs +15 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/dist/reporters/csv.cjs +2 -2
- package/dist/reporters/csv.cjs.map +1 -1
- package/dist/reporters/csv.d.cts +1 -1
- package/dist/reporters/csv.d.cts.map +1 -1
- package/dist/reporters/csv.d.ts +1 -1
- package/dist/reporters/csv.d.ts.map +1 -1
- package/dist/reporters/csv.js +1 -1
- package/dist/reporters/csv.js.map +1 -1
- package/dist/reporters/human.cjs +24 -62
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts +1 -1
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts +1 -1
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +2 -40
- package/dist/reporters/human.js.map +1 -1
- package/dist/reporters/json.cjs +2 -2
- package/dist/reporters/json.cjs.map +1 -1
- package/dist/reporters/json.d.cts +1 -1
- package/dist/reporters/json.d.cts.map +1 -1
- package/dist/reporters/json.d.ts +1 -1
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +1 -1
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/simple.cjs +2 -2
- package/dist/reporters/simple.cjs.map +1 -1
- package/dist/reporters/simple.d.cts +1 -1
- package/dist/reporters/simple.d.cts.map +1 -1
- package/dist/reporters/simple.d.ts +1 -1
- package/dist/reporters/simple.d.ts.map +1 -1
- package/dist/reporters/simple.js +1 -1
- package/dist/reporters/simple.js.map +1 -1
- package/dist/{config/manager.cjs → services/config-manager.cjs} +2 -2
- package/dist/services/config-manager.cjs.map +1 -0
- package/dist/{config/manager.d.cts → services/config-manager.d.cts} +1 -1
- package/dist/services/config-manager.d.cts.map +1 -0
- package/dist/{config/manager.d.ts → services/config-manager.d.ts} +1 -1
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/{config/manager.js → services/config-manager.js} +2 -2
- package/dist/services/config-manager.js.map +1 -0
- package/dist/{core/loader.cjs → services/file-loader.cjs} +2 -2
- package/dist/services/file-loader.cjs.map +1 -0
- package/dist/{core/loader.d.cts → services/file-loader.d.cts} +1 -1
- package/dist/services/file-loader.d.cts.map +1 -0
- package/dist/{core/loader.d.ts → services/file-loader.d.ts} +1 -1
- package/dist/services/file-loader.d.ts.map +1 -0
- package/dist/{core/loader.js → services/file-loader.js} +2 -2
- package/dist/services/file-loader.js.map +1 -0
- package/dist/services/history/comparison.cjs +124 -0
- package/dist/services/history/comparison.cjs.map +1 -0
- package/dist/services/history/comparison.d.cts +18 -0
- package/dist/services/history/comparison.d.cts.map +1 -0
- package/dist/services/history/comparison.d.ts +18 -0
- package/dist/services/history/comparison.d.ts.map +1 -0
- package/dist/services/history/comparison.js +120 -0
- package/dist/services/history/comparison.js.map +1 -0
- package/dist/services/history/models.cjs +9 -0
- package/dist/services/history/models.cjs.map +1 -0
- package/dist/services/history/models.d.cts +139 -0
- package/dist/services/history/models.d.cts.map +1 -0
- package/dist/services/history/models.d.ts +139 -0
- package/dist/services/history/models.d.ts.map +1 -0
- package/dist/services/history/models.js +8 -0
- package/dist/services/history/models.js.map +1 -0
- package/dist/services/history/query.cjs +97 -0
- package/dist/services/history/query.cjs.map +1 -0
- package/dist/services/history/query.d.cts +38 -0
- package/dist/services/history/query.d.cts.map +1 -0
- package/dist/services/history/query.d.ts +38 -0
- package/dist/services/history/query.d.ts.map +1 -0
- package/dist/services/history/query.js +92 -0
- package/dist/services/history/query.js.map +1 -0
- package/dist/services/history/trend-analysis.cjs +187 -0
- package/dist/services/history/trend-analysis.cjs.map +1 -0
- package/dist/services/history/trend-analysis.d.cts +34 -0
- package/dist/services/history/trend-analysis.d.cts.map +1 -0
- package/dist/services/history/trend-analysis.d.ts +34 -0
- package/dist/services/history/trend-analysis.d.ts.map +1 -0
- package/dist/services/history/trend-analysis.js +179 -0
- package/dist/services/history/trend-analysis.js.map +1 -0
- package/dist/{storage/history.cjs → services/history-storage.cjs} +1 -1
- package/dist/services/history-storage.cjs.map +1 -0
- package/dist/{storage/history.d.cts → services/history-storage.d.cts} +1 -1
- package/dist/services/history-storage.d.cts.map +1 -0
- package/dist/{storage/history.d.ts → services/history-storage.d.ts} +1 -1
- package/dist/services/history-storage.d.ts.map +1 -0
- package/dist/{storage/history.js → services/history-storage.js} +1 -1
- package/dist/services/history-storage.js.map +1 -0
- package/dist/{progress/manager.cjs → services/progress-manager.cjs} +1 -1
- package/dist/services/progress-manager.cjs.map +1 -0
- package/dist/{progress/manager.d.cts → services/progress-manager.d.cts} +1 -1
- package/dist/services/progress-manager.d.cts.map +1 -0
- package/dist/{progress/manager.d.ts → services/progress-manager.d.ts} +1 -1
- package/dist/services/progress-manager.d.ts.map +1 -0
- package/dist/{progress/manager.js → services/progress-manager.js} +1 -1
- package/dist/services/progress-manager.js.map +1 -0
- package/dist/{reporters/registry.cjs → services/reporter-registry.cjs} +1 -1
- package/dist/services/reporter-registry.cjs.map +1 -0
- package/dist/{reporters/registry.d.cts → services/reporter-registry.d.cts} +1 -1
- package/dist/services/reporter-registry.d.cts.map +1 -0
- package/dist/{reporters/registry.d.ts → services/reporter-registry.d.ts} +1 -1
- package/dist/services/reporter-registry.d.ts.map +1 -0
- package/dist/{reporters/registry.js → services/reporter-registry.js} +1 -1
- package/dist/services/reporter-registry.js.map +1 -0
- package/dist/types/cli.d.cts +3 -0
- package/dist/types/cli.d.cts.map +1 -1
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/utils/ansi.cjs +61 -0
- package/dist/utils/ansi.cjs.map +1 -0
- package/dist/utils/ansi.d.cts +53 -0
- package/dist/utils/ansi.d.cts.map +1 -0
- package/dist/utils/ansi.d.ts +53 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +57 -0
- package/dist/utils/ansi.js.map +1 -0
- package/package.json +5 -4
- package/src/bootstrap.ts +5 -5
- package/src/cli/commands/history.ts +194 -342
- package/src/cli/commands/run.ts +32 -3
- package/src/cli/index.ts +361 -106
- package/src/core/engine.ts +9 -1
- package/src/core/output-path-resolver.ts +38 -0
- package/src/formatters/history/base.ts +28 -0
- package/src/formatters/history/compare.ts +186 -0
- package/src/formatters/history/list.ts +101 -0
- package/src/formatters/history/show.ts +155 -0
- package/src/formatters/history/trends.ts +281 -0
- package/src/formatters/history/visualization.ts +93 -0
- package/src/index.ts +7 -11
- package/src/reporters/csv.ts +1 -1
- package/src/reporters/human.ts +2 -42
- package/src/reporters/json.ts +1 -1
- package/src/reporters/simple.ts +1 -1
- package/src/{config/manager.ts → services/config-manager.ts} +1 -1
- package/src/{core/loader.ts → services/file-loader.ts} +1 -1
- package/src/services/history/comparison.ts +130 -0
- package/src/services/history/models.ts +148 -0
- package/src/services/history/query.ts +116 -0
- package/src/services/history/trend-analysis.ts +238 -0
- package/src/types/cli.ts +3 -0
- package/src/utils/ansi.ts +59 -0
- package/dist/config/manager.cjs.map +0 -1
- package/dist/config/manager.d.cts.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/core/loader.cjs.map +0 -1
- package/dist/core/loader.d.cts.map +0 -1
- package/dist/core/loader.d.ts.map +0 -1
- package/dist/core/loader.js.map +0 -1
- package/dist/progress/manager.cjs.map +0 -1
- package/dist/progress/manager.d.cts.map +0 -1
- package/dist/progress/manager.d.ts.map +0 -1
- package/dist/progress/manager.js.map +0 -1
- package/dist/reporters/registry.cjs.map +0 -1
- package/dist/reporters/registry.d.cts.map +0 -1
- package/dist/reporters/registry.d.ts.map +0 -1
- package/dist/reporters/registry.js.map +0 -1
- package/dist/storage/history.cjs.map +0 -1
- package/dist/storage/history.d.cts.map +0 -1
- package/dist/storage/history.d.ts.map +0 -1
- package/dist/storage/history.js.map +0 -1
- /package/src/{storage/history.ts → services/history-storage.ts} +0 -0
- /package/src/{progress/manager.ts → services/progress-manager.ts} +0 -0
- /package/src/{reporters/registry.ts → services/reporter-registry.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.1.0...modestbench-v0.2.0) (2025-10-26)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add --output-file CLI option ([#66](https://github.com/boneskull/modestbench/issues/66)) ([09bb5ae](https://github.com/boneskull/modestbench/commit/09bb5ae7468c9d5eb9d1e9641c58350a5b3856dd))
|
|
9
|
+
* **history:** implement trend analysis and comparison ([#64](https://github.com/boneskull/modestbench/issues/64)) ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
10
|
+
* **history:** implement trends and comparison ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
11
|
+
* implement date parsing, compare, and trend analysis core ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
12
|
+
* implement full trends command with visualizations ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
13
|
+
|
|
3
14
|
## [0.1.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.0.3...modestbench-v0.1.0) (2025-10-24)
|
|
4
15
|
|
|
5
16
|
|
package/README.md
CHANGED
|
@@ -130,37 +130,7 @@ modestbench --iterations 5000 --reporters human,json
|
|
|
130
130
|
|
|
131
131
|
### View Results
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
🚀 ModestBench
|
|
135
|
-
|
|
136
|
-
Environment:
|
|
137
|
-
Node.js: v24.10.0
|
|
138
|
-
Platform: darwin arm64
|
|
139
|
-
CPU: Apple M4 Max (16 cores)
|
|
140
|
-
Memory: 48.0 GB
|
|
141
|
-
|
|
142
|
-
Found 1 benchmark file(s)
|
|
143
|
-
|
|
144
|
-
▶ benchmarks/example.bench.js
|
|
145
|
-
|
|
146
|
-
▶ Array Operations
|
|
147
|
-
✓ Array.push()
|
|
148
|
-
810.05μs ±2.45% (1.23M ops/sec)
|
|
149
|
-
✓ Array spread
|
|
150
|
-
81.01ms ±4.12% (12.34K ops/sec)
|
|
151
|
-
✓ 2 passed
|
|
152
|
-
|
|
153
|
-
✓ All 2 tasks passed
|
|
154
|
-
|
|
155
|
-
📊 Results
|
|
156
|
-
|
|
157
|
-
✓ All tests passed: 2
|
|
158
|
-
📁 Files: 1
|
|
159
|
-
📊 Suites: 1
|
|
160
|
-
⏱️ Duration: 1.82s
|
|
161
|
-
|
|
162
|
-
🎉 All benchmarks completed successfully!
|
|
163
|
-
```
|
|
133
|
+

|
|
164
134
|
|
|
165
135
|
## Getting Started
|
|
166
136
|
|
|
@@ -273,6 +243,44 @@ modestbench --tags fast --exclude-tags experimental
|
|
|
273
243
|
|
|
274
244
|
See [Tagging and Filtering](#tagging-and-filtering) for detailed examples.
|
|
275
245
|
|
|
246
|
+
#### Output Options
|
|
247
|
+
|
|
248
|
+
Control where and how benchmark results are saved:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# Write to a directory (creates results.json, results.csv, etc.)
|
|
252
|
+
modestbench --reporters json,csv --output ./results
|
|
253
|
+
|
|
254
|
+
# Custom filename for single reporter
|
|
255
|
+
modestbench --reporters json --output-file my-benchmarks.json
|
|
256
|
+
|
|
257
|
+
# Custom filename in specific directory
|
|
258
|
+
modestbench --reporters json --output ./results --output-file benchmarks-2024.json
|
|
259
|
+
|
|
260
|
+
# Custom filename with absolute path
|
|
261
|
+
modestbench --reporters json --output-file /tmp/my-benchmarks.json
|
|
262
|
+
|
|
263
|
+
# With subdirectories
|
|
264
|
+
modestbench --reporters csv --output ./results --output-file reports/performance.csv
|
|
265
|
+
|
|
266
|
+
# Short flag alias
|
|
267
|
+
modestbench --reporters json --of custom.json
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Key Options:**
|
|
271
|
+
|
|
272
|
+
- `--output <dir>`, `-o <dir>` - Directory to write output files (default: stdout)
|
|
273
|
+
- `--output-file <filename>`, `--of <filename>` - Custom filename for output
|
|
274
|
+
- Works with absolute or relative paths
|
|
275
|
+
- Requires exactly one reporter (e.g., `--reporters json`)
|
|
276
|
+
- When used with `--output`, the filename is relative to that directory
|
|
277
|
+
- When used alone, the path is relative to current working directory
|
|
278
|
+
|
|
279
|
+
**Limitations:**
|
|
280
|
+
|
|
281
|
+
- `--output-file` only works with a single reporter
|
|
282
|
+
- For multiple reporters, use `--output <dir>` (defaults to `results.json`, `results.csv`, etc.)
|
|
283
|
+
|
|
276
284
|
### History Management
|
|
277
285
|
|
|
278
286
|
**modestbench** automatically tracks benchmark results over time in a local `.modestbench/` directory. This history enables you to:
|
package/dist/bootstrap.cjs
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.bootstrap = void 0;
|
|
10
|
-
const manager_js_1 = require("./config/manager.cjs");
|
|
11
10
|
const index_js_1 = require("./core/engines/index.cjs");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
11
|
+
const config_manager_js_1 = require("./services/config-manager.cjs");
|
|
12
|
+
const file_loader_js_1 = require("./services/file-loader.cjs");
|
|
13
|
+
const history_storage_js_1 = require("./services/history-storage.cjs");
|
|
14
|
+
const progress_manager_js_1 = require("./services/progress-manager.cjs");
|
|
15
|
+
const reporter_registry_js_1 = require("./services/reporter-registry.cjs");
|
|
16
16
|
/**
|
|
17
17
|
* Initializes the ModestBench engine with default dependencies.
|
|
18
18
|
*
|
|
@@ -23,11 +23,11 @@ const history_js_1 = require("./storage/history.cjs");
|
|
|
23
23
|
*/
|
|
24
24
|
const bootstrap = () => {
|
|
25
25
|
const engine = new index_js_1.TinybenchEngine({
|
|
26
|
-
configManager: new
|
|
27
|
-
fileLoader: new
|
|
28
|
-
historyStorage: new
|
|
29
|
-
progressManager: new
|
|
30
|
-
reporterRegistry: new
|
|
26
|
+
configManager: new config_manager_js_1.ModestBenchConfigurationManager(),
|
|
27
|
+
fileLoader: new file_loader_js_1.BenchmarkFileLoader(),
|
|
28
|
+
historyStorage: new history_storage_js_1.FileHistoryStorage(),
|
|
29
|
+
progressManager: new progress_manager_js_1.ModestBenchProgressManager(),
|
|
30
|
+
reporterRegistry: new reporter_registry_js_1.ModestBenchReporterRegistry(),
|
|
31
31
|
});
|
|
32
32
|
return engine;
|
|
33
33
|
};
|
package/dist/bootstrap.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,uDAA0D;AAC1D,qEAA+E;AAC/E,+DAAgE;AAChE,uEAAmE;AACnE,yEAA4E;AAC5E,2EAA8E;AAE9E;;;;;;;GAOG;AACI,MAAM,SAAS,GAAG,GAAsB,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAI,0BAAe,CAAC;QACjC,aAAa,EAAE,IAAI,mDAA+B,EAAE;QACpD,UAAU,EAAE,IAAI,oCAAmB,EAAE;QACrC,cAAc,EAAE,IAAI,uCAAkB,EAAE;QACxC,eAAe,EAAE,IAAI,gDAA0B,EAAE;QACjD,gBAAgB,EAAE,IAAI,kDAA2B,EAAE;KACpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AATW,QAAA,SAAS,aASpB"}
|
package/dist/bootstrap.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,0BAAyB;AAQ1D;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,QAAO,iBAS5B,CAAC"}
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,yBAAyB;AAQ1D;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,QAAO,iBAS5B,CAAC"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @packageDocumentation
|
|
6
6
|
*/
|
|
7
|
-
import { ModestBenchConfigurationManager } from "./config/manager.js";
|
|
8
7
|
import { TinybenchEngine } from "./core/engines/index.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
8
|
+
import { ModestBenchConfigurationManager } from "./services/config-manager.js";
|
|
9
|
+
import { BenchmarkFileLoader } from "./services/file-loader.js";
|
|
10
|
+
import { FileHistoryStorage } from "./services/history-storage.js";
|
|
11
|
+
import { ModestBenchProgressManager } from "./services/progress-manager.js";
|
|
12
|
+
import { ModestBenchReporterRegistry } from "./services/reporter-registry.js";
|
|
13
13
|
/**
|
|
14
14
|
* Initializes the ModestBench engine with default dependencies.
|
|
15
15
|
*
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,gCAAgC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,qCAAqC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,kCAAkC;AAChE,OAAO,EAAE,kBAAkB,EAAE,sCAAsC;AACnE,OAAO,EAAE,0BAA0B,EAAE,uCAAuC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,wCAAwC;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAsB,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,IAAI,+BAA+B,EAAE;QACpD,UAAU,EAAE,IAAI,mBAAmB,EAAE;QACrC,cAAc,EAAE,IAAI,kBAAkB,EAAE;QACxC,eAAe,EAAE,IAAI,0BAA0B,EAAE;QACjD,gBAAgB,EAAE,IAAI,2BAA2B,EAAE;KACpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -39,40 +39,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const subcommand = options.subcommand;
|
|
51
|
-
switch (subcommand) {
|
|
52
|
-
case 'clean':
|
|
53
|
-
return await handleCleanCommand(context, options);
|
|
54
|
-
case 'compare':
|
|
55
|
-
return await handleCompareCommand(context, options);
|
|
56
|
-
case 'export':
|
|
57
|
-
return await handleExportCommand(context, options);
|
|
58
|
-
case 'list':
|
|
59
|
-
return await handleListCommand(context, options);
|
|
60
|
-
case 'show':
|
|
61
|
-
return await handleShowCommand(context, options);
|
|
62
|
-
case 'trends':
|
|
63
|
-
return await handleTrendsCommand(context, options);
|
|
64
|
-
default:
|
|
65
|
-
console.error(`Unknown history subcommand: ${subcommand || '(none)'}`);
|
|
66
|
-
console.error('Available subcommands: list, show, compare, trends, clean, export');
|
|
67
|
-
return 2; // Config error
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
console.error('History command failed:', error instanceof Error ? error.message : String(error));
|
|
72
|
-
return 2; // Configuration/runtime errors
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
exports.handleHistoryCommand = handleHistoryCommand;
|
|
42
|
+
exports.handleTrendsCommand = exports.handleShowCommand = exports.handleListCommand = exports.handleExportCommand = exports.handleCompareCommand = exports.handleCleanCommand = void 0;
|
|
43
|
+
const compare_js_1 = require("../../formatters/history/compare.cjs");
|
|
44
|
+
const list_js_1 = require("../../formatters/history/list.cjs");
|
|
45
|
+
const show_js_1 = require("../../formatters/history/show.cjs");
|
|
46
|
+
const trends_js_1 = require("../../formatters/history/trends.cjs");
|
|
47
|
+
const comparison_js_1 = require("../../services/history/comparison.cjs");
|
|
48
|
+
const query_js_1 = require("../../services/history/query.cjs");
|
|
49
|
+
const trend_analysis_js_1 = require("../../services/history/trend-analysis.cjs");
|
|
76
50
|
/**
|
|
77
51
|
* Format bytes in human-readable format
|
|
78
52
|
*/
|
|
@@ -86,6 +60,25 @@ const formatBytes = (bytes) => {
|
|
|
86
60
|
}
|
|
87
61
|
return `${size.toFixed(1)} ${units[unitIndex]}`;
|
|
88
62
|
};
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a partial run ID to a full ID by checking prefix match
|
|
65
|
+
*
|
|
66
|
+
* Supports Git-style partial ID matching (e.g., "k3m" matches "k3m9x2p")
|
|
67
|
+
*/
|
|
68
|
+
const resolveRunId = async (storage, partialId) => {
|
|
69
|
+
// First try exact match
|
|
70
|
+
const exactRun = await storage.loadRun(partialId);
|
|
71
|
+
if (exactRun) {
|
|
72
|
+
return partialId;
|
|
73
|
+
}
|
|
74
|
+
// Query all runs to find a prefix match
|
|
75
|
+
const allRuns = await storage.queryRuns({});
|
|
76
|
+
const prefixMatch = allRuns.find((run) => run.id.startsWith(partialId));
|
|
77
|
+
if (prefixMatch) {
|
|
78
|
+
return prefixMatch.id;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
};
|
|
89
82
|
/**
|
|
90
83
|
* Handle the clean subcommand
|
|
91
84
|
*/
|
|
@@ -137,54 +130,33 @@ const handleCleanCommand = async (context, options) => {
|
|
|
137
130
|
return 5;
|
|
138
131
|
}
|
|
139
132
|
};
|
|
133
|
+
exports.handleCleanCommand = handleCleanCommand;
|
|
140
134
|
/**
|
|
141
135
|
* Handle the compare subcommand
|
|
142
136
|
*/
|
|
143
137
|
const handleCompareCommand = async (context, options) => {
|
|
144
138
|
try {
|
|
145
|
-
// For compare command, IDs come from args after the subcommand
|
|
146
|
-
const id1 = options.args?.[0];
|
|
147
|
-
const id2 = options.args?.[1];
|
|
148
|
-
if (!id1 || !id2) {
|
|
149
|
-
console.error('Two run IDs are required for compare command');
|
|
150
|
-
console.error('Usage: modestbench history compare <run-id1> <run-id2>');
|
|
151
|
-
return 2;
|
|
152
|
-
}
|
|
153
139
|
const [run1, run2] = await Promise.all([
|
|
154
|
-
context.historyStorage.loadRun(
|
|
155
|
-
context.historyStorage.loadRun(
|
|
140
|
+
context.historyStorage.loadRun(options.runId1),
|
|
141
|
+
context.historyStorage.loadRun(options.runId2),
|
|
156
142
|
]);
|
|
157
143
|
if (!run1) {
|
|
158
|
-
console.error(`Run not found: ${
|
|
144
|
+
console.error(`Run not found: ${options.runId1}`);
|
|
159
145
|
return 1;
|
|
160
146
|
}
|
|
161
147
|
if (!run2) {
|
|
162
|
-
console.error(`Run not found: ${
|
|
148
|
+
console.error(`Run not found: ${options.runId2}`);
|
|
163
149
|
return 1;
|
|
164
150
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
// Human format comparison
|
|
175
|
-
console.log(`Comparing runs:`);
|
|
176
|
-
console.log(` Run 1: ${run1.id} (${run1.startTime.toLocaleString()})`);
|
|
177
|
-
console.log(` Run 2: ${run2.id} (${run2.startTime.toLocaleString()})`);
|
|
178
|
-
console.log();
|
|
179
|
-
console.log('Summary comparison:');
|
|
180
|
-
console.log(` Files: ${run1.summary.totalFiles} vs ${run2.summary.totalFiles}`);
|
|
181
|
-
console.log(` Tasks: ${run1.summary.totalTasks} vs ${run2.summary.totalTasks}`);
|
|
182
|
-
console.log(` Passed: ${run1.summary.passedTasks} vs ${run2.summary.passedTasks}`);
|
|
183
|
-
console.log(` Failed: ${run1.summary.failedTasks} vs ${run2.summary.failedTasks}`);
|
|
184
|
-
// TODO: Add detailed performance comparison
|
|
185
|
-
console.log();
|
|
186
|
-
console.log('Note: Detailed performance comparison not yet implemented.');
|
|
187
|
-
}
|
|
151
|
+
// Compare using service
|
|
152
|
+
const comparisonService = new comparison_js_1.ComparisonService();
|
|
153
|
+
const result = comparisonService.compareRuns(run1, run2);
|
|
154
|
+
// Format output
|
|
155
|
+
const formatter = new compare_js_1.HistoryCompareFormatter();
|
|
156
|
+
const output = options.format === 'json'
|
|
157
|
+
? formatter.formatJson(result)
|
|
158
|
+
: formatter.formatHuman(result);
|
|
159
|
+
console.log(output);
|
|
188
160
|
return 0;
|
|
189
161
|
}
|
|
190
162
|
catch (error) {
|
|
@@ -192,6 +164,7 @@ const handleCompareCommand = async (context, options) => {
|
|
|
192
164
|
return 5;
|
|
193
165
|
}
|
|
194
166
|
};
|
|
167
|
+
exports.handleCompareCommand = handleCompareCommand;
|
|
195
168
|
/**
|
|
196
169
|
* Handle the export subcommand
|
|
197
170
|
*/
|
|
@@ -200,21 +173,15 @@ const handleExportCommand = async (context, options) => {
|
|
|
200
173
|
const format = options.format || 'json';
|
|
201
174
|
// Build query for export
|
|
202
175
|
const query = {
|
|
203
|
-
...(options.since && { since: parseDate(options.since) }),
|
|
204
|
-
...(options.until && { until: parseDate(options.until) }),
|
|
176
|
+
...(options.since && { since: (0, query_js_1.parseDate)(options.since) }),
|
|
177
|
+
...(options.until && { until: (0, query_js_1.parseDate)(options.until) }),
|
|
205
178
|
};
|
|
206
179
|
const exportData = await context.historyStorage.export(format, query);
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
console.log(`Exported history to ${options.outputDir}`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
// Write to stdout
|
|
217
|
-
console.log(exportData);
|
|
180
|
+
// Write to file
|
|
181
|
+
const fs = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
|
|
182
|
+
await fs.writeFile(options.outputPath, exportData, 'utf8');
|
|
183
|
+
if (!options.quiet) {
|
|
184
|
+
console.log(`Exported history to ${options.outputPath}`);
|
|
218
185
|
}
|
|
219
186
|
return 0;
|
|
220
187
|
}
|
|
@@ -223,89 +190,38 @@ const handleExportCommand = async (context, options) => {
|
|
|
223
190
|
return 5;
|
|
224
191
|
}
|
|
225
192
|
};
|
|
193
|
+
exports.handleExportCommand = handleExportCommand;
|
|
226
194
|
/**
|
|
227
195
|
* Handle the list subcommand
|
|
228
196
|
*/
|
|
229
197
|
const handleListCommand = async (context, options) => {
|
|
230
198
|
try {
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (options.until) {
|
|
244
|
-
try {
|
|
245
|
-
parsedUntil = parseDate(options.until);
|
|
246
|
-
}
|
|
247
|
-
catch (error) {
|
|
248
|
-
console.error('Invalid until date:', error instanceof Error ? error.message : String(error));
|
|
249
|
-
return 2; // Invalid date format
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
const query = {
|
|
253
|
-
...(parsedSince && { since: parsedSince }),
|
|
254
|
-
...(parsedUntil && { until: parsedUntil }),
|
|
255
|
-
...(options.pattern && { pattern: options.pattern }),
|
|
256
|
-
...(options.tags && options.tags.length > 0 && { tags: options.tags }),
|
|
257
|
-
...(options.limit && { limit: options.limit }),
|
|
199
|
+
// Query runs using service
|
|
200
|
+
const queryService = new query_js_1.HistoryQueryService(context.historyStorage);
|
|
201
|
+
const runs = await queryService.queryWithDateParsing(options);
|
|
202
|
+
// Transform to result format
|
|
203
|
+
const result = {
|
|
204
|
+
runs: runs.map((run) => ({
|
|
205
|
+
duration: run.duration,
|
|
206
|
+
id: run.id,
|
|
207
|
+
startTime: run.startTime,
|
|
208
|
+
summary: run.summary,
|
|
209
|
+
})),
|
|
210
|
+
totalCount: runs.length,
|
|
258
211
|
};
|
|
259
|
-
//
|
|
260
|
-
const
|
|
261
|
-
|
|
212
|
+
// Format output
|
|
213
|
+
const formatter = new list_js_1.HistoryListFormatter();
|
|
214
|
+
let output;
|
|
262
215
|
if (options.format === 'json') {
|
|
263
|
-
|
|
264
|
-
console.log('[]'); // Empty JSON array for no data
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
console.log(JSON.stringify(runs.map((run) => ({
|
|
268
|
-
duration: run.duration,
|
|
269
|
-
failed: run.summary.failedTasks,
|
|
270
|
-
files: run.summary.totalFiles,
|
|
271
|
-
id: run.id,
|
|
272
|
-
passed: run.summary.passedTasks,
|
|
273
|
-
startTime: run.startTime,
|
|
274
|
-
tasks: run.summary.totalTasks,
|
|
275
|
-
})), null, 2));
|
|
276
|
-
}
|
|
216
|
+
output = formatter.formatJson(result);
|
|
277
217
|
}
|
|
278
218
|
else if (options.format === 'csv') {
|
|
279
|
-
|
|
280
|
-
if (runs.length > 0) {
|
|
281
|
-
for (const run of runs) {
|
|
282
|
-
console.log(`${run.id},${run.startTime.toISOString()},${run.duration},${run.summary.totalFiles},${run.summary.totalTasks},${run.summary.passedTasks},${run.summary.failedTasks}`);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
// For CSV, no additional message needed - header is sufficient
|
|
219
|
+
output = formatter.formatCsv(result);
|
|
286
220
|
}
|
|
287
221
|
else {
|
|
288
|
-
|
|
289
|
-
if (runs.length === 0) {
|
|
290
|
-
if (!options.quiet) {
|
|
291
|
-
console.log('No historical data found matching criteria.');
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
console.log('Recent benchmark runs:');
|
|
296
|
-
console.log();
|
|
297
|
-
for (const run of runs) {
|
|
298
|
-
const dateStr = run.startTime.toLocaleString();
|
|
299
|
-
const durationStr = `${(run.duration / 1000).toFixed(1)}s`;
|
|
300
|
-
const statusStr = run.summary.failedTasks > 0
|
|
301
|
-
? `${run.summary.passedTasks} passed, ${run.summary.failedTasks} failed`
|
|
302
|
-
: `${run.summary.passedTasks} passed`;
|
|
303
|
-
console.log(` ${run.id.substring(0, 8)} - ${dateStr} (${durationStr})`);
|
|
304
|
-
console.log(` ${run.summary.totalFiles} files, ${run.summary.totalTasks} tasks: ${statusStr}`);
|
|
305
|
-
console.log();
|
|
306
|
-
}
|
|
307
|
-
}
|
|
222
|
+
output = formatter.formatHuman(result);
|
|
308
223
|
}
|
|
224
|
+
console.log(output);
|
|
309
225
|
return 0;
|
|
310
226
|
}
|
|
311
227
|
catch (error) {
|
|
@@ -313,59 +229,29 @@ const handleListCommand = async (context, options) => {
|
|
|
313
229
|
return 5;
|
|
314
230
|
}
|
|
315
231
|
};
|
|
232
|
+
exports.handleListCommand = handleListCommand;
|
|
316
233
|
/**
|
|
317
234
|
* Handle the show subcommand
|
|
318
235
|
*/
|
|
319
236
|
const handleShowCommand = async (context, options) => {
|
|
320
237
|
try {
|
|
321
|
-
//
|
|
322
|
-
const
|
|
323
|
-
if (!
|
|
324
|
-
console.error(
|
|
325
|
-
|
|
326
|
-
return 2;
|
|
238
|
+
// Resolve partial ID to full ID
|
|
239
|
+
const fullRunId = await resolveRunId(context.historyStorage, options.runId);
|
|
240
|
+
if (!fullRunId) {
|
|
241
|
+
console.error(`Run not found: ${options.runId}`);
|
|
242
|
+
return 1;
|
|
327
243
|
}
|
|
328
|
-
const run = await context.historyStorage.loadRun(
|
|
244
|
+
const run = await context.historyStorage.loadRun(fullRunId);
|
|
329
245
|
if (!run) {
|
|
330
|
-
console.error(`Run not found: ${runId}`);
|
|
246
|
+
console.error(`Run not found: ${options.runId}`);
|
|
331
247
|
return 1;
|
|
332
248
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
console.log(`Date: ${run.startTime.toLocaleString()}`);
|
|
340
|
-
console.log(`Duration: ${(run.duration / 1000).toFixed(1)}s`);
|
|
341
|
-
console.log(`Environment: Node.js ${run.environment.nodeVersion} on ${run.environment.platform}`);
|
|
342
|
-
if (run.git) {
|
|
343
|
-
console.log(`Git: ${run.git.branch}@${run.git.commit.substring(0, 8)}`);
|
|
344
|
-
}
|
|
345
|
-
console.log();
|
|
346
|
-
console.log('Summary:');
|
|
347
|
-
console.log(` Files: ${run.summary.totalFiles}`);
|
|
348
|
-
console.log(` Suites: ${run.summary.totalSuites}`);
|
|
349
|
-
console.log(` Tasks: ${run.summary.totalTasks}`);
|
|
350
|
-
console.log(` Passed: ${run.summary.passedTasks}`);
|
|
351
|
-
console.log(` Failed: ${run.summary.failedTasks}`);
|
|
352
|
-
// TODO: Show detailed file/suite/task results
|
|
353
|
-
console.log();
|
|
354
|
-
console.log('Detailed results:');
|
|
355
|
-
for (const file of run.files) {
|
|
356
|
-
console.log(` 📁 ${file.filePath}`);
|
|
357
|
-
for (const suite of file.suites) {
|
|
358
|
-
console.log(` 📊 ${suite.name}`);
|
|
359
|
-
for (const task of suite.tasks) {
|
|
360
|
-
const status = task.error ? '❌' : '✅';
|
|
361
|
-
const timing = task.error
|
|
362
|
-
? 'failed'
|
|
363
|
-
: `${(task.mean / 1000000).toFixed(2)}ms`;
|
|
364
|
-
console.log(` ${status} ${task.name} - ${timing}`);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
}
|
|
249
|
+
// Format output
|
|
250
|
+
const formatter = new show_js_1.HistoryShowFormatter();
|
|
251
|
+
const output = options.format === 'json'
|
|
252
|
+
? formatter.formatJson(run)
|
|
253
|
+
: formatter.formatHuman(run);
|
|
254
|
+
console.log(output);
|
|
369
255
|
return 0;
|
|
370
256
|
}
|
|
371
257
|
catch (error) {
|
|
@@ -373,88 +259,44 @@ const handleShowCommand = async (context, options) => {
|
|
|
373
259
|
return 5;
|
|
374
260
|
}
|
|
375
261
|
};
|
|
262
|
+
exports.handleShowCommand = handleShowCommand;
|
|
376
263
|
/**
|
|
377
264
|
* Handle the trends subcommand
|
|
378
265
|
*/
|
|
379
266
|
const handleTrendsCommand = async (context, options) => {
|
|
380
267
|
try {
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
return 2; // Invalid date format
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
if (options.until) {
|
|
394
|
-
try {
|
|
395
|
-
parsedUntil = parseDate(options.until);
|
|
396
|
-
}
|
|
397
|
-
catch (error) {
|
|
398
|
-
console.error('Invalid until date:', error instanceof Error ? error.message : String(error));
|
|
399
|
-
return 2; // Invalid date format
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
// Get pattern from args or explicit pattern option
|
|
403
|
-
const pattern = options.args?.[0] || options.pattern;
|
|
404
|
-
const query = {
|
|
405
|
-
...(parsedSince && { since: parsedSince }),
|
|
406
|
-
...(parsedUntil && { until: parsedUntil }),
|
|
407
|
-
...(pattern && { pattern }),
|
|
408
|
-
...(options.tags && options.tags.length > 0 && { tags: options.tags }),
|
|
409
|
-
...(options.limit && { limit: options.limit }),
|
|
410
|
-
};
|
|
411
|
-
// Query historical runs
|
|
412
|
-
const runs = await context.historyStorage.queryRuns(query);
|
|
268
|
+
// Query runs using service
|
|
269
|
+
const queryService = new query_js_1.HistoryQueryService(context.historyStorage);
|
|
270
|
+
const runs = await queryService.queryWithDateParsing({
|
|
271
|
+
limit: options.all ? undefined : options.limit,
|
|
272
|
+
pattern: options.pattern,
|
|
273
|
+
since: options.since,
|
|
274
|
+
tags: options.tags,
|
|
275
|
+
until: options.until,
|
|
276
|
+
});
|
|
413
277
|
if (runs.length === 0) {
|
|
414
278
|
if (!options.quiet) {
|
|
415
279
|
console.log('No historical data found matching criteria');
|
|
416
280
|
}
|
|
417
|
-
return 0;
|
|
418
|
-
}
|
|
419
|
-
if (options.format === 'json') {
|
|
420
|
-
// TODO: Generate trends data in JSON format
|
|
421
|
-
const trendsData = {
|
|
422
|
-
runs: runs.length,
|
|
423
|
-
timespan: {
|
|
424
|
-
end: runs[0]?.startTime,
|
|
425
|
-
start: runs[runs.length - 1]?.startTime,
|
|
426
|
-
},
|
|
427
|
-
// TODO: Add actual trend calculations
|
|
428
|
-
};
|
|
429
|
-
console.log(JSON.stringify(trendsData, null, 2));
|
|
281
|
+
return 0;
|
|
430
282
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
283
|
+
// Analyze trends using service
|
|
284
|
+
const analysisService = new trend_analysis_js_1.TrendAnalysisService();
|
|
285
|
+
const result = analysisService.analyzeTrends(runs);
|
|
286
|
+
// Format output
|
|
287
|
+
const formatter = new trends_js_1.HistoryTrendsFormatter();
|
|
288
|
+
const output = options.format === 'json'
|
|
289
|
+
? formatter.formatJson(result)
|
|
290
|
+
: formatter.formatHuman(result);
|
|
291
|
+
if (!options.quiet || options.format !== 'human') {
|
|
292
|
+
console.log(output);
|
|
439
293
|
}
|
|
440
|
-
return 0;
|
|
294
|
+
return 0;
|
|
441
295
|
}
|
|
442
296
|
catch (error) {
|
|
443
|
-
console.error('
|
|
444
|
-
return
|
|
445
|
-
}
|
|
446
|
-
};
|
|
447
|
-
/**
|
|
448
|
-
* Parse date string (ISO 8601 or relative)
|
|
449
|
-
*/
|
|
450
|
-
const parseDate = (dateStr) => {
|
|
451
|
-
// Try parsing as ISO 8601 first
|
|
452
|
-
const isoDate = new Date(dateStr);
|
|
453
|
-
if (!isNaN(isoDate.getTime())) {
|
|
454
|
-
return isoDate;
|
|
297
|
+
console.error('Failed to show trends:', error instanceof Error ? error.message : String(error));
|
|
298
|
+
return 5;
|
|
455
299
|
}
|
|
456
|
-
// TODO: Parse relative dates like "1 week ago", "3 days ago", etc.
|
|
457
|
-
// For now, throw error for invalid dates
|
|
458
|
-
throw new index_js_1.InvalidDateFormatError(`Invalid date format: "${dateStr}"`);
|
|
459
300
|
};
|
|
301
|
+
exports.handleTrendsCommand = handleTrendsCommand;
|
|
460
302
|
//# sourceMappingURL=history.js.map
|