@backtest-kit/cli 13.4.0 → 13.6.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/README.md +21 -1
- package/build/index.cjs +52 -19
- package/build/index.mjs +52 -19
- package/docker/package.json +6 -6
- package/package.json +17 -14
- package/template/project/package.mustache +5 -5
- package/types.d.ts +2 -2
package/README.md
CHANGED
|
@@ -954,7 +954,27 @@ export default {
|
|
|
954
954
|
};
|
|
955
955
|
```
|
|
956
956
|
|
|
957
|
-
|
|
957
|
+
Alias config may export an **async factory** instead of a plain mapping. The CLI `await`s it before any strategy code runs, so you can resolve ESM modules dynamically and hand the live bindings to the alias table:
|
|
958
|
+
|
|
959
|
+
```ts
|
|
960
|
+
// config/alias.config.ts — async factory (default export)
|
|
961
|
+
export default async () => ({
|
|
962
|
+
// `nanoid` is ESM-only — `require("nanoid")` would throw,
|
|
963
|
+
// so pull it in with a dynamic import and alias it.
|
|
964
|
+
nanoid: await import("nanoid"),
|
|
965
|
+
});
|
|
966
|
+
```
|
|
967
|
+
|
|
968
|
+
```ts
|
|
969
|
+
// config/alias.config.ts — async factory (named `loader` export)
|
|
970
|
+
export const loader = async () => ({
|
|
971
|
+
"p-limit": await import("p-limit"),
|
|
972
|
+
});
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
Both export styles are supported — `export default` and `export const loader` — but **never both at once**; if both are present the `default` export wins. The factory must resolve to the same `{ moduleName: replacement }` shape as the object form. The CLI awaits it before loading the first strategy module, so strategy code keeps calling a plain `require("nanoid")` and transparently gets the ESM binding.
|
|
976
|
+
|
|
977
|
+
When strategy code calls `require("ccxt")`, the loader checks `IMPORT_ALIAS` first. If a key matches, the mapped value is returned instead of the real module — no monkey-patching of `node_modules` needed.
|
|
958
978
|
|
|
959
979
|
**Important:** It is **not** per-strategy — it applies to all modules loaded in the current process.
|
|
960
980
|
|
package/build/index.cjs
CHANGED
|
@@ -10,7 +10,6 @@ var fs$1 = require('fs/promises');
|
|
|
10
10
|
var dotenv = require('dotenv');
|
|
11
11
|
var diKit = require('di-kit');
|
|
12
12
|
var url = require('url');
|
|
13
|
-
var ccxt = require('ccxt');
|
|
14
13
|
var util = require('util');
|
|
15
14
|
var child_process = require('child_process');
|
|
16
15
|
var BacktestKitUi = require('@backtest-kit/ui');
|
|
@@ -440,7 +439,7 @@ class ResolveService {
|
|
|
440
439
|
const cwd = process.cwd();
|
|
441
440
|
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
442
441
|
}
|
|
443
|
-
this.loaderService.import(absolutePath, moduleRoot);
|
|
442
|
+
await this.loaderService.import(absolutePath, moduleRoot);
|
|
444
443
|
};
|
|
445
444
|
this.attachJavascript = async (jsPath) => {
|
|
446
445
|
this.loggerService.log("resolveService attachJavascript", {
|
|
@@ -458,7 +457,7 @@ class ResolveService {
|
|
|
458
457
|
cwd !== moduleRoot && Setup.update();
|
|
459
458
|
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
460
459
|
dotenv.config({ path: path.join(moduleRoot, '.env'), override: true, quiet: true });
|
|
461
|
-
this.loaderService.import(absolutePath);
|
|
460
|
+
await this.loaderService.import(absolutePath);
|
|
462
461
|
}
|
|
463
462
|
_is_launched = true;
|
|
464
463
|
return absolutePath;
|
|
@@ -475,7 +474,7 @@ class ResolveService {
|
|
|
475
474
|
await fs$1.access(absolutePath, fs.constants.F_OK | fs.constants.R_OK);
|
|
476
475
|
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
477
476
|
{
|
|
478
|
-
this.loaderService.import(absolutePath);
|
|
477
|
+
await this.loaderService.import(absolutePath);
|
|
479
478
|
}
|
|
480
479
|
_is_launched = true;
|
|
481
480
|
return absolutePath;
|
|
@@ -484,6 +483,7 @@ class ResolveService {
|
|
|
484
483
|
}
|
|
485
484
|
|
|
486
485
|
const getExchange = functoolsKit.singleshot(async () => {
|
|
486
|
+
const ccxt = await import('ccxt');
|
|
487
487
|
const exchange = new ccxt.binance({
|
|
488
488
|
options: {
|
|
489
489
|
defaultType: "spot",
|
|
@@ -2748,7 +2748,7 @@ const LOAD_MODULE_MODULE_FN = async (fileName, self) => {
|
|
|
2748
2748
|
for (const { filePath, baseDir } of GET_MODULE_VARIANTS_FN(fileName, self)) {
|
|
2749
2749
|
try {
|
|
2750
2750
|
if (await self.loaderService.check(filePath, baseDir)) {
|
|
2751
|
-
self.loaderService.import(filePath, baseDir);
|
|
2751
|
+
await self.loaderService.import(filePath, baseDir);
|
|
2752
2752
|
return true;
|
|
2753
2753
|
}
|
|
2754
2754
|
}
|
|
@@ -3123,12 +3123,23 @@ const GET_ALIAS_VARIANTS_FN = (self) => {
|
|
|
3123
3123
|
});
|
|
3124
3124
|
return result;
|
|
3125
3125
|
};
|
|
3126
|
+
const ESM_IMPORT_FN = functoolsKit.trycatch(async (name) => {
|
|
3127
|
+
const alias = await import(name);
|
|
3128
|
+
{
|
|
3129
|
+
overrideModule(name, alias);
|
|
3130
|
+
Object.assign(IMPORT_ALIAS, { [name]: alias });
|
|
3131
|
+
}
|
|
3132
|
+
}, {
|
|
3133
|
+
fallback: (error, name) => {
|
|
3134
|
+
console.error(`Import failed for ${name}`, error);
|
|
3135
|
+
}
|
|
3136
|
+
});
|
|
3126
3137
|
const GET_ALIAS_EXPORTS_FN = (self) => {
|
|
3127
3138
|
for (const { filePath, baseDir } of GET_ALIAS_VARIANTS_FN(self)) {
|
|
3128
3139
|
if (!fs.existsSync(filePath)) {
|
|
3129
3140
|
continue;
|
|
3130
3141
|
}
|
|
3131
|
-
const instance = self.
|
|
3142
|
+
const instance = self._getInstance(baseDir);
|
|
3132
3143
|
const alias = instance.import(filePath);
|
|
3133
3144
|
if (!alias) {
|
|
3134
3145
|
return null;
|
|
@@ -3140,17 +3151,38 @@ const GET_ALIAS_EXPORTS_FN = (self) => {
|
|
|
3140
3151
|
}
|
|
3141
3152
|
return null;
|
|
3142
3153
|
};
|
|
3143
|
-
const INIT_ALIAS_FN = functoolsKit.singleshot((self) => {
|
|
3154
|
+
const INIT_ALIAS_FN = functoolsKit.singleshot(async (self) => {
|
|
3155
|
+
{
|
|
3156
|
+
await ESM_IMPORT_FN("ccxt");
|
|
3157
|
+
await ESM_IMPORT_FN("pinets");
|
|
3158
|
+
}
|
|
3144
3159
|
const alias = GET_ALIAS_EXPORTS_FN(self);
|
|
3145
3160
|
if (!alias) {
|
|
3146
3161
|
return;
|
|
3147
3162
|
}
|
|
3148
|
-
|
|
3163
|
+
let moduleMap;
|
|
3164
|
+
try {
|
|
3165
|
+
if (functoolsKit.isObject(alias)) {
|
|
3166
|
+
moduleMap = alias;
|
|
3167
|
+
}
|
|
3168
|
+
else if (typeof alias === "function") {
|
|
3169
|
+
moduleMap = await alias();
|
|
3170
|
+
}
|
|
3171
|
+
else if (typeof alias?.loader === "function") {
|
|
3172
|
+
moduleMap = await alias.loader();
|
|
3173
|
+
}
|
|
3174
|
+
}
|
|
3175
|
+
catch (error) {
|
|
3176
|
+
console.error("Alias loader failed", error);
|
|
3177
|
+
kill(-1);
|
|
3178
|
+
return;
|
|
3179
|
+
}
|
|
3180
|
+
if (!functoolsKit.isObject(moduleMap)) {
|
|
3149
3181
|
return;
|
|
3150
3182
|
}
|
|
3151
3183
|
{
|
|
3152
|
-
Object.entries(
|
|
3153
|
-
Object.assign(IMPORT_ALIAS,
|
|
3184
|
+
Object.entries(moduleMap).forEach(([name, module]) => overrideModule(name, module));
|
|
3185
|
+
Object.assign(IMPORT_ALIAS, moduleMap);
|
|
3154
3186
|
}
|
|
3155
3187
|
});
|
|
3156
3188
|
class LoaderService {
|
|
@@ -3158,8 +3190,7 @@ class LoaderService {
|
|
|
3158
3190
|
this.babelService = inject(TYPES.babelService);
|
|
3159
3191
|
this.loggerService = inject(TYPES.loggerService);
|
|
3160
3192
|
this.resolveService = inject(TYPES.resolveService);
|
|
3161
|
-
this.
|
|
3162
|
-
INIT_ALIAS_FN(this);
|
|
3193
|
+
this._getInstance = functoolsKit.memoize(([basePath]) => `${basePath}`, (basePath) => {
|
|
3163
3194
|
return new ClientLoader({
|
|
3164
3195
|
babel: this.babelService,
|
|
3165
3196
|
logger: this.loggerService,
|
|
@@ -3167,12 +3198,13 @@ class LoaderService {
|
|
|
3167
3198
|
path: basePath,
|
|
3168
3199
|
});
|
|
3169
3200
|
});
|
|
3170
|
-
this.import = (filePath, basePath = process.cwd()) => {
|
|
3201
|
+
this.import = async (filePath, basePath = process.cwd()) => {
|
|
3171
3202
|
this.loggerService.log("loaderService import", {
|
|
3172
3203
|
filePath,
|
|
3173
3204
|
basePath,
|
|
3174
3205
|
});
|
|
3175
|
-
const instance = this.
|
|
3206
|
+
const instance = this._getInstance(basePath);
|
|
3207
|
+
await INIT_ALIAS_FN(this);
|
|
3176
3208
|
return instance.import(filePath);
|
|
3177
3209
|
};
|
|
3178
3210
|
this.check = async (filePath, basePath = process.cwd()) => {
|
|
@@ -3180,7 +3212,8 @@ class LoaderService {
|
|
|
3180
3212
|
filePath,
|
|
3181
3213
|
basePath,
|
|
3182
3214
|
});
|
|
3183
|
-
const instance = this.
|
|
3215
|
+
const instance = this._getInstance(basePath);
|
|
3216
|
+
await INIT_ALIAS_FN(this);
|
|
3184
3217
|
return instance.check(filePath);
|
|
3185
3218
|
};
|
|
3186
3219
|
}
|
|
@@ -3206,7 +3239,7 @@ const LOAD_CONFIG_CONFIG_FN = async (fileName, self) => {
|
|
|
3206
3239
|
for (const { filePath, baseDir } of GET_CONFIG_VARIANTS_FN(fileName, self)) {
|
|
3207
3240
|
try {
|
|
3208
3241
|
if (await self.loaderService.check(filePath, baseDir)) {
|
|
3209
|
-
return self.loaderService.import(filePath, baseDir);
|
|
3242
|
+
return await self.loaderService.import(filePath, baseDir);
|
|
3210
3243
|
}
|
|
3211
3244
|
}
|
|
3212
3245
|
catch {
|
|
@@ -3397,7 +3430,7 @@ const main$h = async () => {
|
|
|
3397
3430
|
if (MODES.some((mode) => values[mode])) {
|
|
3398
3431
|
return;
|
|
3399
3432
|
}
|
|
3400
|
-
process.stdout.write(`@backtest-kit/cli ${"13.
|
|
3433
|
+
process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
|
|
3401
3434
|
process.stdout.write("\n");
|
|
3402
3435
|
process.stdout.write(`Run with --help to see available commands.\n`);
|
|
3403
3436
|
process.stdout.write("\n");
|
|
@@ -4703,7 +4736,7 @@ const main$1 = async () => {
|
|
|
4703
4736
|
if (!values.help) {
|
|
4704
4737
|
return;
|
|
4705
4738
|
}
|
|
4706
|
-
process.stdout.write(`@backtest-kit/cli ${"13.
|
|
4739
|
+
process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n\n`);
|
|
4707
4740
|
process.stdout.write(HELP_TEXT);
|
|
4708
4741
|
process.exit(0);
|
|
4709
4742
|
};
|
|
@@ -4717,7 +4750,7 @@ const main = async () => {
|
|
|
4717
4750
|
if (!values.version) {
|
|
4718
4751
|
return;
|
|
4719
4752
|
}
|
|
4720
|
-
process.stdout.write(`@backtest-kit/cli ${"13.
|
|
4753
|
+
process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
|
|
4721
4754
|
process.exit(0);
|
|
4722
4755
|
};
|
|
4723
4756
|
main();
|
package/build/index.mjs
CHANGED
|
@@ -9,7 +9,6 @@ import fs$1, { access, readFile, mkdir, writeFile, rm, readdir, copyFile } from
|
|
|
9
9
|
import dotenv from 'dotenv';
|
|
10
10
|
import { createActivator } from 'di-kit';
|
|
11
11
|
import { fileURLToPath } from 'url';
|
|
12
|
-
import ccxt from 'ccxt';
|
|
13
12
|
import { parseArgs } from 'util';
|
|
14
13
|
import { exec, spawn } from 'child_process';
|
|
15
14
|
import * as BacktestKitUi from '@backtest-kit/ui';
|
|
@@ -415,7 +414,7 @@ class ResolveService {
|
|
|
415
414
|
const cwd = process.cwd();
|
|
416
415
|
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
417
416
|
}
|
|
418
|
-
this.loaderService.import(absolutePath, moduleRoot);
|
|
417
|
+
await this.loaderService.import(absolutePath, moduleRoot);
|
|
419
418
|
};
|
|
420
419
|
this.attachJavascript = async (jsPath) => {
|
|
421
420
|
this.loggerService.log("resolveService attachJavascript", {
|
|
@@ -433,7 +432,7 @@ class ResolveService {
|
|
|
433
432
|
cwd !== moduleRoot && Setup.update();
|
|
434
433
|
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
435
434
|
dotenv.config({ path: path.join(moduleRoot, '.env'), override: true, quiet: true });
|
|
436
|
-
this.loaderService.import(absolutePath);
|
|
435
|
+
await this.loaderService.import(absolutePath);
|
|
437
436
|
}
|
|
438
437
|
_is_launched = true;
|
|
439
438
|
return absolutePath;
|
|
@@ -450,7 +449,7 @@ class ResolveService {
|
|
|
450
449
|
await access(absolutePath, constants.F_OK | constants.R_OK);
|
|
451
450
|
dotenv.config({ path: path.join(cwd, '.env'), override: true, quiet: true });
|
|
452
451
|
{
|
|
453
|
-
this.loaderService.import(absolutePath);
|
|
452
|
+
await this.loaderService.import(absolutePath);
|
|
454
453
|
}
|
|
455
454
|
_is_launched = true;
|
|
456
455
|
return absolutePath;
|
|
@@ -459,6 +458,7 @@ class ResolveService {
|
|
|
459
458
|
}
|
|
460
459
|
|
|
461
460
|
const getExchange = singleshot(async () => {
|
|
461
|
+
const ccxt = await import('ccxt');
|
|
462
462
|
const exchange = new ccxt.binance({
|
|
463
463
|
options: {
|
|
464
464
|
defaultType: "spot",
|
|
@@ -2723,7 +2723,7 @@ const LOAD_MODULE_MODULE_FN = async (fileName, self) => {
|
|
|
2723
2723
|
for (const { filePath, baseDir } of GET_MODULE_VARIANTS_FN(fileName, self)) {
|
|
2724
2724
|
try {
|
|
2725
2725
|
if (await self.loaderService.check(filePath, baseDir)) {
|
|
2726
|
-
self.loaderService.import(filePath, baseDir);
|
|
2726
|
+
await self.loaderService.import(filePath, baseDir);
|
|
2727
2727
|
return true;
|
|
2728
2728
|
}
|
|
2729
2729
|
}
|
|
@@ -3094,12 +3094,23 @@ const GET_ALIAS_VARIANTS_FN = (self) => {
|
|
|
3094
3094
|
});
|
|
3095
3095
|
return result;
|
|
3096
3096
|
};
|
|
3097
|
+
const ESM_IMPORT_FN = trycatch(async (name) => {
|
|
3098
|
+
const alias = await import(name);
|
|
3099
|
+
{
|
|
3100
|
+
overrideModule(name, alias);
|
|
3101
|
+
Object.assign(IMPORT_ALIAS, { [name]: alias });
|
|
3102
|
+
}
|
|
3103
|
+
}, {
|
|
3104
|
+
fallback: (error, name) => {
|
|
3105
|
+
console.error(`Import failed for ${name}`, error);
|
|
3106
|
+
}
|
|
3107
|
+
});
|
|
3097
3108
|
const GET_ALIAS_EXPORTS_FN = (self) => {
|
|
3098
3109
|
for (const { filePath, baseDir } of GET_ALIAS_VARIANTS_FN(self)) {
|
|
3099
3110
|
if (!fs.existsSync(filePath)) {
|
|
3100
3111
|
continue;
|
|
3101
3112
|
}
|
|
3102
|
-
const instance = self.
|
|
3113
|
+
const instance = self._getInstance(baseDir);
|
|
3103
3114
|
const alias = instance.import(filePath);
|
|
3104
3115
|
if (!alias) {
|
|
3105
3116
|
return null;
|
|
@@ -3111,17 +3122,38 @@ const GET_ALIAS_EXPORTS_FN = (self) => {
|
|
|
3111
3122
|
}
|
|
3112
3123
|
return null;
|
|
3113
3124
|
};
|
|
3114
|
-
const INIT_ALIAS_FN = singleshot((self) => {
|
|
3125
|
+
const INIT_ALIAS_FN = singleshot(async (self) => {
|
|
3126
|
+
{
|
|
3127
|
+
await ESM_IMPORT_FN("ccxt");
|
|
3128
|
+
await ESM_IMPORT_FN("pinets");
|
|
3129
|
+
}
|
|
3115
3130
|
const alias = GET_ALIAS_EXPORTS_FN(self);
|
|
3116
3131
|
if (!alias) {
|
|
3117
3132
|
return;
|
|
3118
3133
|
}
|
|
3119
|
-
|
|
3134
|
+
let moduleMap;
|
|
3135
|
+
try {
|
|
3136
|
+
if (isObject(alias)) {
|
|
3137
|
+
moduleMap = alias;
|
|
3138
|
+
}
|
|
3139
|
+
else if (typeof alias === "function") {
|
|
3140
|
+
moduleMap = await alias();
|
|
3141
|
+
}
|
|
3142
|
+
else if (typeof alias?.loader === "function") {
|
|
3143
|
+
moduleMap = await alias.loader();
|
|
3144
|
+
}
|
|
3145
|
+
}
|
|
3146
|
+
catch (error) {
|
|
3147
|
+
console.error("Alias loader failed", error);
|
|
3148
|
+
kill(-1);
|
|
3149
|
+
return;
|
|
3150
|
+
}
|
|
3151
|
+
if (!isObject(moduleMap)) {
|
|
3120
3152
|
return;
|
|
3121
3153
|
}
|
|
3122
3154
|
{
|
|
3123
|
-
Object.entries(
|
|
3124
|
-
Object.assign(IMPORT_ALIAS,
|
|
3155
|
+
Object.entries(moduleMap).forEach(([name, module]) => overrideModule(name, module));
|
|
3156
|
+
Object.assign(IMPORT_ALIAS, moduleMap);
|
|
3125
3157
|
}
|
|
3126
3158
|
});
|
|
3127
3159
|
class LoaderService {
|
|
@@ -3129,8 +3161,7 @@ class LoaderService {
|
|
|
3129
3161
|
this.babelService = inject(TYPES.babelService);
|
|
3130
3162
|
this.loggerService = inject(TYPES.loggerService);
|
|
3131
3163
|
this.resolveService = inject(TYPES.resolveService);
|
|
3132
|
-
this.
|
|
3133
|
-
INIT_ALIAS_FN(this);
|
|
3164
|
+
this._getInstance = memoize(([basePath]) => `${basePath}`, (basePath) => {
|
|
3134
3165
|
return new ClientLoader({
|
|
3135
3166
|
babel: this.babelService,
|
|
3136
3167
|
logger: this.loggerService,
|
|
@@ -3138,12 +3169,13 @@ class LoaderService {
|
|
|
3138
3169
|
path: basePath,
|
|
3139
3170
|
});
|
|
3140
3171
|
});
|
|
3141
|
-
this.import = (filePath, basePath = process.cwd()) => {
|
|
3172
|
+
this.import = async (filePath, basePath = process.cwd()) => {
|
|
3142
3173
|
this.loggerService.log("loaderService import", {
|
|
3143
3174
|
filePath,
|
|
3144
3175
|
basePath,
|
|
3145
3176
|
});
|
|
3146
|
-
const instance = this.
|
|
3177
|
+
const instance = this._getInstance(basePath);
|
|
3178
|
+
await INIT_ALIAS_FN(this);
|
|
3147
3179
|
return instance.import(filePath);
|
|
3148
3180
|
};
|
|
3149
3181
|
this.check = async (filePath, basePath = process.cwd()) => {
|
|
@@ -3151,7 +3183,8 @@ class LoaderService {
|
|
|
3151
3183
|
filePath,
|
|
3152
3184
|
basePath,
|
|
3153
3185
|
});
|
|
3154
|
-
const instance = this.
|
|
3186
|
+
const instance = this._getInstance(basePath);
|
|
3187
|
+
await INIT_ALIAS_FN(this);
|
|
3155
3188
|
return instance.check(filePath);
|
|
3156
3189
|
};
|
|
3157
3190
|
}
|
|
@@ -3177,7 +3210,7 @@ const LOAD_CONFIG_CONFIG_FN = async (fileName, self) => {
|
|
|
3177
3210
|
for (const { filePath, baseDir } of GET_CONFIG_VARIANTS_FN(fileName, self)) {
|
|
3178
3211
|
try {
|
|
3179
3212
|
if (await self.loaderService.check(filePath, baseDir)) {
|
|
3180
|
-
return self.loaderService.import(filePath, baseDir);
|
|
3213
|
+
return await self.loaderService.import(filePath, baseDir);
|
|
3181
3214
|
}
|
|
3182
3215
|
}
|
|
3183
3216
|
catch {
|
|
@@ -3368,7 +3401,7 @@ const main$h = async () => {
|
|
|
3368
3401
|
if (MODES.some((mode) => values[mode])) {
|
|
3369
3402
|
return;
|
|
3370
3403
|
}
|
|
3371
|
-
process.stdout.write(`@backtest-kit/cli ${"13.
|
|
3404
|
+
process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
|
|
3372
3405
|
process.stdout.write("\n");
|
|
3373
3406
|
process.stdout.write(`Run with --help to see available commands.\n`);
|
|
3374
3407
|
process.stdout.write("\n");
|
|
@@ -4674,7 +4707,7 @@ const main$1 = async () => {
|
|
|
4674
4707
|
if (!values.help) {
|
|
4675
4708
|
return;
|
|
4676
4709
|
}
|
|
4677
|
-
process.stdout.write(`@backtest-kit/cli ${"13.
|
|
4710
|
+
process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n\n`);
|
|
4678
4711
|
process.stdout.write(HELP_TEXT);
|
|
4679
4712
|
process.exit(0);
|
|
4680
4713
|
};
|
|
@@ -4688,7 +4721,7 @@ const main = async () => {
|
|
|
4688
4721
|
if (!values.version) {
|
|
4689
4722
|
return;
|
|
4690
4723
|
}
|
|
4691
|
-
process.stdout.write(`@backtest-kit/cli ${"13.
|
|
4724
|
+
process.stdout.write(`@backtest-kit/cli ${"13.5.0"}\n`);
|
|
4692
4725
|
process.exit(0);
|
|
4693
4726
|
};
|
|
4694
4727
|
main();
|
package/docker/package.json
CHANGED
|
@@ -15,17 +15,17 @@
|
|
|
15
15
|
"@types/node": "25.6.0"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@backtest-kit/cli": "13.
|
|
19
|
-
"@backtest-kit/graph": "13.
|
|
20
|
-
"@backtest-kit/pinets": "13.
|
|
21
|
-
"@backtest-kit/signals": "13.
|
|
22
|
-
"@backtest-kit/ui": "13.
|
|
18
|
+
"@backtest-kit/cli": "13.6.0",
|
|
19
|
+
"@backtest-kit/graph": "13.6.0",
|
|
20
|
+
"@backtest-kit/pinets": "13.6.0",
|
|
21
|
+
"@backtest-kit/signals": "13.6.0",
|
|
22
|
+
"@backtest-kit/ui": "13.6.0",
|
|
23
23
|
"@tavily/core": "0.7.2",
|
|
24
24
|
"@tensorflow/tfjs": "4.22.0",
|
|
25
25
|
"@tensorflow/tfjs-backend-wasm": "4.22.0",
|
|
26
26
|
"@tensorflow/tfjs-core": "4.22.0",
|
|
27
27
|
"agent-swarm-kit": "2.7.0",
|
|
28
|
-
"backtest-kit": "13.
|
|
28
|
+
"backtest-kit": "13.6.0",
|
|
29
29
|
"dayjs": "1.11.20",
|
|
30
30
|
"functools-kit": "2.3.0",
|
|
31
31
|
"garch": "1.2.3",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backtest-kit/cli",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.6.0",
|
|
4
4
|
"description": "Zero-boilerplate CLI runner for backtest-kit strategies. Run backtests, paper trading, and live bots with candle cache warming, web dashboard, and Telegram notifications — no setup code required.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Petr Tripolsky",
|
|
@@ -63,11 +63,11 @@
|
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@babel/plugin-transform-modules-umd": "7.27.1",
|
|
65
65
|
"@babel/standalone": "7.29.1",
|
|
66
|
-
"@backtest-kit/graph": "13.
|
|
67
|
-
"@backtest-kit/ollama": "13.
|
|
68
|
-
"@backtest-kit/pinets": "13.
|
|
69
|
-
"@backtest-kit/signals": "13.
|
|
70
|
-
"@backtest-kit/ui": "13.
|
|
66
|
+
"@backtest-kit/graph": "13.6.0",
|
|
67
|
+
"@backtest-kit/ollama": "13.6.0",
|
|
68
|
+
"@backtest-kit/pinets": "13.6.0",
|
|
69
|
+
"@backtest-kit/signals": "13.6.0",
|
|
70
|
+
"@backtest-kit/ui": "13.6.0",
|
|
71
71
|
"@rollup/plugin-replace": "6.0.3",
|
|
72
72
|
"@rollup/plugin-typescript": "11.1.6",
|
|
73
73
|
"@types/image-size": "0.7.0",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"@types/mustache": "4.2.6",
|
|
76
76
|
"@types/node": "22.9.0",
|
|
77
77
|
"@types/stack-trace": "0.0.33",
|
|
78
|
-
"backtest-kit": "13.
|
|
78
|
+
"backtest-kit": "13.6.0",
|
|
79
79
|
"glob": "11.0.1",
|
|
80
80
|
"markdown-it": "14.1.1",
|
|
81
81
|
"rimraf": "6.0.1",
|
|
@@ -85,22 +85,25 @@
|
|
|
85
85
|
"ts-morph": "27.0.2",
|
|
86
86
|
"tslib": "2.7.0",
|
|
87
87
|
"typedoc": "0.27.9",
|
|
88
|
+
"pinets": "0.9.23",
|
|
89
|
+
"ccxt": "4.5.39",
|
|
88
90
|
"worker-testbed": "2.0.0"
|
|
89
91
|
},
|
|
90
92
|
"peerDependencies": {
|
|
91
93
|
"@babel/plugin-transform-modules-umd": "^7.27.1",
|
|
92
94
|
"@babel/standalone": "^7.29.1",
|
|
93
|
-
"@backtest-kit/graph": "^13.
|
|
94
|
-
"@backtest-kit/ollama": "^13.
|
|
95
|
-
"@backtest-kit/pinets": "^13.
|
|
96
|
-
"@backtest-kit/signals": "^13.
|
|
97
|
-
"@backtest-kit/ui": "^13.
|
|
98
|
-
"
|
|
95
|
+
"@backtest-kit/graph": "^13.6.0",
|
|
96
|
+
"@backtest-kit/ollama": "^13.6.0",
|
|
97
|
+
"@backtest-kit/pinets": "^13.6.0",
|
|
98
|
+
"@backtest-kit/signals": "^13.6.0",
|
|
99
|
+
"@backtest-kit/ui": "^13.6.0",
|
|
100
|
+
"pinets": "^0.9.23",
|
|
101
|
+
"ccxt": "^4.5.39",
|
|
102
|
+
"backtest-kit": "^13.6.0",
|
|
99
103
|
"markdown-it": "^14.1.1",
|
|
100
104
|
"typescript": "^5.0.0"
|
|
101
105
|
},
|
|
102
106
|
"dependencies": {
|
|
103
|
-
"ccxt": "4.5.39",
|
|
104
107
|
"di-kit": "1.1.1",
|
|
105
108
|
"di-scoped": "1.0.21",
|
|
106
109
|
"dotenv": "17.3.1",
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"license": "ISC",
|
|
14
14
|
"type": "commonjs",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@backtest-kit/cli": "^13.
|
|
17
|
-
"@backtest-kit/graph": "^13.
|
|
18
|
-
"@backtest-kit/pinets": "^13.
|
|
19
|
-
"@backtest-kit/ui": "^13.
|
|
16
|
+
"@backtest-kit/cli": "^13.6.0",
|
|
17
|
+
"@backtest-kit/graph": "^13.6.0",
|
|
18
|
+
"@backtest-kit/pinets": "^13.6.0",
|
|
19
|
+
"@backtest-kit/ui": "^13.6.0",
|
|
20
20
|
"agent-swarm-kit": "^2.7.0",
|
|
21
|
-
"backtest-kit": "^13.
|
|
21
|
+
"backtest-kit": "^13.6.0",
|
|
22
22
|
"functools-kit": "^2.3.0",
|
|
23
23
|
"garch": "^1.2.3",
|
|
24
24
|
"get-moment-stamp": "^2.0.0",
|
package/types.d.ts
CHANGED
|
@@ -206,8 +206,8 @@ declare class LoaderService {
|
|
|
206
206
|
readonly babelService: BabelService;
|
|
207
207
|
readonly loggerService: LoggerService;
|
|
208
208
|
readonly resolveService: ResolveService;
|
|
209
|
-
|
|
210
|
-
import: (filePath: string, basePath?: string) => any
|
|
209
|
+
_getInstance: ((basePath: string) => ClientLoader) & functools_kit.IClearableMemoize<string> & functools_kit.IControlMemoize<string, ClientLoader>;
|
|
210
|
+
import: (filePath: string, basePath?: string) => Promise<any>;
|
|
211
211
|
check: (filePath: string, basePath?: string) => Promise<boolean>;
|
|
212
212
|
}
|
|
213
213
|
|