bluelamp 4.3.2 โ 4.3.4
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 +78 -0
- package/bin/bluelamp-vscode-base +357 -1
- package/bin/bluelamp1 +0 -0
- package/bin/bluelamp10 +0 -0
- package/bin/bluelamp100 +0 -0
- package/bin/bluelamp101 +2 -0
- package/bin/bluelamp102 +2 -0
- package/bin/bluelamp103 +2 -0
- package/bin/bluelamp104 +2 -0
- package/bin/bluelamp105 +2 -0
- package/bin/bluelamp106 +2 -0
- package/bin/bluelamp107 +2 -0
- package/bin/bluelamp108 +2 -0
- package/bin/bluelamp109 +2 -0
- package/bin/bluelamp11 +0 -0
- package/bin/bluelamp110 +2 -0
- package/bin/bluelamp111 +2 -0
- package/bin/bluelamp112 +2 -0
- package/bin/bluelamp113 +2 -0
- package/bin/bluelamp114 +2 -0
- package/bin/bluelamp115 +2 -0
- package/bin/bluelamp116 +2 -0
- package/bin/bluelamp117 +2 -0
- package/bin/bluelamp118 +2 -0
- package/bin/bluelamp119 +2 -0
- package/bin/bluelamp12 +0 -0
- package/bin/bluelamp120 +2 -0
- package/bin/bluelamp121 +2 -0
- package/bin/bluelamp122 +2 -0
- package/bin/bluelamp123 +2 -0
- package/bin/bluelamp124 +2 -0
- package/bin/bluelamp125 +2 -0
- package/bin/bluelamp126 +2 -0
- package/bin/bluelamp127 +2 -0
- package/bin/bluelamp128 +2 -0
- package/bin/bluelamp129 +2 -0
- package/bin/bluelamp13 +0 -0
- package/bin/bluelamp130 +2 -0
- package/bin/bluelamp131 +2 -0
- package/bin/bluelamp132 +2 -0
- package/bin/bluelamp133 +2 -0
- package/bin/bluelamp134 +2 -0
- package/bin/bluelamp135 +2 -0
- package/bin/bluelamp136 +2 -0
- package/bin/bluelamp137 +2 -0
- package/bin/bluelamp138 +2 -0
- package/bin/bluelamp139 +2 -0
- package/bin/bluelamp14 +0 -0
- package/bin/bluelamp140 +2 -0
- package/bin/bluelamp141 +2 -0
- package/bin/bluelamp142 +2 -0
- package/bin/bluelamp143 +2 -0
- package/bin/bluelamp144 +2 -0
- package/bin/bluelamp145 +2 -0
- package/bin/bluelamp146 +2 -0
- package/bin/bluelamp147 +2 -0
- package/bin/bluelamp148 +2 -0
- package/bin/bluelamp149 +2 -0
- package/bin/bluelamp15 +0 -0
- package/bin/bluelamp150 +2 -0
- package/bin/bluelamp151 +2 -0
- package/bin/bluelamp152 +2 -0
- package/bin/bluelamp153 +2 -0
- package/bin/bluelamp154 +2 -0
- package/bin/bluelamp155 +2 -0
- package/bin/bluelamp156 +2 -0
- package/bin/bluelamp157 +2 -0
- package/bin/bluelamp158 +2 -0
- package/bin/bluelamp159 +2 -0
- package/bin/bluelamp16 +0 -0
- package/bin/bluelamp160 +2 -0
- package/bin/bluelamp161 +2 -0
- package/bin/bluelamp162 +2 -0
- package/bin/bluelamp163 +2 -0
- package/bin/bluelamp164 +2 -0
- package/bin/bluelamp165 +2 -0
- package/bin/bluelamp166 +2 -0
- package/bin/bluelamp167 +2 -0
- package/bin/bluelamp168 +2 -0
- package/bin/bluelamp169 +2 -0
- package/bin/bluelamp17 +0 -0
- package/bin/bluelamp170 +2 -0
- package/bin/bluelamp171 +2 -0
- package/bin/bluelamp172 +2 -0
- package/bin/bluelamp173 +2 -0
- package/bin/bluelamp174 +2 -0
- package/bin/bluelamp175 +2 -0
- package/bin/bluelamp176 +2 -0
- package/bin/bluelamp177 +2 -0
- package/bin/bluelamp178 +2 -0
- package/bin/bluelamp179 +2 -0
- package/bin/bluelamp18 +0 -0
- package/bin/bluelamp180 +2 -0
- package/bin/bluelamp181 +2 -0
- package/bin/bluelamp182 +2 -0
- package/bin/bluelamp183 +2 -0
- package/bin/bluelamp184 +2 -0
- package/bin/bluelamp185 +2 -0
- package/bin/bluelamp186 +2 -0
- package/bin/bluelamp187 +2 -0
- package/bin/bluelamp188 +2 -0
- package/bin/bluelamp189 +2 -0
- package/bin/bluelamp19 +0 -0
- package/bin/bluelamp190 +2 -0
- package/bin/bluelamp191 +2 -0
- package/bin/bluelamp192 +2 -0
- package/bin/bluelamp193 +2 -0
- package/bin/bluelamp194 +2 -0
- package/bin/bluelamp195 +2 -0
- package/bin/bluelamp196 +2 -0
- package/bin/bluelamp197 +2 -0
- package/bin/bluelamp198 +2 -0
- package/bin/bluelamp199 +2 -0
- package/bin/bluelamp2 +0 -0
- package/bin/bluelamp20 +0 -0
- package/bin/bluelamp200 +2 -0
- package/bin/bluelamp21 +0 -0
- package/bin/bluelamp22 +0 -0
- package/bin/bluelamp23 +0 -0
- package/bin/bluelamp24 +0 -0
- package/bin/bluelamp25 +0 -0
- package/bin/bluelamp26 +0 -0
- package/bin/bluelamp27 +0 -0
- package/bin/bluelamp28 +0 -0
- package/bin/bluelamp29 +0 -0
- package/bin/bluelamp3 +0 -0
- package/bin/bluelamp30 +0 -0
- package/bin/bluelamp31 +0 -0
- package/bin/bluelamp32 +0 -0
- package/bin/bluelamp33 +0 -0
- package/bin/bluelamp34 +0 -0
- package/bin/bluelamp35 +0 -0
- package/bin/bluelamp36 +0 -0
- package/bin/bluelamp37 +0 -0
- package/bin/bluelamp38 +0 -0
- package/bin/bluelamp39 +0 -0
- package/bin/bluelamp4 +0 -0
- package/bin/bluelamp40 +0 -0
- package/bin/bluelamp41 +0 -0
- package/bin/bluelamp42 +0 -0
- package/bin/bluelamp43 +0 -0
- package/bin/bluelamp44 +0 -0
- package/bin/bluelamp45 +0 -0
- package/bin/bluelamp46 +0 -0
- package/bin/bluelamp47 +0 -0
- package/bin/bluelamp48 +0 -0
- package/bin/bluelamp49 +0 -0
- package/bin/bluelamp5 +0 -0
- package/bin/bluelamp50 +0 -0
- package/bin/bluelamp51 +0 -0
- package/bin/bluelamp52 +0 -0
- package/bin/bluelamp53 +0 -0
- package/bin/bluelamp54 +0 -0
- package/bin/bluelamp55 +0 -0
- package/bin/bluelamp56 +0 -0
- package/bin/bluelamp57 +0 -0
- package/bin/bluelamp58 +0 -0
- package/bin/bluelamp59 +0 -0
- package/bin/bluelamp6 +0 -0
- package/bin/bluelamp60 +0 -0
- package/bin/bluelamp61 +0 -0
- package/bin/bluelamp62 +0 -0
- package/bin/bluelamp63 +0 -0
- package/bin/bluelamp64 +0 -0
- package/bin/bluelamp65 +0 -0
- package/bin/bluelamp66 +0 -0
- package/bin/bluelamp67 +0 -0
- package/bin/bluelamp68 +0 -0
- package/bin/bluelamp69 +0 -0
- package/bin/bluelamp7 +0 -0
- package/bin/bluelamp70 +0 -0
- package/bin/bluelamp71 +0 -0
- package/bin/bluelamp72 +0 -0
- package/bin/bluelamp73 +0 -0
- package/bin/bluelamp74 +0 -0
- package/bin/bluelamp75 +0 -0
- package/bin/bluelamp76 +0 -0
- package/bin/bluelamp77 +0 -0
- package/bin/bluelamp78 +0 -0
- package/bin/bluelamp79 +0 -0
- package/bin/bluelamp8 +0 -0
- package/bin/bluelamp80 +0 -0
- package/bin/bluelamp81 +0 -0
- package/bin/bluelamp82 +0 -0
- package/bin/bluelamp83 +0 -0
- package/bin/bluelamp84 +0 -0
- package/bin/bluelamp85 +0 -0
- package/bin/bluelamp86 +0 -0
- package/bin/bluelamp87 +0 -0
- package/bin/bluelamp88 +0 -0
- package/bin/bluelamp89 +0 -0
- package/bin/bluelamp9 +0 -0
- package/bin/bluelamp90 +0 -0
- package/bin/bluelamp91 +0 -0
- package/bin/bluelamp92 +0 -0
- package/bin/bluelamp93 +0 -0
- package/bin/bluelamp94 +0 -0
- package/bin/bluelamp95 +0 -0
- package/bin/bluelamp96 +0 -0
- package/bin/bluelamp97 +0 -0
- package/bin/bluelamp98 +0 -0
- package/bin/bluelamp99 +0 -0
- package/lib/auth/InteractiveLogin.js +253 -1
- package/lib/auth/PortalAuthClient.js +184 -1
- package/lib/auth/TokenManager.js +260 -1
- package/lib/i18n/en.json +2 -2
- package/lib/i18n/index.js +75 -1
- package/lib/i18n/ja.json +2 -2
- package/lib/mcp-server/index.cjs +452 -1
- package/lib/mcp-server/portal-api-client.cjs +634 -1
- package/lib/utils/logger.js +83 -1
- package/package.json +118 -8
- package/scripts/build.js +350 -0
- package/scripts/generate-commands.js +44 -1
- package/scripts/playwright-launch.js +221 -1
- package/scripts/setup-mcps.js +124 -1
- package/scripts/setup-playwright.js +61 -1
- package/lib/mcp-gmail/credentials.json +0 -1
package/lib/utils/logger.js
CHANGED
|
@@ -1 +1,83 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* BlueLamp VSCode Logger
|
|
3
|
+
* ็ฐๅขๅคๆฐใใผในใฎใญใฐใฌใใซๅถๅพก
|
|
4
|
+
*
|
|
5
|
+
* @module logger
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const LOG_LEVELS = {
|
|
9
|
+
debug: 0,
|
|
10
|
+
info: 1,
|
|
11
|
+
warn: 2,
|
|
12
|
+
error: 3,
|
|
13
|
+
silent: 4
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const LOG_LEVEL = process.env.BLUELAMP_LOG_LEVEL || 'info';
|
|
17
|
+
const currentLevel = LOG_LEVELS[LOG_LEVEL] ?? LOG_LEVELS.info;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* ใฟใคใ ในใฟใณใไปใใญใฐใกใใปใผใธใ็ๆ
|
|
21
|
+
* @param {string} level - ใญใฐใฌใใซ
|
|
22
|
+
* @param {string} message - ใกใใปใผใธ
|
|
23
|
+
* @returns {string} ใใฉใผใใใๆธใฟใกใใปใผใธ
|
|
24
|
+
*/
|
|
25
|
+
function formatMessage(level, message) {
|
|
26
|
+
const timestamp = new Date().toISOString();
|
|
27
|
+
return `[${timestamp}] [${level.toUpperCase()}] ${message}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* ใญใฐๅบๅ้ขๆฐ
|
|
32
|
+
*/
|
|
33
|
+
const logger = {
|
|
34
|
+
/**
|
|
35
|
+
* ใใใใฐใญใฐ
|
|
36
|
+
* @param {string} message - ใกใใปใผใธ
|
|
37
|
+
*/
|
|
38
|
+
debug(message) {
|
|
39
|
+
if (currentLevel <= LOG_LEVELS.debug) {
|
|
40
|
+
console.error(formatMessage('debug', message));
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* ๆ
ๅ ฑใญใฐ
|
|
46
|
+
* @param {string} message - ใกใใปใผใธ
|
|
47
|
+
*/
|
|
48
|
+
info(message) {
|
|
49
|
+
if (currentLevel <= LOG_LEVELS.info) {
|
|
50
|
+
console.error(formatMessage('info', message));
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* ่ญฆๅใญใฐ
|
|
56
|
+
* @param {string} message - ใกใใปใผใธ
|
|
57
|
+
*/
|
|
58
|
+
warn(message) {
|
|
59
|
+
if (currentLevel <= LOG_LEVELS.warn) {
|
|
60
|
+
console.warn(formatMessage('warn', message));
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* ใจใฉใผใญใฐ
|
|
66
|
+
* @param {string} message - ใกใใปใผใธ
|
|
67
|
+
*/
|
|
68
|
+
error(message) {
|
|
69
|
+
if (currentLevel <= LOG_LEVELS.error) {
|
|
70
|
+
console.error(formatMessage('error', message));
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* ใญใฐใฌใใซใๅๅพ
|
|
76
|
+
* @returns {string} ็พๅจใฎใญใฐใฌใใซ
|
|
77
|
+
*/
|
|
78
|
+
getLevel() {
|
|
79
|
+
return LOG_LEVEL;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
module.exports = { logger, LOG_LEVELS };
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bluelamp",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.4",
|
|
4
4
|
"description": "BlueLamp MCP Server - 100 Customizable Development Prompts for Claude Code",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "lib/mcp-server/index.cjs",
|
|
6
6
|
"bin": {
|
|
7
7
|
"bluelamp1": "./bin/bluelamp1",
|
|
8
8
|
"bluelamp2": "./bin/bluelamp2",
|
|
@@ -103,7 +103,114 @@
|
|
|
103
103
|
"bluelamp97": "./bin/bluelamp97",
|
|
104
104
|
"bluelamp98": "./bin/bluelamp98",
|
|
105
105
|
"bluelamp99": "./bin/bluelamp99",
|
|
106
|
-
"bluelamp100": "./bin/bluelamp100"
|
|
106
|
+
"bluelamp100": "./bin/bluelamp100",
|
|
107
|
+
"bluelamp101": "./bin/bluelamp101",
|
|
108
|
+
"bluelamp102": "./bin/bluelamp102",
|
|
109
|
+
"bluelamp103": "./bin/bluelamp103",
|
|
110
|
+
"bluelamp104": "./bin/bluelamp104",
|
|
111
|
+
"bluelamp105": "./bin/bluelamp105",
|
|
112
|
+
"bluelamp106": "./bin/bluelamp106",
|
|
113
|
+
"bluelamp107": "./bin/bluelamp107",
|
|
114
|
+
"bluelamp108": "./bin/bluelamp108",
|
|
115
|
+
"bluelamp109": "./bin/bluelamp109",
|
|
116
|
+
"bluelamp110": "./bin/bluelamp110",
|
|
117
|
+
"bluelamp111": "./bin/bluelamp111",
|
|
118
|
+
"bluelamp112": "./bin/bluelamp112",
|
|
119
|
+
"bluelamp113": "./bin/bluelamp113",
|
|
120
|
+
"bluelamp114": "./bin/bluelamp114",
|
|
121
|
+
"bluelamp115": "./bin/bluelamp115",
|
|
122
|
+
"bluelamp116": "./bin/bluelamp116",
|
|
123
|
+
"bluelamp117": "./bin/bluelamp117",
|
|
124
|
+
"bluelamp118": "./bin/bluelamp118",
|
|
125
|
+
"bluelamp119": "./bin/bluelamp119",
|
|
126
|
+
"bluelamp120": "./bin/bluelamp120",
|
|
127
|
+
"bluelamp121": "./bin/bluelamp121",
|
|
128
|
+
"bluelamp122": "./bin/bluelamp122",
|
|
129
|
+
"bluelamp123": "./bin/bluelamp123",
|
|
130
|
+
"bluelamp124": "./bin/bluelamp124",
|
|
131
|
+
"bluelamp125": "./bin/bluelamp125",
|
|
132
|
+
"bluelamp126": "./bin/bluelamp126",
|
|
133
|
+
"bluelamp127": "./bin/bluelamp127",
|
|
134
|
+
"bluelamp128": "./bin/bluelamp128",
|
|
135
|
+
"bluelamp129": "./bin/bluelamp129",
|
|
136
|
+
"bluelamp130": "./bin/bluelamp130",
|
|
137
|
+
"bluelamp131": "./bin/bluelamp131",
|
|
138
|
+
"bluelamp132": "./bin/bluelamp132",
|
|
139
|
+
"bluelamp133": "./bin/bluelamp133",
|
|
140
|
+
"bluelamp134": "./bin/bluelamp134",
|
|
141
|
+
"bluelamp135": "./bin/bluelamp135",
|
|
142
|
+
"bluelamp136": "./bin/bluelamp136",
|
|
143
|
+
"bluelamp137": "./bin/bluelamp137",
|
|
144
|
+
"bluelamp138": "./bin/bluelamp138",
|
|
145
|
+
"bluelamp139": "./bin/bluelamp139",
|
|
146
|
+
"bluelamp140": "./bin/bluelamp140",
|
|
147
|
+
"bluelamp141": "./bin/bluelamp141",
|
|
148
|
+
"bluelamp142": "./bin/bluelamp142",
|
|
149
|
+
"bluelamp143": "./bin/bluelamp143",
|
|
150
|
+
"bluelamp144": "./bin/bluelamp144",
|
|
151
|
+
"bluelamp145": "./bin/bluelamp145",
|
|
152
|
+
"bluelamp146": "./bin/bluelamp146",
|
|
153
|
+
"bluelamp147": "./bin/bluelamp147",
|
|
154
|
+
"bluelamp148": "./bin/bluelamp148",
|
|
155
|
+
"bluelamp149": "./bin/bluelamp149",
|
|
156
|
+
"bluelamp150": "./bin/bluelamp150",
|
|
157
|
+
"bluelamp151": "./bin/bluelamp151",
|
|
158
|
+
"bluelamp152": "./bin/bluelamp152",
|
|
159
|
+
"bluelamp153": "./bin/bluelamp153",
|
|
160
|
+
"bluelamp154": "./bin/bluelamp154",
|
|
161
|
+
"bluelamp155": "./bin/bluelamp155",
|
|
162
|
+
"bluelamp156": "./bin/bluelamp156",
|
|
163
|
+
"bluelamp157": "./bin/bluelamp157",
|
|
164
|
+
"bluelamp158": "./bin/bluelamp158",
|
|
165
|
+
"bluelamp159": "./bin/bluelamp159",
|
|
166
|
+
"bluelamp160": "./bin/bluelamp160",
|
|
167
|
+
"bluelamp161": "./bin/bluelamp161",
|
|
168
|
+
"bluelamp162": "./bin/bluelamp162",
|
|
169
|
+
"bluelamp163": "./bin/bluelamp163",
|
|
170
|
+
"bluelamp164": "./bin/bluelamp164",
|
|
171
|
+
"bluelamp165": "./bin/bluelamp165",
|
|
172
|
+
"bluelamp166": "./bin/bluelamp166",
|
|
173
|
+
"bluelamp167": "./bin/bluelamp167",
|
|
174
|
+
"bluelamp168": "./bin/bluelamp168",
|
|
175
|
+
"bluelamp169": "./bin/bluelamp169",
|
|
176
|
+
"bluelamp170": "./bin/bluelamp170",
|
|
177
|
+
"bluelamp171": "./bin/bluelamp171",
|
|
178
|
+
"bluelamp172": "./bin/bluelamp172",
|
|
179
|
+
"bluelamp173": "./bin/bluelamp173",
|
|
180
|
+
"bluelamp174": "./bin/bluelamp174",
|
|
181
|
+
"bluelamp175": "./bin/bluelamp175",
|
|
182
|
+
"bluelamp176": "./bin/bluelamp176",
|
|
183
|
+
"bluelamp177": "./bin/bluelamp177",
|
|
184
|
+
"bluelamp178": "./bin/bluelamp178",
|
|
185
|
+
"bluelamp179": "./bin/bluelamp179",
|
|
186
|
+
"bluelamp180": "./bin/bluelamp180",
|
|
187
|
+
"bluelamp181": "./bin/bluelamp181",
|
|
188
|
+
"bluelamp182": "./bin/bluelamp182",
|
|
189
|
+
"bluelamp183": "./bin/bluelamp183",
|
|
190
|
+
"bluelamp184": "./bin/bluelamp184",
|
|
191
|
+
"bluelamp185": "./bin/bluelamp185",
|
|
192
|
+
"bluelamp186": "./bin/bluelamp186",
|
|
193
|
+
"bluelamp187": "./bin/bluelamp187",
|
|
194
|
+
"bluelamp188": "./bin/bluelamp188",
|
|
195
|
+
"bluelamp189": "./bin/bluelamp189",
|
|
196
|
+
"bluelamp190": "./bin/bluelamp190",
|
|
197
|
+
"bluelamp191": "./bin/bluelamp191",
|
|
198
|
+
"bluelamp192": "./bin/bluelamp192",
|
|
199
|
+
"bluelamp193": "./bin/bluelamp193",
|
|
200
|
+
"bluelamp194": "./bin/bluelamp194",
|
|
201
|
+
"bluelamp195": "./bin/bluelamp195",
|
|
202
|
+
"bluelamp196": "./bin/bluelamp196",
|
|
203
|
+
"bluelamp197": "./bin/bluelamp197",
|
|
204
|
+
"bluelamp198": "./bin/bluelamp198",
|
|
205
|
+
"bluelamp199": "./bin/bluelamp199",
|
|
206
|
+
"bluelamp200": "./bin/bluelamp200"
|
|
207
|
+
},
|
|
208
|
+
"scripts": {
|
|
209
|
+
"postinstall": "node scripts/generate-commands.js && node scripts/setup-mcps.js",
|
|
210
|
+
"test": "jest",
|
|
211
|
+
"test:coverage": "jest --coverage",
|
|
212
|
+
"test:mcp": "node test-mcp.js",
|
|
213
|
+
"build": "node scripts/build.js"
|
|
107
214
|
},
|
|
108
215
|
"keywords": [
|
|
109
216
|
"vscode",
|
|
@@ -130,14 +237,17 @@
|
|
|
130
237
|
"files": [
|
|
131
238
|
"bin/",
|
|
132
239
|
"lib/",
|
|
133
|
-
"scripts/"
|
|
240
|
+
"scripts/",
|
|
241
|
+
"README.md"
|
|
134
242
|
],
|
|
135
|
-
"scripts": {
|
|
136
|
-
"postinstall": "node scripts/generate-commands.js && node scripts/setup-mcps.js"
|
|
137
|
-
},
|
|
138
243
|
"preferGlobal": true,
|
|
139
244
|
"repository": {
|
|
140
245
|
"type": "git",
|
|
141
246
|
"url": "https://github.com/yamatovision/bluelamp-cli.git"
|
|
247
|
+
},
|
|
248
|
+
"devDependencies": {
|
|
249
|
+
"javascript-obfuscator": "^4.1.1",
|
|
250
|
+
"jest": "^30.2.0",
|
|
251
|
+
"terser": "^5.44.0"
|
|
142
252
|
}
|
|
143
|
-
}
|
|
253
|
+
}
|
package/scripts/build.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* BlueLamp CLI - Production Build Script
|
|
4
|
+
*
|
|
5
|
+
* 2ๆฎต้้ฃ่ชญๅๆฆ็ฅ:
|
|
6
|
+
* - Terser: ไธ่ฌใใกใคใซ๏ผ่ปฝ้็ธฎๅฐๅ๏ผ
|
|
7
|
+
* - javascript-obfuscator HIGH: ๆฉๅฏใใกใคใซ๏ผๅผทๅใชไฟ่ญท๏ผ
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require('fs').promises;
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
const PROJECT_ROOT = path.dirname(__dirname);
|
|
14
|
+
const SRC_DIR = PROJECT_ROOT; // ็พๅจใฏsrc/ใชใใๅพใง็งป่ก
|
|
15
|
+
const DIST_DIR = path.join(PROJECT_ROOT, 'dist');
|
|
16
|
+
|
|
17
|
+
// ๆฉๅฏใใกใคใซ๏ผHIGH้ฃ่ชญๅๅฏพ่ฑก๏ผ
|
|
18
|
+
const SENSITIVE_FILES = [
|
|
19
|
+
'lib/auth/InteractiveLogin.js',
|
|
20
|
+
'lib/auth/PortalAuthClient.js',
|
|
21
|
+
'lib/auth/TokenManager.js',
|
|
22
|
+
'lib/mcp-server/portal-api-client.cjs',
|
|
23
|
+
'bin/bluelamp-vscode-base',
|
|
24
|
+
'scripts/playwright-launch.js'
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
// ใใซใ้คๅคใใกใคใซ๏ผdevๅฐ็จใdistใซๅซใใชใ๏ผ
|
|
28
|
+
const BUILD_EXCLUDE_FILES = [
|
|
29
|
+
'build.js'
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
// ้ๅฆ็ใใกใคใซ๏ผใใฎใพใพใณใใผ๏ผ
|
|
33
|
+
const COPY_ONLY_FILES = [
|
|
34
|
+
'lib/agents/ใใซใผใฉใณใ.md',
|
|
35
|
+
'lib/mcp-password-manager/index.js',
|
|
36
|
+
'lib/mcp-gmail/index.js'
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
// HIGH้ฃ่ชญๅ่จญๅฎ๏ผๆฉๅฏใใกใคใซ็จ๏ผ
|
|
40
|
+
const HIGH_OBFUSCATION_OPTIONS = {
|
|
41
|
+
compact: true,
|
|
42
|
+
controlFlowFlattening: true,
|
|
43
|
+
controlFlowFlatteningThreshold: 0.75,
|
|
44
|
+
deadCodeInjection: true,
|
|
45
|
+
deadCodeInjectionThreshold: 0.4,
|
|
46
|
+
debugProtection: true,
|
|
47
|
+
debugProtectionInterval: 4000,
|
|
48
|
+
disableConsoleOutput: false,
|
|
49
|
+
identifierNamesGenerator: 'hexadecimal',
|
|
50
|
+
log: false,
|
|
51
|
+
numbersToExpressions: true,
|
|
52
|
+
renameGlobals: true,
|
|
53
|
+
selfDefending: true,
|
|
54
|
+
simplify: true,
|
|
55
|
+
splitStrings: true,
|
|
56
|
+
splitStringsChunkLength: 5,
|
|
57
|
+
stringArray: true,
|
|
58
|
+
stringArrayCallsTransform: true,
|
|
59
|
+
stringArrayCallsTransformThreshold: 0.8,
|
|
60
|
+
stringArrayEncoding: ['base64'],
|
|
61
|
+
stringArrayIndexShift: true,
|
|
62
|
+
stringArrayRotate: true,
|
|
63
|
+
stringArrayShuffle: true,
|
|
64
|
+
stringArrayWrappersCount: 2,
|
|
65
|
+
stringArrayWrappersChainedCalls: true,
|
|
66
|
+
stringArrayWrappersParametersMaxCount: 4,
|
|
67
|
+
stringArrayWrappersType: 'function',
|
|
68
|
+
stringArrayThreshold: 0.8,
|
|
69
|
+
transformObjectKeys: true,
|
|
70
|
+
unicodeEscapeSequence: false
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Terser่จญๅฎ๏ผไธ่ฌใใกใคใซ็จ๏ผ
|
|
74
|
+
const TERSER_OPTIONS = {
|
|
75
|
+
compress: {
|
|
76
|
+
dead_code: true,
|
|
77
|
+
drop_console: false,
|
|
78
|
+
drop_debugger: true,
|
|
79
|
+
passes: 2
|
|
80
|
+
},
|
|
81
|
+
mangle: {
|
|
82
|
+
reserved: ['require', 'module', 'exports', 'process', '__dirname', '__filename']
|
|
83
|
+
},
|
|
84
|
+
format: {
|
|
85
|
+
comments: false
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
class Logger {
|
|
90
|
+
static info(msg) { console.log(`\x1b[36m[INFO]\x1b[0m ${msg}`); }
|
|
91
|
+
static success(msg) { console.log(`\x1b[32m[OK]\x1b[0m ${msg}`); }
|
|
92
|
+
static warn(msg) { console.log(`\x1b[33m[WARN]\x1b[0m ${msg}`); }
|
|
93
|
+
static error(msg) { console.log(`\x1b[31m[ERROR]\x1b[0m ${msg}`); }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function ensureDir(dirPath) {
|
|
97
|
+
try {
|
|
98
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
99
|
+
} catch (e) {
|
|
100
|
+
if (e.code !== 'EEXIST') throw e;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function cleanDir(dirPath) {
|
|
105
|
+
try {
|
|
106
|
+
await fs.rm(dirPath, { recursive: true, force: true });
|
|
107
|
+
} catch (e) {
|
|
108
|
+
// ignore
|
|
109
|
+
}
|
|
110
|
+
await ensureDir(dirPath);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function isSensitiveFile(relativePath) {
|
|
114
|
+
return SENSITIVE_FILES.some(sf => relativePath.endsWith(sf) || relativePath === sf);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function isCopyOnlyFile(relativePath) {
|
|
118
|
+
return COPY_ONLY_FILES.some(cf => relativePath.endsWith(cf) || relativePath === cf);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function isJavaScriptFile(filePath) {
|
|
122
|
+
// .js, .cjs, ใพใใฏๆกๅผตๅญใชใใฎbin/ใใกใคใซ๏ผbluelamp-vscode-base๏ผ
|
|
123
|
+
if (filePath.endsWith('.js') || filePath.endsWith('.cjs')) return true;
|
|
124
|
+
// bin/bluelamp-vscode-base ใฏๆกๅผตๅญใใชใใJSใใกใคใซ
|
|
125
|
+
if (filePath.includes('bin/bluelamp-vscode-base')) return true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function processWithTerser(code, filePath) {
|
|
130
|
+
try {
|
|
131
|
+
const { minify } = require('terser');
|
|
132
|
+
const result = await minify(code, TERSER_OPTIONS);
|
|
133
|
+
if (result.error) throw result.error;
|
|
134
|
+
return result.code;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
Logger.warn(`Terser failed for ${filePath}, using original: ${error.message}`);
|
|
137
|
+
return code;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function processWithObfuscator(code) {
|
|
142
|
+
const JavaScriptObfuscator = require('javascript-obfuscator');
|
|
143
|
+
const result = JavaScriptObfuscator.obfuscate(code, HIGH_OBFUSCATION_OPTIONS);
|
|
144
|
+
return result.getObfuscatedCode();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function processFile(srcPath, destPath, relativePath) {
|
|
148
|
+
const content = await fs.readFile(srcPath, 'utf8');
|
|
149
|
+
|
|
150
|
+
// ้JSใใกใคใซใพใใฏใณใใผใฎใฟใใกใคใซ
|
|
151
|
+
if (!isJavaScriptFile(srcPath) || isCopyOnlyFile(relativePath)) {
|
|
152
|
+
await ensureDir(path.dirname(destPath));
|
|
153
|
+
await fs.writeFile(destPath, content, 'utf8');
|
|
154
|
+
Logger.info(`Copy: ${relativePath}`);
|
|
155
|
+
return 'copy';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// shebang่กใฎๆฝๅบ
|
|
159
|
+
let shebang = '';
|
|
160
|
+
let codeToProcess = content;
|
|
161
|
+
if (content.startsWith('#!')) {
|
|
162
|
+
const idx = content.indexOf('\n');
|
|
163
|
+
shebang = content.substring(0, idx + 1);
|
|
164
|
+
codeToProcess = content.substring(idx + 1);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
let processedCode;
|
|
168
|
+
let processType;
|
|
169
|
+
|
|
170
|
+
if (isSensitiveFile(relativePath)) {
|
|
171
|
+
// ๆฉๅฏใใกใคใซ: HIGH้ฃ่ชญๅ
|
|
172
|
+
processedCode = processWithObfuscator(codeToProcess);
|
|
173
|
+
processType = 'HIGH';
|
|
174
|
+
Logger.success(`HIGH obfuscate: ${relativePath}`);
|
|
175
|
+
} else {
|
|
176
|
+
// ไธ่ฌใใกใคใซ: Terser็ธฎๅฐๅ
|
|
177
|
+
processedCode = await processWithTerser(codeToProcess, relativePath);
|
|
178
|
+
processType = 'Terser';
|
|
179
|
+
Logger.info(`Terser minify: ${relativePath}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const finalCode = shebang + processedCode;
|
|
183
|
+
|
|
184
|
+
await ensureDir(path.dirname(destPath));
|
|
185
|
+
await fs.writeFile(destPath, finalCode, 'utf8');
|
|
186
|
+
|
|
187
|
+
// bin/ ใใใณ scripts/ ใใกใคใซใฎๅฎ่กๆจฉ้ๅพฉๅ
|
|
188
|
+
if (relativePath.startsWith('bin/') || relativePath.startsWith('scripts/')) {
|
|
189
|
+
await fs.chmod(destPath, 0o755);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return processType;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function collectFiles(dir, baseDir = dir) {
|
|
196
|
+
const files = [];
|
|
197
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
198
|
+
|
|
199
|
+
for (const entry of entries) {
|
|
200
|
+
const fullPath = path.join(dir, entry.name);
|
|
201
|
+
const relativePath = path.relative(baseDir, fullPath);
|
|
202
|
+
|
|
203
|
+
// ้คๅคใใฟใผใณ
|
|
204
|
+
if (entry.name.startsWith('.') ||
|
|
205
|
+
entry.name === 'node_modules' ||
|
|
206
|
+
entry.name === 'dist' ||
|
|
207
|
+
entry.name === 'release' ||
|
|
208
|
+
entry.name === 'docs' ||
|
|
209
|
+
BUILD_EXCLUDE_FILES.includes(entry.name) ||
|
|
210
|
+
entry.name === 'test-mcp.js' ||
|
|
211
|
+
entry.name === 'test-mcp-api.js' ||
|
|
212
|
+
entry.name.endsWith('.md') && !COPY_ONLY_FILES.includes(relativePath)) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (entry.isDirectory()) {
|
|
217
|
+
const subFiles = await collectFiles(fullPath, baseDir);
|
|
218
|
+
files.push(...subFiles);
|
|
219
|
+
} else {
|
|
220
|
+
files.push({ fullPath, relativePath });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return files;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async function main() {
|
|
228
|
+
const startTime = Date.now();
|
|
229
|
+
|
|
230
|
+
console.log('');
|
|
231
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
232
|
+
console.log('โ BlueLamp CLI - Production Build โ');
|
|
233
|
+
console.log('โ 2-Stage Obfuscation: Terser + HIGH โ');
|
|
234
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
235
|
+
console.log('');
|
|
236
|
+
|
|
237
|
+
// ไพๅญ้ขไฟใใงใใฏ
|
|
238
|
+
try {
|
|
239
|
+
require('terser');
|
|
240
|
+
require('javascript-obfuscator');
|
|
241
|
+
} catch (e) {
|
|
242
|
+
Logger.error('Missing dependencies. Run: npm install');
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// dist/ใใฏใชใผใณ
|
|
247
|
+
Logger.info('Cleaning dist/...');
|
|
248
|
+
await cleanDir(DIST_DIR);
|
|
249
|
+
|
|
250
|
+
// ๅฏพ่ฑกใใกใคใซๅ้
|
|
251
|
+
Logger.info('Collecting files...');
|
|
252
|
+
|
|
253
|
+
const targetDirs = ['bin', 'lib', 'scripts'];
|
|
254
|
+
const allFiles = [];
|
|
255
|
+
|
|
256
|
+
for (const dir of targetDirs) {
|
|
257
|
+
const dirPath = path.join(SRC_DIR, dir);
|
|
258
|
+
try {
|
|
259
|
+
const files = await collectFiles(dirPath, SRC_DIR);
|
|
260
|
+
allFiles.push(...files);
|
|
261
|
+
} catch (e) {
|
|
262
|
+
Logger.warn(`Directory not found: ${dir}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
Logger.info(`Found ${allFiles.length} files to process`);
|
|
267
|
+
console.log('');
|
|
268
|
+
|
|
269
|
+
// ใใกใคใซๅฆ็
|
|
270
|
+
const stats = { terser: 0, high: 0, copy: 0, error: 0 };
|
|
271
|
+
|
|
272
|
+
for (const file of allFiles) {
|
|
273
|
+
const destPath = path.join(DIST_DIR, file.relativePath);
|
|
274
|
+
|
|
275
|
+
try {
|
|
276
|
+
const type = await processFile(file.fullPath, destPath, file.relativePath);
|
|
277
|
+
if (type === 'Terser') stats.terser++;
|
|
278
|
+
else if (type === 'HIGH') stats.high++;
|
|
279
|
+
else stats.copy++;
|
|
280
|
+
} catch (error) {
|
|
281
|
+
Logger.error(`Failed: ${file.relativePath} - ${error.message}`);
|
|
282
|
+
stats.error++;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// package.json็ๆ๏ผdist็จใซ่ชฟๆด๏ผ
|
|
287
|
+
Logger.info('Generating dist/package.json...');
|
|
288
|
+
const pkgPath = path.join(SRC_DIR, 'package.json');
|
|
289
|
+
const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'));
|
|
290
|
+
|
|
291
|
+
// binใในใdist/็ธๅฏพใซๅคๆดใใชใ๏ผnpm publishใฏdist/ใใ่กใ๏ผ
|
|
292
|
+
const distPkg = {
|
|
293
|
+
name: pkg.name,
|
|
294
|
+
version: pkg.version,
|
|
295
|
+
description: pkg.description,
|
|
296
|
+
main: pkg.main.replace('lib/', './lib/'),
|
|
297
|
+
bin: {},
|
|
298
|
+
keywords: pkg.keywords,
|
|
299
|
+
author: pkg.author,
|
|
300
|
+
license: pkg.license,
|
|
301
|
+
dependencies: pkg.dependencies,
|
|
302
|
+
engines: pkg.engines,
|
|
303
|
+
files: ['bin/', 'lib/', 'scripts/'],
|
|
304
|
+
scripts: {
|
|
305
|
+
postinstall: 'node scripts/generate-commands.js && node scripts/setup-mcps.js'
|
|
306
|
+
},
|
|
307
|
+
preferGlobal: pkg.preferGlobal,
|
|
308
|
+
repository: pkg.repository
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
// binใในใ็ธๅฏพใในใซ
|
|
312
|
+
for (const [cmd, binPath] of Object.entries(pkg.bin)) {
|
|
313
|
+
distPkg.bin[cmd] = binPath.replace('./bin/', './bin/');
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
await fs.writeFile(
|
|
317
|
+
path.join(DIST_DIR, 'package.json'),
|
|
318
|
+
JSON.stringify(distPkg, null, 2),
|
|
319
|
+
'utf8'
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
// ็ตๆ่กจ็คบ
|
|
323
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
324
|
+
|
|
325
|
+
console.log('');
|
|
326
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
327
|
+
console.log('โ Build Complete โ');
|
|
328
|
+
console.log('โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฃ');
|
|
329
|
+
console.log(`โ Terser (general): ${String(stats.terser).padStart(3)} files โ`);
|
|
330
|
+
console.log(`โ HIGH (sensitive): ${String(stats.high).padStart(3)} files โ`);
|
|
331
|
+
console.log(`โ Copy only: ${String(stats.copy).padStart(3)} files โ`);
|
|
332
|
+
console.log(`โ Errors: ${String(stats.error).padStart(3)} files โ`);
|
|
333
|
+
console.log(`โ Time: ${duration.padStart(5)}s โ`);
|
|
334
|
+
console.log('โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฃ');
|
|
335
|
+
console.log('โ Output: dist/ โ');
|
|
336
|
+
console.log('โ โ');
|
|
337
|
+
console.log('โ To publish: โ');
|
|
338
|
+
console.log('โ cd dist && npm publish โ');
|
|
339
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
340
|
+
console.log('');
|
|
341
|
+
|
|
342
|
+
if (stats.error > 0) {
|
|
343
|
+
process.exit(1);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
main().catch(e => {
|
|
348
|
+
Logger.error(e.message);
|
|
349
|
+
process.exit(1);
|
|
350
|
+
});
|
|
@@ -1,2 +1,45 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* BlueLamp ใณใใณใ็ๆในใฏใชใใ
|
|
5
|
+
* bluelamp1ใ100 ใฎ100ๅใฎใณใใณใใใกใคใซใ่ชๅ็ๆ
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
const binDir = path.join(__dirname, '..', 'bin');
|
|
12
|
+
const baseScript = path.join(binDir, 'bluelamp-vscode-base');
|
|
13
|
+
|
|
14
|
+
// ็ๆใใใณใใณใๆฐ๏ผ100ในใญใใๅฏพๅฟ๏ผ
|
|
15
|
+
const MAX_SLOTS = 100;
|
|
16
|
+
|
|
17
|
+
console.log('๐ต BlueLamp ใณใใณใ็ๆ้ๅง...\n');
|
|
18
|
+
|
|
19
|
+
// bluelamp1ใ100 ใ็ๆ
|
|
20
|
+
let createdCount = 0;
|
|
21
|
+
for (let i = 1; i <= MAX_SLOTS; i++) {
|
|
22
|
+
const commandName = `bluelamp${i}`;
|
|
23
|
+
const commandPath = path.join(binDir, commandName);
|
|
24
|
+
|
|
25
|
+
// ใฉใใใผในใฏใชใใใไฝๆ
|
|
26
|
+
const content = `#!/usr/bin/env node
|
|
27
|
+
require('./bluelamp-vscode-base');
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
fs.writeFileSync(commandPath, content);
|
|
31
|
+
fs.chmodSync(commandPath, '755');
|
|
32
|
+
createdCount++;
|
|
33
|
+
|
|
34
|
+
// ้ฒๆ่กจ็คบ๏ผ10ๅใใจ๏ผ
|
|
35
|
+
if (i % 10 === 0) {
|
|
36
|
+
console.log(` โ
bluelamp1ใ${i} ไฝๆๅฎไบ`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ใใผในในใฏใชใใใซใๅฎ่กๆจฉ้ใไปไธ
|
|
41
|
+
if (fs.existsSync(baseScript)) {
|
|
42
|
+
fs.chmodSync(baseScript, '755');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log(`\nโจ ${createdCount}ๅใฎใณใใณใใใกใคใซใ็ๆใใพใใ (bluelamp1ใbluelamp${MAX_SLOTS})`);
|