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.
Files changed (218) hide show
  1. package/README.md +78 -0
  2. package/bin/bluelamp-vscode-base +357 -1
  3. package/bin/bluelamp1 +0 -0
  4. package/bin/bluelamp10 +0 -0
  5. package/bin/bluelamp100 +0 -0
  6. package/bin/bluelamp101 +2 -0
  7. package/bin/bluelamp102 +2 -0
  8. package/bin/bluelamp103 +2 -0
  9. package/bin/bluelamp104 +2 -0
  10. package/bin/bluelamp105 +2 -0
  11. package/bin/bluelamp106 +2 -0
  12. package/bin/bluelamp107 +2 -0
  13. package/bin/bluelamp108 +2 -0
  14. package/bin/bluelamp109 +2 -0
  15. package/bin/bluelamp11 +0 -0
  16. package/bin/bluelamp110 +2 -0
  17. package/bin/bluelamp111 +2 -0
  18. package/bin/bluelamp112 +2 -0
  19. package/bin/bluelamp113 +2 -0
  20. package/bin/bluelamp114 +2 -0
  21. package/bin/bluelamp115 +2 -0
  22. package/bin/bluelamp116 +2 -0
  23. package/bin/bluelamp117 +2 -0
  24. package/bin/bluelamp118 +2 -0
  25. package/bin/bluelamp119 +2 -0
  26. package/bin/bluelamp12 +0 -0
  27. package/bin/bluelamp120 +2 -0
  28. package/bin/bluelamp121 +2 -0
  29. package/bin/bluelamp122 +2 -0
  30. package/bin/bluelamp123 +2 -0
  31. package/bin/bluelamp124 +2 -0
  32. package/bin/bluelamp125 +2 -0
  33. package/bin/bluelamp126 +2 -0
  34. package/bin/bluelamp127 +2 -0
  35. package/bin/bluelamp128 +2 -0
  36. package/bin/bluelamp129 +2 -0
  37. package/bin/bluelamp13 +0 -0
  38. package/bin/bluelamp130 +2 -0
  39. package/bin/bluelamp131 +2 -0
  40. package/bin/bluelamp132 +2 -0
  41. package/bin/bluelamp133 +2 -0
  42. package/bin/bluelamp134 +2 -0
  43. package/bin/bluelamp135 +2 -0
  44. package/bin/bluelamp136 +2 -0
  45. package/bin/bluelamp137 +2 -0
  46. package/bin/bluelamp138 +2 -0
  47. package/bin/bluelamp139 +2 -0
  48. package/bin/bluelamp14 +0 -0
  49. package/bin/bluelamp140 +2 -0
  50. package/bin/bluelamp141 +2 -0
  51. package/bin/bluelamp142 +2 -0
  52. package/bin/bluelamp143 +2 -0
  53. package/bin/bluelamp144 +2 -0
  54. package/bin/bluelamp145 +2 -0
  55. package/bin/bluelamp146 +2 -0
  56. package/bin/bluelamp147 +2 -0
  57. package/bin/bluelamp148 +2 -0
  58. package/bin/bluelamp149 +2 -0
  59. package/bin/bluelamp15 +0 -0
  60. package/bin/bluelamp150 +2 -0
  61. package/bin/bluelamp151 +2 -0
  62. package/bin/bluelamp152 +2 -0
  63. package/bin/bluelamp153 +2 -0
  64. package/bin/bluelamp154 +2 -0
  65. package/bin/bluelamp155 +2 -0
  66. package/bin/bluelamp156 +2 -0
  67. package/bin/bluelamp157 +2 -0
  68. package/bin/bluelamp158 +2 -0
  69. package/bin/bluelamp159 +2 -0
  70. package/bin/bluelamp16 +0 -0
  71. package/bin/bluelamp160 +2 -0
  72. package/bin/bluelamp161 +2 -0
  73. package/bin/bluelamp162 +2 -0
  74. package/bin/bluelamp163 +2 -0
  75. package/bin/bluelamp164 +2 -0
  76. package/bin/bluelamp165 +2 -0
  77. package/bin/bluelamp166 +2 -0
  78. package/bin/bluelamp167 +2 -0
  79. package/bin/bluelamp168 +2 -0
  80. package/bin/bluelamp169 +2 -0
  81. package/bin/bluelamp17 +0 -0
  82. package/bin/bluelamp170 +2 -0
  83. package/bin/bluelamp171 +2 -0
  84. package/bin/bluelamp172 +2 -0
  85. package/bin/bluelamp173 +2 -0
  86. package/bin/bluelamp174 +2 -0
  87. package/bin/bluelamp175 +2 -0
  88. package/bin/bluelamp176 +2 -0
  89. package/bin/bluelamp177 +2 -0
  90. package/bin/bluelamp178 +2 -0
  91. package/bin/bluelamp179 +2 -0
  92. package/bin/bluelamp18 +0 -0
  93. package/bin/bluelamp180 +2 -0
  94. package/bin/bluelamp181 +2 -0
  95. package/bin/bluelamp182 +2 -0
  96. package/bin/bluelamp183 +2 -0
  97. package/bin/bluelamp184 +2 -0
  98. package/bin/bluelamp185 +2 -0
  99. package/bin/bluelamp186 +2 -0
  100. package/bin/bluelamp187 +2 -0
  101. package/bin/bluelamp188 +2 -0
  102. package/bin/bluelamp189 +2 -0
  103. package/bin/bluelamp19 +0 -0
  104. package/bin/bluelamp190 +2 -0
  105. package/bin/bluelamp191 +2 -0
  106. package/bin/bluelamp192 +2 -0
  107. package/bin/bluelamp193 +2 -0
  108. package/bin/bluelamp194 +2 -0
  109. package/bin/bluelamp195 +2 -0
  110. package/bin/bluelamp196 +2 -0
  111. package/bin/bluelamp197 +2 -0
  112. package/bin/bluelamp198 +2 -0
  113. package/bin/bluelamp199 +2 -0
  114. package/bin/bluelamp2 +0 -0
  115. package/bin/bluelamp20 +0 -0
  116. package/bin/bluelamp200 +2 -0
  117. package/bin/bluelamp21 +0 -0
  118. package/bin/bluelamp22 +0 -0
  119. package/bin/bluelamp23 +0 -0
  120. package/bin/bluelamp24 +0 -0
  121. package/bin/bluelamp25 +0 -0
  122. package/bin/bluelamp26 +0 -0
  123. package/bin/bluelamp27 +0 -0
  124. package/bin/bluelamp28 +0 -0
  125. package/bin/bluelamp29 +0 -0
  126. package/bin/bluelamp3 +0 -0
  127. package/bin/bluelamp30 +0 -0
  128. package/bin/bluelamp31 +0 -0
  129. package/bin/bluelamp32 +0 -0
  130. package/bin/bluelamp33 +0 -0
  131. package/bin/bluelamp34 +0 -0
  132. package/bin/bluelamp35 +0 -0
  133. package/bin/bluelamp36 +0 -0
  134. package/bin/bluelamp37 +0 -0
  135. package/bin/bluelamp38 +0 -0
  136. package/bin/bluelamp39 +0 -0
  137. package/bin/bluelamp4 +0 -0
  138. package/bin/bluelamp40 +0 -0
  139. package/bin/bluelamp41 +0 -0
  140. package/bin/bluelamp42 +0 -0
  141. package/bin/bluelamp43 +0 -0
  142. package/bin/bluelamp44 +0 -0
  143. package/bin/bluelamp45 +0 -0
  144. package/bin/bluelamp46 +0 -0
  145. package/bin/bluelamp47 +0 -0
  146. package/bin/bluelamp48 +0 -0
  147. package/bin/bluelamp49 +0 -0
  148. package/bin/bluelamp5 +0 -0
  149. package/bin/bluelamp50 +0 -0
  150. package/bin/bluelamp51 +0 -0
  151. package/bin/bluelamp52 +0 -0
  152. package/bin/bluelamp53 +0 -0
  153. package/bin/bluelamp54 +0 -0
  154. package/bin/bluelamp55 +0 -0
  155. package/bin/bluelamp56 +0 -0
  156. package/bin/bluelamp57 +0 -0
  157. package/bin/bluelamp58 +0 -0
  158. package/bin/bluelamp59 +0 -0
  159. package/bin/bluelamp6 +0 -0
  160. package/bin/bluelamp60 +0 -0
  161. package/bin/bluelamp61 +0 -0
  162. package/bin/bluelamp62 +0 -0
  163. package/bin/bluelamp63 +0 -0
  164. package/bin/bluelamp64 +0 -0
  165. package/bin/bluelamp65 +0 -0
  166. package/bin/bluelamp66 +0 -0
  167. package/bin/bluelamp67 +0 -0
  168. package/bin/bluelamp68 +0 -0
  169. package/bin/bluelamp69 +0 -0
  170. package/bin/bluelamp7 +0 -0
  171. package/bin/bluelamp70 +0 -0
  172. package/bin/bluelamp71 +0 -0
  173. package/bin/bluelamp72 +0 -0
  174. package/bin/bluelamp73 +0 -0
  175. package/bin/bluelamp74 +0 -0
  176. package/bin/bluelamp75 +0 -0
  177. package/bin/bluelamp76 +0 -0
  178. package/bin/bluelamp77 +0 -0
  179. package/bin/bluelamp78 +0 -0
  180. package/bin/bluelamp79 +0 -0
  181. package/bin/bluelamp8 +0 -0
  182. package/bin/bluelamp80 +0 -0
  183. package/bin/bluelamp81 +0 -0
  184. package/bin/bluelamp82 +0 -0
  185. package/bin/bluelamp83 +0 -0
  186. package/bin/bluelamp84 +0 -0
  187. package/bin/bluelamp85 +0 -0
  188. package/bin/bluelamp86 +0 -0
  189. package/bin/bluelamp87 +0 -0
  190. package/bin/bluelamp88 +0 -0
  191. package/bin/bluelamp89 +0 -0
  192. package/bin/bluelamp9 +0 -0
  193. package/bin/bluelamp90 +0 -0
  194. package/bin/bluelamp91 +0 -0
  195. package/bin/bluelamp92 +0 -0
  196. package/bin/bluelamp93 +0 -0
  197. package/bin/bluelamp94 +0 -0
  198. package/bin/bluelamp95 +0 -0
  199. package/bin/bluelamp96 +0 -0
  200. package/bin/bluelamp97 +0 -0
  201. package/bin/bluelamp98 +0 -0
  202. package/bin/bluelamp99 +0 -0
  203. package/lib/auth/InteractiveLogin.js +253 -1
  204. package/lib/auth/PortalAuthClient.js +184 -1
  205. package/lib/auth/TokenManager.js +260 -1
  206. package/lib/i18n/en.json +2 -2
  207. package/lib/i18n/index.js +75 -1
  208. package/lib/i18n/ja.json +2 -2
  209. package/lib/mcp-server/index.cjs +452 -1
  210. package/lib/mcp-server/portal-api-client.cjs +634 -1
  211. package/lib/utils/logger.js +83 -1
  212. package/package.json +118 -8
  213. package/scripts/build.js +350 -0
  214. package/scripts/generate-commands.js +44 -1
  215. package/scripts/playwright-launch.js +221 -1
  216. package/scripts/setup-mcps.js +124 -1
  217. package/scripts/setup-playwright.js +61 -1
  218. package/lib/mcp-gmail/credentials.json +0 -1
