@coralwisdom/anybuilder 0.1.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 ADDED
@@ -0,0 +1,118 @@
1
+ # anybuilder 守护进程项目
2
+
3
+ 基于 Go 语言实现的客户端守护进程与命令行工具。参考了 mature 守护进程的脱离终端自拉起、跨平台会话隔离、日志大小滚动轮转、本地 HTTP 探活、防重入以及平台身份鉴权体系。
4
+
5
+ 编译生成的主二进制命令为 `anybuilder`。
6
+
7
+ ## 目录结构
8
+
9
+ ```text
10
+ .
11
+ ├── cmd/
12
+ │ └── anybuilder/
13
+ │ ├── main.go # 命令根入口,注册 daemon / login / auth / version
14
+ │ ├── cmd_daemon.go # 守护进程 start/stop/restart/status/logs 核心实现
15
+ │ ├── cmd_daemon_unix.go # Unix/macOS 平台系统适配 (Setsid 终端会话脱离)
16
+ │ ├── cmd_daemon_windows.go # Windows 平台适配 (进程组与退出处理)
17
+ │ ├── cmd_login.go # 支持浏览器 OAuth 回调换 Token 与 Token 凭证直接登录
18
+ │ ├── cmd_auth.go # auth status 与 auth logout 凭证管理
19
+ │ └── cmd_version.go # 版本信息输出
20
+ ├── internal/
21
+ │ ├── auth/ # JWT 解析、BFF 换 Token 接口与浏览器唤醒
22
+ │ ├── config/ # 目录与配置持久化 (~/.anybuilder/config.json)
23
+ │ ├── daemon/ # 本地 HTTP 探活服务 (/health) 与主调度循环
24
+ │ ├── logger/ # 基于 slog 与 lumberjack 的大小轮转日志
25
+ │ └── version/ # 编译构建元信息
26
+ ├── Makefile # 编译与构建脚本
27
+ └── go.mod # Go 模块文件
28
+ ```
29
+
30
+ ## 快速开始
31
+
32
+ ### 1. 编译构建
33
+
34
+ ```bash
35
+ make build
36
+ # 编译产物位于 bin/anybuilder
37
+ ```
38
+
39
+ ### 2. 身份认证与登录
40
+
41
+ 支持两种登录方式:
42
+
43
+ #### 方式一:浏览器授权登录(默认推荐)
44
+
45
+ ```bash
46
+ ./bin/anybuilder login
47
+ ```
48
+
49
+ - 自动在本地启动轻量临时回调服务并随机分配空闲端口;
50
+ - 自动打开浏览器跳转至职阅授权中心(Yeeauth OAuth);
51
+ - 授权完成后自动重定向回本地回调接口;
52
+ - CLI 自动携带 `code` 调用 BFF 接口 `POST /bff/auth/codeLogin` 换取 Access Token 与 Refresh Token 并安全保存在 `~/.anybuilder/config.json`。
53
+
54
+ #### 方式二:Token 凭证登录(无头服务器 / CI / 自动化脚本)
55
+
56
+ 支持传入 **PAT(个人访问令牌)** 或 **OAuth 临时凭据**,登录时会严格请求服务端进行有效性校验(无效/已过期凭证会直接阻断报错,杜绝伪造放行):
57
+
58
+ ```bash
59
+ # 1. 仅传 Token(适合 PAT 长期令牌或短暂 CI 构建任务)
60
+ ./bin/anybuilder login --token "<YOUR_PAT_OR_ACCESS_TOKEN>"
61
+
62
+ # 2. 交互式安全输入 Token(不污染 Shell 历史记录)
63
+ ./bin/anybuilder login --token
64
+
65
+ # 3. 同时提供 Token 与 RefreshToken(适合后台常驻守护进程,开启自动平滑续期)
66
+ ./bin/anybuilder login --token "<ACCESS_TOKEN>" --refresh-token "<REFRESH_TOKEN>"
67
+
68
+ # 4. 仅提供 RefreshToken(自动向服务端换发全新有效的 Access Token 与用户信息)
69
+ ./bin/anybuilder login --refresh-token "<REFRESH_TOKEN>"
70
+ ```
71
+
72
+ > **参数说明**:
73
+ > - **PAT 个人令牌**(如控制台生成的 UUID 令牌):属于长期有效凭证,**不需要填 `refresh-token`**;
74
+ > - **OAuth 临时 Token**(通常 1~2 小时过期):若需守护进程长期在后台常驻运行,**建议配合 `--refresh-token`**,以便后台到期前自动续期;
75
+ > - **鉴权安全校验**:无论输入何种 Token,系统均会在线向服务端鉴权并解析真实成员信息;若凭据无效,直接拦截退出。
76
+
77
+ #### 凭证管理与自动续期
78
+
79
+ ```bash
80
+ # 查看当前登录状态与有效时长
81
+ ./bin/anybuilder auth status
82
+ ./bin/anybuilder auth status --json
83
+
84
+ # 手动触发凭证平滑刷新(使用 refresh_token 向服务端换发新凭证)
85
+ ./bin/anybuilder auth refresh
86
+
87
+ # 退出登录并清理本地凭证
88
+ ./bin/anybuilder auth logout
89
+ ```
90
+
91
+ > **平滑续期机制**:守护进程在后台运行时,会自动启动后台巡检协程(默认每 5 分钟检查一次)。若发现 Token 有效期剩余小于 30 分钟,会自动通过 Refresh Token 无感续期并写回本地配置;同时在建立 WebSocket 长连接前也会自动检测并确保凭证新鲜。
92
+
93
+ ### 3. 守护进程管理
94
+
95
+ ```bash
96
+ # 启动守护进程(已登录环境下,后台脱离终端运行)
97
+ ./bin/anybuilder daemon start
98
+
99
+ # 绕过登录强校验启动(本地离线调试时可用)
100
+ ./bin/anybuilder daemon start --allow-unauthenticated
101
+
102
+ # 前台调试启动(实时控制台日志)
103
+ ./bin/anybuilder daemon start --foreground
104
+
105
+ # 查看守护进程运行状态(PID、运行时长、探针地址)
106
+ ./bin/anybuilder daemon status
107
+ ./bin/anybuilder daemon status --json
108
+
109
+ # 查看守护进程运行日志
110
+ ./bin/anybuilder daemon logs
111
+ ./bin/anybuilder daemon logs -f -n 50
112
+
113
+ # 重启守护进程
114
+ ./bin/anybuilder daemon restart
115
+
116
+ # 优雅停止守护进程
117
+ ./bin/anybuilder daemon stop
118
+ ```
Binary file
Binary file
Binary file
Binary file
package/bin/run.js ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+
3
+ const path = require('path');
4
+ const fs = require('fs');
5
+ const { spawnSync } = require('child_process');
6
+
7
+ const platformMap = {
8
+ darwin: 'darwin',
9
+ linux: 'linux',
10
+ win32: 'win32',
11
+ };
12
+
13
+ const archMap = {
14
+ x64: 'x64',
15
+ arm64: 'arm64',
16
+ };
17
+
18
+ const platform = platformMap[process.platform];
19
+ const arch = archMap[process.arch];
20
+
21
+ if (!platform || !arch) {
22
+ console.error(`不支持当前系统架构: ${process.platform} ${process.arch}`);
23
+ process.exit(1);
24
+ }
25
+
26
+ const exeSuffix = platform === 'win32' ? '.exe' : '';
27
+ const binaryName = `anybuilder-${platform}-${arch}${exeSuffix}`;
28
+ const binaryPath = path.join(__dirname, 'dist', binaryName);
29
+
30
+ if (!fs.existsSync(binaryPath)) {
31
+ console.error(`未找到对应平台的二进制可执行文件: ${binaryPath}`);
32
+ console.error(`请确认 npm 包完整性或在本地执行 make build-all`);
33
+ process.exit(1);
34
+ }
35
+
36
+ const result = spawnSync(binaryPath, process.argv.slice(2), {
37
+ stdio: 'inherit',
38
+ });
39
+
40
+ if (result.error) {
41
+ console.error(`执行失败: ${result.error.message}`);
42
+ process.exit(1);
43
+ }
44
+
45
+ process.exit(result.status ?? 0);
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@coralwisdom/anybuilder",
3
+ "version": "0.1.0",
4
+ "description": "anybuilder daemon CLI cross-platform distribution",
5
+ "bin": {
6
+ "anybuilder": "./bin/run.js"
7
+ },
8
+ "files": [
9
+ "bin/run.js",
10
+ "bin/dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "prepublishOnly": "make build-all"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ }
19
+ }