loop-task 1.0.0 → 1.0.2
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 +8 -8
- package/dist/cli.js +85 -49
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -19,15 +19,15 @@ npx loop-task 30m npm test
|
|
|
19
19
|
## Usage
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
loop [options] <interval> <command>
|
|
22
|
+
loop-task [options] <interval> <command>
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
### Basic examples
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
loop 30m npm test
|
|
29
|
-
loop 1h opencode --prompt '/ob-init'
|
|
30
|
-
loop 1d node sync.js
|
|
28
|
+
loop-task 30m npm test
|
|
29
|
+
loop-task 1h opencode --prompt '/ob-init'
|
|
30
|
+
loop-task 1d node sync.js
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
### With npx
|
|
@@ -60,25 +60,25 @@ npx loop-task 30m opencode --prompt "search for missing translation text and tra
|
|
|
60
60
|
### Run tests every 30 minutes
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
loop 30m npm test
|
|
63
|
+
loop-task 30m npm test
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
### Run immediately, then every hour
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
loop --immediate 1h npm test
|
|
69
|
+
loop-task --immediate 1h npm test
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
### Run up to 5 times then stop
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
|
-
loop --max-runs 5 5m npm test
|
|
75
|
+
loop-task --max-runs 5 5m npm test
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
### Verbose mode
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
loop --verbose 30m npm test
|
|
81
|
+
loop-task --verbose 30m npm test
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
Shows start/end timestamps, exit code, execution duration, and next scheduled run.
|
package/dist/cli.js
CHANGED
|
@@ -1,60 +1,96 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Command } from "commander";
|
|
3
2
|
import { parseDuration } from "./duration.js";
|
|
4
3
|
import { Logger } from "./logger.js";
|
|
5
4
|
import { runLoop } from "./loop.js";
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
17
|
-
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const loopOptions = {
|
|
7
|
+
immediate: false,
|
|
8
|
+
maxRuns: null,
|
|
9
|
+
verbose: false,
|
|
10
|
+
};
|
|
11
|
+
const commandParts = [];
|
|
12
|
+
let i = 0;
|
|
13
|
+
while (i < args.length) {
|
|
14
|
+
const arg = args[i];
|
|
15
|
+
if (arg === "--immediate") {
|
|
16
|
+
loopOptions.immediate = true;
|
|
17
|
+
i++;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
else if (arg === "--max-runs") {
|
|
20
|
+
i++;
|
|
21
|
+
const n = parseInt(args[i], 10);
|
|
22
|
+
if (isNaN(n) || n < 1) {
|
|
23
|
+
console.error("Error: --max-runs must be a positive integer");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
loopOptions.maxRuns = n;
|
|
27
|
+
i++;
|
|
28
|
+
}
|
|
29
|
+
else if (arg === "--verbose") {
|
|
30
|
+
loopOptions.verbose = true;
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
else if (arg === "--help" || arg === "-h") {
|
|
34
|
+
console.log(`
|
|
25
35
|
Usage:
|
|
26
|
-
loop [options] <interval> <command>
|
|
36
|
+
loop-task [options] <interval> <command>
|
|
27
37
|
|
|
28
38
|
Examples:
|
|
29
|
-
loop 30m npm test
|
|
30
|
-
loop 1h opencode --prompt '/ob-init'
|
|
31
|
-
loop --immediate
|
|
32
|
-
loop --max-runs 5 5m npm test
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
loop-task 30m npm test
|
|
40
|
+
loop-task 1h opencode --prompt '/ob-init'
|
|
41
|
+
loop-task 30s --immediate -- echo hello
|
|
42
|
+
loop-task --max-runs 5 5m npm test
|
|
43
|
+
|
|
44
|
+
Options:
|
|
45
|
+
--immediate Run immediately before waiting
|
|
46
|
+
--max-runs <n> Stop after N executions
|
|
47
|
+
--verbose Show execution details
|
|
48
|
+
-h, --help Display help
|
|
49
|
+
-V, --version Display version
|
|
50
|
+
`);
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
else if (arg === "--version" || arg === "-V") {
|
|
54
|
+
console.log("1.0.0");
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
else if (arg === "--") {
|
|
58
|
+
i++;
|
|
59
|
+
commandParts.push(...args.slice(i));
|
|
60
|
+
break;
|
|
39
61
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
process.exit(1);
|
|
62
|
+
else {
|
|
63
|
+
commandParts.push(arg);
|
|
64
|
+
i++;
|
|
44
65
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
}
|
|
67
|
+
if (commandParts.length < 2) {
|
|
68
|
+
console.error("Error: missing required arguments");
|
|
69
|
+
console.error("Usage: loop-task [options] <interval> <command>");
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const intervalStr = commandParts[0];
|
|
73
|
+
const command = commandParts.slice(1).join(" ");
|
|
74
|
+
const logger = new Logger(loopOptions.verbose);
|
|
75
|
+
let interval;
|
|
76
|
+
try {
|
|
77
|
+
interval = parseDuration(intervalStr);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
81
|
+
logger.error(`Error: ${message}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
const options = {
|
|
85
|
+
interval,
|
|
86
|
+
command,
|
|
87
|
+
immediate: loopOptions.immediate,
|
|
88
|
+
maxRuns: loopOptions.maxRuns,
|
|
89
|
+
verbose: loopOptions.verbose,
|
|
90
|
+
};
|
|
91
|
+
const controller = new AbortController();
|
|
92
|
+
process.on("SIGINT", () => controller.abort());
|
|
93
|
+
process.on("SIGTERM", () => controller.abort());
|
|
94
|
+
await runLoop(options, logger, controller.signal);
|
|
95
|
+
process.exit(0);
|
|
60
96
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,IAAqB;IAC9B,OAAO,EAAE,KAAK;CACf,CAAC;AAEF,MAAM,YAAY,GAAa,EAAE,CAAC;AAClC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QAC1B,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;QAC7B,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QAChC,CAAC,EAAE,CAAC;QACJ,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC;QACxB,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QAC/B,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;CAgBf,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACxB,CAAC,EAAE,CAAC;QACJ,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM;IACR,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,EAAE,CAAC;IACN,CAAC;AACH,CAAC;AAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AACpC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAE/C,IAAI,QAAgB,CAAC;AACrB,IAAI,CAAC;IACH,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC;AAAC,OAAO,KAAc,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,GAAgB;IAC3B,QAAQ;IACR,OAAO;IACP,SAAS,EAAE,WAAW,CAAC,SAAS;IAChC,OAAO,EAAE,WAAW,CAAC,OAAO;IAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;AAEzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;AAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;AAEhD,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loop-task",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "A cross-platform CLI that repeatedly executes a shell command at a human-readable interval",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"loop": "dist/cli.js"
|
|
7
|
+
"loop-task": "dist/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"main": "dist/cli.js",
|
|
10
10
|
"files": [
|