backtrace-console 0.0.1 → 0.0.3

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # backtrace-console
2
2
 
3
- CLI for querying Backtrace fingerprints, collecting artifacts, and generating repair plans.
3
+ Server manager for [backtrace-console](https://github.com/your-org/backtrace-console) start, stop, and manage the Express server process from the command line.
4
4
 
5
5
  ## Install
6
6
 
@@ -8,15 +8,32 @@ CLI for querying Backtrace fingerprints, collecting artifacts, and generating re
8
8
  npm install -g backtrace-console
9
9
  ```
10
10
 
11
- ## Commands
11
+ ## Usage
12
+
13
+ Run all commands from the **backtrace-console project root directory**.
12
14
 
13
15
  ```bash
14
- backtrace list
15
- backtrace fingerprint --fingerprint <value>
16
- backtrace collect --fingerprint <value>
17
- backtrace summarize-errors --fingerprint <value>
18
- backtrace fix-plan --fingerprint <value>
19
- backtrace apply-fix --fingerprint <value>
16
+ # 前台启动(Ctrl+C 停止)
17
+ backtrace-server run
18
+
19
+ # 后台守护进程启动
20
+ backtrace-server start
21
+
22
+ # 停止后台进程
23
+ backtrace-server stop
24
+
25
+ # 查看运行状态
26
+ backtrace-server status
20
27
  ```
21
28
 
22
- Run `backtrace --help` for the full option list.
29
+ ## How it works
30
+
31
+ - `run` — loads `.env` in the current directory and starts `bin/www` in the foreground.
32
+ - `start` — spawns `bin/www` as a detached background process. PID is saved to `.backtrace-server.pid` and logs are appended to `.backtrace-server.log`.
33
+ - `stop` — reads `.backtrace-server.pid` and sends `SIGTERM` to the process.
34
+ - `status` — checks whether the recorded PID is still alive.
35
+
36
+ ## Requirements
37
+
38
+ - Node.js 18+
39
+ - Must be run inside a `backtrace-console` project directory (i.e. `bin/www` must exist).
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ var path = require('node:path');
6
+ var fs = require('node:fs');
7
+ var { spawn } = require('node:child_process');
8
+
9
+ // 在当前工作目录下查找项目入口
10
+ var CWD = process.cwd();
11
+ var WWW = path.join(CWD, 'bin', 'www');
12
+ var PID_FILE = path.join(CWD, '.backtrace-server.pid');
13
+ var LOG_FILE = path.join(CWD, '.backtrace-server.log');
14
+
15
+ var cmd = process.argv[2];
16
+
17
+ if (cmd === 'run' || cmd === 'start') {
18
+ if (!fs.existsSync(WWW)) {
19
+ console.error('[backtrace-server] 未找到入口文件: ' + WWW);
20
+ console.error('[backtrace-server] 请在 backtrace-console 项目根目录下运行此命令');
21
+ process.exit(1);
22
+ }
23
+ }
24
+
25
+ if (cmd === 'run') {
26
+ // 前台运行,加载 .env 后直接 require 入口
27
+ try { require('dotenv').config({ path: path.join(CWD, '.env') }); } catch (_) {}
28
+ require(WWW);
29
+ return;
30
+ }
31
+
32
+ if (cmd === 'start') {
33
+ if (fs.existsSync(PID_FILE)) {
34
+ var existingPid = parseInt(fs.readFileSync(PID_FILE, 'utf8').trim(), 10);
35
+ if (existingPid && isRunning(existingPid)) {
36
+ console.log('[backtrace-server] already running, pid=' + existingPid);
37
+ process.exit(0);
38
+ }
39
+ fs.unlinkSync(PID_FILE);
40
+ }
41
+
42
+ var logFd = fs.openSync(LOG_FILE, 'a');
43
+ var child = spawn(process.execPath, [WWW], {
44
+ detached: true,
45
+ stdio: ['ignore', logFd, logFd],
46
+ env: process.env,
47
+ cwd: CWD,
48
+ });
49
+ child.unref();
50
+ fs.writeFileSync(PID_FILE, String(child.pid), 'utf8');
51
+ console.log('[backtrace-server] started, pid=' + child.pid + ', log=' + LOG_FILE);
52
+ process.exit(0);
53
+ }
54
+
55
+ if (cmd === 'stop') {
56
+ if (!fs.existsSync(PID_FILE)) {
57
+ console.log('[backtrace-server] not running (no pid file)');
58
+ process.exit(0);
59
+ }
60
+ var pid = parseInt(fs.readFileSync(PID_FILE, 'utf8').trim(), 10);
61
+ if (!pid || !isRunning(pid)) {
62
+ console.log('[backtrace-server] not running (pid=' + pid + ')');
63
+ fs.unlinkSync(PID_FILE);
64
+ process.exit(0);
65
+ }
66
+ try {
67
+ process.kill(pid, 'SIGTERM');
68
+ fs.unlinkSync(PID_FILE);
69
+ console.log('[backtrace-server] stopped, pid=' + pid);
70
+ } catch (err) {
71
+ console.error('[backtrace-server] failed to stop:', err.message);
72
+ process.exit(1);
73
+ }
74
+ process.exit(0);
75
+ }
76
+
77
+ if (cmd === 'status') {
78
+ if (!fs.existsSync(PID_FILE)) {
79
+ console.log('[backtrace-server] not running');
80
+ process.exit(0);
81
+ }
82
+ var statusPid = parseInt(fs.readFileSync(PID_FILE, 'utf8').trim(), 10);
83
+ if (statusPid && isRunning(statusPid)) {
84
+ console.log('[backtrace-server] running, pid=' + statusPid);
85
+ } else {
86
+ console.log('[backtrace-server] not running (stale pid=' + statusPid + ')');
87
+ fs.unlinkSync(PID_FILE);
88
+ }
89
+ process.exit(0);
90
+ }
91
+
92
+ console.log([
93
+ 'Usage:',
94
+ ' backtrace-server run 前台启动(Ctrl+C 停止)',
95
+ ' backtrace-server start 后台守护进程启动',
96
+ ' backtrace-server stop 停止后台进程',
97
+ ' backtrace-server status 查看运行状态',
98
+ '',
99
+ '请在 backtrace-console 项目根目录下运行。',
100
+ ].join('\n'));
101
+ process.exit(1);
102
+
103
+ function isRunning(pid) {
104
+ try { process.kill(pid, 0); return true; } catch (_) { return false; }
105
+ }
package/package.json CHANGED
@@ -1,29 +1,30 @@
1
1
  {
2
2
  "name": "backtrace-console",
3
- "version": "0.0.1",
4
- "description": "CLI for querying Backtrace fingerprints, collecting artifacts, and generating repair plans.",
3
+ "version": "0.0.3",
4
+ "description": "CLI server manager for backtrace-console run/start/stop the Express server.",
5
5
  "private": false,
6
6
  "files": [
7
- "app.js",
8
- "bin",
9
- "lib",
10
- "public",
11
- "routes"
7
+ "bin/backtrace-server.js"
12
8
  ],
13
9
  "bin": {
14
- "backtrace": "bin/backtrace-cli.js"
10
+ "backtrace-server": "bin/backtrace-server.js"
15
11
  },
16
12
  "scripts": {
17
13
  "start": "node ./bin/www",
18
- "backtrace": "node ./bin/backtrace-cli.js"
14
+ "backtrace": "node ./bin/backtrace-cli.js",
15
+ "server:run": "node ./bin/backtrace-server.js run",
16
+ "server:start": "node ./bin/backtrace-server.js start",
17
+ "server:stop": "node ./bin/backtrace-server.js stop",
18
+ "server:status": "node ./bin/backtrace-server.js status"
19
19
  },
20
- "dependencies": {
21
- "@openai/codex-sdk": "^0.118.0",
20
+ "devDependencies": {
21
+ "@openai/codex-sdk": "^0.128.0",
22
22
  "cookie-parser": "~1.4.4",
23
23
  "debug": "~2.6.9",
24
24
  "dotenv": "^17.4.1",
25
- "express": "~4.16.1",
25
+ "express": "~4.21.0",
26
26
  "morgan": "~1.9.1",
27
+ "node-cron": "^4.2.1",
27
28
  "undici": "^7.24.8"
28
29
  }
29
30
  }
package/app.js DELETED
@@ -1,22 +0,0 @@
1
- var express = require('express');
2
- var path = require('path');
3
- var cookieParser = require('cookie-parser');
4
- var logger = require('morgan');
5
-
6
- var indexRouter = require('./routes/index');
7
- var usersRouter = require('./routes/users');
8
- var backtraceRouter = require('./routes/backtrace');
9
-
10
- var app = express();
11
-
12
- app.use(logger('dev'));
13
- app.use(express.json());
14
- app.use(express.urlencoded({ extended: false }));
15
- app.use(cookieParser());
16
- app.use(express.static(path.join(__dirname, 'public')));
17
-
18
- app.use('/', indexRouter);
19
- app.use('/users', usersRouter);
20
- app.use('/api/backtrace', backtraceRouter);
21
-
22
- module.exports = app;
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- require("dotenv").config();
4
-
5
- const { parseCliArgs, printCliUsage } = require("../lib/cli/args");
6
- const { runCliCommand } = require("../lib/cli/run");
7
-
8
- async function main() {
9
- const parsed = parseCliArgs(process.argv.slice(2));
10
- if (parsed.help) {
11
- printCliUsage();
12
- return;
13
- }
14
- await runCliCommand(parsed.options);
15
- process.exit(0);
16
- }
17
-
18
- main().catch((error) => {
19
- console.error("backtrace-cli failed:");
20
- console.error(error instanceof Error ? error.stack || error.message : error);
21
- process.exit(1);
22
- });
package/bin/www DELETED
@@ -1,90 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Module dependencies.
5
- */
6
-
7
- var app = require('../app');
8
- var debug = require('debug')('backtrace-console:server');
9
- var http = require('http');
10
-
11
- /**
12
- * Get port from environment and store in Express.
13
- */
14
-
15
- var port = normalizePort(process.env.PORT || '3000');
16
- app.set('port', port);
17
-
18
- /**
19
- * Create HTTP server.
20
- */
21
-
22
- var server = http.createServer(app);
23
-
24
- /**
25
- * Listen on provided port, on all network interfaces.
26
- */
27
-
28
- server.listen(port);
29
- server.on('error', onError);
30
- server.on('listening', onListening);
31
-
32
- /**
33
- * Normalize a port into a number, string, or false.
34
- */
35
-
36
- function normalizePort(val) {
37
- var port = parseInt(val, 10);
38
-
39
- if (isNaN(port)) {
40
- // named pipe
41
- return val;
42
- }
43
-
44
- if (port >= 0) {
45
- // port number
46
- return port;
47
- }
48
-
49
- return false;
50
- }
51
-
52
- /**
53
- * Event listener for HTTP server "error" event.
54
- */
55
-
56
- function onError(error) {
57
- if (error.syscall !== 'listen') {
58
- throw error;
59
- }
60
-
61
- var bind = typeof port === 'string'
62
- ? 'Pipe ' + port
63
- : 'Port ' + port;
64
-
65
- // handle specific listen errors with friendly messages
66
- switch (error.code) {
67
- case 'EACCES':
68
- console.error(bind + ' requires elevated privileges');
69
- process.exit(1);
70
- break;
71
- case 'EADDRINUSE':
72
- console.error(bind + ' is already in use');
73
- process.exit(1);
74
- break;
75
- default:
76
- throw error;
77
- }
78
- }
79
-
80
- /**
81
- * Event listener for HTTP server "listening" event.
82
- */
83
-
84
- function onListening() {
85
- var addr = server.address();
86
- var bind = typeof addr === 'string'
87
- ? 'pipe ' + addr
88
- : 'port ' + addr.port;
89
- debug('Listening on ' + bind);
90
- }
@@ -1,32 +0,0 @@
1
- // 保留历史导入入口,实际能力全部委托给
2
- // lib/backtrace 和 lib/analysis 下的新模块实现。
3
- const {
4
- DEFAULT_QUERY_URL,
5
- DEFAULT_WORKDIR,
6
- DEFAULT_PROXY,
7
- DEFAULT_SELECT,
8
- DEFAULT_LIMIT,
9
- DEFAULT_DOWNLOAD_CONCURRENCY,
10
- DEFAULT_RETRIES,
11
- DEFAULT_STORAGE_DIR,
12
- } = require("./backtrace/constants");
13
- const { printUsage, parseArgs, createOptions } = require("./backtrace/options");
14
- const { printList } = require("./backtrace/analysis");
15
- const { BacktraceCodexTool, runBacktraceCommand } = require("./backtrace/tool");
16
-
17
- module.exports = {
18
- BacktraceCodexTool,
19
- runBacktraceCommand,
20
- createOptions,
21
- parseArgs,
22
- printUsage,
23
- printList,
24
- DEFAULT_QUERY_URL,
25
- DEFAULT_WORKDIR,
26
- DEFAULT_PROXY,
27
- DEFAULT_SELECT,
28
- DEFAULT_LIMIT,
29
- DEFAULT_DOWNLOAD_CONCURRENCY,
30
- DEFAULT_RETRIES,
31
- DEFAULT_STORAGE_DIR,
32
- };