@@ -1 +1,83 @@
1
- const LOG_LEVELS={debug:0,info:1,warn:2,error:3,silent:4},LOG_LEVEL=process.env.BLUELAMP_LOG_LEVEL||"info",currentLevel=LOG_LEVELS[LOG_LEVEL]??LOG_LEVELS.info;function formatMessage(e,r){return`[${(new Date).toISOString()}] [${e.toUpperCase()}] ${r}`}const logger={debug(e){currentLevel<=LOG_LEVELS.debug&&console.error(formatMessage("debug",e))},info(e){currentLevel<=LOG_LEVELS.info&&console.error(formatMessage("info",e))},warn(e){currentLevel<=LOG_LEVELS.warn&&console.warn(formatMessage("warn",e))},error(e){currentLevel<=LOG_LEVELS.error&&console.error(formatMessage("error",e))},getLevel:()=>LOG_LEVEL};module.exports={logger:logger,LOG_LEVELS:LOG_LEVELS};
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.2",
3
+ "version": "4.3.4",
4
4
  "description": "BlueLamp MCP Server - 100 Customizable Development Prompts for Claude Code",
5
- "main": "./lib/mcp-server/index.cjs",
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
+ }
@@ -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
- const fs=require("fs"),path=require("path"),binDir=path.join(__dirname,"..","bin"),baseScript=path.join(binDir,"bluelamp-vscode-base"),MAX_SLOTS=100;console.log("๐Ÿ”ต BlueLamp ใ‚ณใƒžใƒณใƒ‰็”Ÿๆˆ้–‹ๅง‹...\n");let createdCount=0;for(let e=1;e<=100;e++){const n=`bluelamp${e}`,o=path.join(binDir,n),l="#!/usr/bin/env node\nrequire('./bluelamp-vscode-base');\n";fs.writeFileSync(o,l),fs.chmodSync(o,"755"),createdCount++,e%10==0&&console.log(` โœ… bluelamp1ใ€œ${e} ไฝœๆˆๅฎŒไบ†`)}fs.existsSync(baseScript)&&fs.chmodSync(baseScript,"755"),console.log(`\nโœจ ${createdCount}ๅ€‹ใฎใ‚ณใƒžใƒณใƒ‰ใƒ•ใ‚กใ‚คใƒซใ‚’็”Ÿๆˆใ—ใพใ—ใŸ (bluelamp1ใ€œbluelamp100)`);
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})`);