yamatovision 1.0.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.
Potentially problematic release.
This version of yamatovision might be problematic. Click here for more details.
- package/README.md +14 -0
- package/bin/bluelamp-vscode-base +325 -0
- package/bin/bluelamp1 +2 -0
- package/bin/bluelamp10 +2 -0
- package/bin/bluelamp100 +2 -0
- package/bin/bluelamp11 +2 -0
- package/bin/bluelamp12 +2 -0
- package/bin/bluelamp13 +2 -0
- package/bin/bluelamp14 +2 -0
- package/bin/bluelamp15 +2 -0
- package/bin/bluelamp16 +2 -0
- package/bin/bluelamp17 +2 -0
- package/bin/bluelamp18 +2 -0
- package/bin/bluelamp19 +2 -0
- package/bin/bluelamp2 +2 -0
- package/bin/bluelamp20 +2 -0
- package/bin/bluelamp21 +2 -0
- package/bin/bluelamp22 +2 -0
- package/bin/bluelamp23 +2 -0
- package/bin/bluelamp24 +2 -0
- package/bin/bluelamp25 +2 -0
- package/bin/bluelamp26 +2 -0
- package/bin/bluelamp27 +2 -0
- package/bin/bluelamp28 +2 -0
- package/bin/bluelamp29 +2 -0
- package/bin/bluelamp3 +2 -0
- package/bin/bluelamp30 +2 -0
- package/bin/bluelamp31 +2 -0
- package/bin/bluelamp32 +2 -0
- package/bin/bluelamp33 +2 -0
- package/bin/bluelamp34 +2 -0
- package/bin/bluelamp35 +2 -0
- package/bin/bluelamp36 +2 -0
- package/bin/bluelamp37 +2 -0
- package/bin/bluelamp38 +2 -0
- package/bin/bluelamp39 +2 -0
- package/bin/bluelamp4 +2 -0
- package/bin/bluelamp40 +2 -0
- package/bin/bluelamp41 +2 -0
- package/bin/bluelamp42 +2 -0
- package/bin/bluelamp43 +2 -0
- package/bin/bluelamp44 +2 -0
- package/bin/bluelamp45 +2 -0
- package/bin/bluelamp46 +2 -0
- package/bin/bluelamp47 +2 -0
- package/bin/bluelamp48 +2 -0
- package/bin/bluelamp49 +2 -0
- package/bin/bluelamp5 +2 -0
- package/bin/bluelamp50 +2 -0
- package/bin/bluelamp51 +2 -0
- package/bin/bluelamp52 +2 -0
- package/bin/bluelamp53 +2 -0
- package/bin/bluelamp54 +2 -0
- package/bin/bluelamp55 +2 -0
- package/bin/bluelamp56 +2 -0
- package/bin/bluelamp57 +2 -0
- package/bin/bluelamp58 +2 -0
- package/bin/bluelamp59 +2 -0
- package/bin/bluelamp6 +2 -0
- package/bin/bluelamp60 +2 -0
- package/bin/bluelamp61 +2 -0
- package/bin/bluelamp62 +2 -0
- package/bin/bluelamp63 +2 -0
- package/bin/bluelamp64 +2 -0
- package/bin/bluelamp65 +2 -0
- package/bin/bluelamp66 +2 -0
- package/bin/bluelamp67 +2 -0
- package/bin/bluelamp68 +2 -0
- package/bin/bluelamp69 +2 -0
- package/bin/bluelamp7 +2 -0
- package/bin/bluelamp70 +2 -0
- package/bin/bluelamp71 +2 -0
- package/bin/bluelamp72 +2 -0
- package/bin/bluelamp73 +2 -0
- package/bin/bluelamp74 +2 -0
- package/bin/bluelamp75 +2 -0
- package/bin/bluelamp76 +2 -0
- package/bin/bluelamp77 +2 -0
- package/bin/bluelamp78 +2 -0
- package/bin/bluelamp79 +2 -0
- package/bin/bluelamp8 +2 -0
- package/bin/bluelamp80 +2 -0
- package/bin/bluelamp81 +2 -0
- package/bin/bluelamp82 +2 -0
- package/bin/bluelamp83 +2 -0
- package/bin/bluelamp84 +2 -0
- package/bin/bluelamp85 +2 -0
- package/bin/bluelamp86 +2 -0
- package/bin/bluelamp87 +2 -0
- package/bin/bluelamp88 +2 -0
- package/bin/bluelamp89 +2 -0
- package/bin/bluelamp9 +2 -0
- package/bin/bluelamp90 +2 -0
- package/bin/bluelamp91 +2 -0
- package/bin/bluelamp92 +2 -0
- package/bin/bluelamp93 +2 -0
- package/bin/bluelamp94 +2 -0
- package/bin/bluelamp95 +2 -0
- package/bin/bluelamp96 +2 -0
- package/bin/bluelamp97 +2 -0
- package/bin/bluelamp98 +2 -0
- package/bin/bluelamp99 +2 -0
- package/bin/musuhi1 +2 -0
- package/bin/musuhi10 +2 -0
- package/bin/musuhi100 +2 -0
- package/bin/musuhi11 +2 -0
- package/bin/musuhi12 +2 -0
- package/bin/musuhi13 +2 -0
- package/bin/musuhi14 +2 -0
- package/bin/musuhi15 +2 -0
- package/bin/musuhi16 +2 -0
- package/bin/musuhi17 +2 -0
- package/bin/musuhi18 +2 -0
- package/bin/musuhi19 +2 -0
- package/bin/musuhi2 +2 -0
- package/bin/musuhi20 +2 -0
- package/bin/musuhi21 +2 -0
- package/bin/musuhi22 +2 -0
- package/bin/musuhi23 +2 -0
- package/bin/musuhi24 +2 -0
- package/bin/musuhi25 +2 -0
- package/bin/musuhi26 +2 -0
- package/bin/musuhi27 +2 -0
- package/bin/musuhi28 +2 -0
- package/bin/musuhi29 +2 -0
- package/bin/musuhi3 +2 -0
- package/bin/musuhi30 +2 -0
- package/bin/musuhi31 +2 -0
- package/bin/musuhi32 +2 -0
- package/bin/musuhi33 +2 -0
- package/bin/musuhi34 +2 -0
- package/bin/musuhi35 +2 -0
- package/bin/musuhi36 +2 -0
- package/bin/musuhi37 +2 -0
- package/bin/musuhi38 +2 -0
- package/bin/musuhi39 +2 -0
- package/bin/musuhi4 +2 -0
- package/bin/musuhi40 +2 -0
- package/bin/musuhi41 +2 -0
- package/bin/musuhi42 +2 -0
- package/bin/musuhi43 +2 -0
- package/bin/musuhi44 +2 -0
- package/bin/musuhi45 +2 -0
- package/bin/musuhi46 +2 -0
- package/bin/musuhi47 +2 -0
- package/bin/musuhi48 +2 -0
- package/bin/musuhi49 +2 -0
- package/bin/musuhi5 +2 -0
- package/bin/musuhi50 +2 -0
- package/bin/musuhi51 +2 -0
- package/bin/musuhi52 +2 -0
- package/bin/musuhi53 +2 -0
- package/bin/musuhi54 +2 -0
- package/bin/musuhi55 +2 -0
- package/bin/musuhi56 +2 -0
- package/bin/musuhi57 +2 -0
- package/bin/musuhi58 +2 -0
- package/bin/musuhi59 +2 -0
- package/bin/musuhi6 +2 -0
- package/bin/musuhi60 +2 -0
- package/bin/musuhi61 +2 -0
- package/bin/musuhi62 +2 -0
- package/bin/musuhi63 +2 -0
- package/bin/musuhi64 +2 -0
- package/bin/musuhi65 +2 -0
- package/bin/musuhi66 +2 -0
- package/bin/musuhi67 +2 -0
- package/bin/musuhi68 +2 -0
- package/bin/musuhi69 +2 -0
- package/bin/musuhi7 +2 -0
- package/bin/musuhi70 +2 -0
- package/bin/musuhi71 +2 -0
- package/bin/musuhi72 +2 -0
- package/bin/musuhi73 +2 -0
- package/bin/musuhi74 +2 -0
- package/bin/musuhi75 +2 -0
- package/bin/musuhi76 +2 -0
- package/bin/musuhi77 +2 -0
- package/bin/musuhi78 +2 -0
- package/bin/musuhi79 +2 -0
- package/bin/musuhi8 +2 -0
- package/bin/musuhi80 +2 -0
- package/bin/musuhi81 +2 -0
- package/bin/musuhi82 +2 -0
- package/bin/musuhi83 +2 -0
- package/bin/musuhi84 +2 -0
- package/bin/musuhi85 +2 -0
- package/bin/musuhi86 +2 -0
- package/bin/musuhi87 +2 -0
- package/bin/musuhi88 +2 -0
- package/bin/musuhi89 +2 -0
- package/bin/musuhi9 +2 -0
- package/bin/musuhi90 +2 -0
- package/bin/musuhi91 +2 -0
- package/bin/musuhi92 +2 -0
- package/bin/musuhi93 +2 -0
- package/bin/musuhi94 +2 -0
- package/bin/musuhi95 +2 -0
- package/bin/musuhi96 +2 -0
- package/bin/musuhi97 +2 -0
- package/bin/musuhi98 +2 -0
- package/bin/musuhi99 +2 -0
- package/lib/agents//343/203/226/343/203/253/343/203/274/343/203/251/343/203/263/343/203/227.md +106 -0
- package/lib/auth/InteractiveLogin.js +253 -0
- package/lib/auth/PortalAuthClient.js +184 -0
- package/lib/auth/TokenManager.js +260 -0
- package/lib/i18n/en.json +136 -0
- package/lib/i18n/index.js +75 -0
- package/lib/i18n/ja.json +136 -0
- package/lib/mcp-server/index.cjs +536 -0
- package/lib/mcp-server/portal-api-client.cjs +586 -0
- package/lib/utils/logger.js +83 -0
- package/package.json +155 -0
- package/scripts/build.js +348 -0
- package/scripts/generate-commands.js +45 -0
- package/scripts/playwright-launch.js +141 -0
- package/scripts/setup-playwright.js +62 -0
package/package.json
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "yamatovision",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "むすひ MCP Server - 100 Customizable Development Prompts for Claude Code",
|
|
5
|
+
"main": "lib/mcp-server/index.cjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"musuhi1": "./bin/musuhi1",
|
|
8
|
+
"musuhi2": "./bin/musuhi2",
|
|
9
|
+
"musuhi3": "./bin/musuhi3",
|
|
10
|
+
"musuhi4": "./bin/musuhi4",
|
|
11
|
+
"musuhi5": "./bin/musuhi5",
|
|
12
|
+
"musuhi6": "./bin/musuhi6",
|
|
13
|
+
"musuhi7": "./bin/musuhi7",
|
|
14
|
+
"musuhi8": "./bin/musuhi8",
|
|
15
|
+
"musuhi9": "./bin/musuhi9",
|
|
16
|
+
"musuhi10": "./bin/musuhi10",
|
|
17
|
+
"musuhi11": "./bin/musuhi11",
|
|
18
|
+
"musuhi12": "./bin/musuhi12",
|
|
19
|
+
"musuhi13": "./bin/musuhi13",
|
|
20
|
+
"musuhi14": "./bin/musuhi14",
|
|
21
|
+
"musuhi15": "./bin/musuhi15",
|
|
22
|
+
"musuhi16": "./bin/musuhi16",
|
|
23
|
+
"musuhi17": "./bin/musuhi17",
|
|
24
|
+
"musuhi18": "./bin/musuhi18",
|
|
25
|
+
"musuhi19": "./bin/musuhi19",
|
|
26
|
+
"musuhi20": "./bin/musuhi20",
|
|
27
|
+
"musuhi21": "./bin/musuhi21",
|
|
28
|
+
"musuhi22": "./bin/musuhi22",
|
|
29
|
+
"musuhi23": "./bin/musuhi23",
|
|
30
|
+
"musuhi24": "./bin/musuhi24",
|
|
31
|
+
"musuhi25": "./bin/musuhi25",
|
|
32
|
+
"musuhi26": "./bin/musuhi26",
|
|
33
|
+
"musuhi27": "./bin/musuhi27",
|
|
34
|
+
"musuhi28": "./bin/musuhi28",
|
|
35
|
+
"musuhi29": "./bin/musuhi29",
|
|
36
|
+
"musuhi30": "./bin/musuhi30",
|
|
37
|
+
"musuhi31": "./bin/musuhi31",
|
|
38
|
+
"musuhi32": "./bin/musuhi32",
|
|
39
|
+
"musuhi33": "./bin/musuhi33",
|
|
40
|
+
"musuhi34": "./bin/musuhi34",
|
|
41
|
+
"musuhi35": "./bin/musuhi35",
|
|
42
|
+
"musuhi36": "./bin/musuhi36",
|
|
43
|
+
"musuhi37": "./bin/musuhi37",
|
|
44
|
+
"musuhi38": "./bin/musuhi38",
|
|
45
|
+
"musuhi39": "./bin/musuhi39",
|
|
46
|
+
"musuhi40": "./bin/musuhi40",
|
|
47
|
+
"musuhi41": "./bin/musuhi41",
|
|
48
|
+
"musuhi42": "./bin/musuhi42",
|
|
49
|
+
"musuhi43": "./bin/musuhi43",
|
|
50
|
+
"musuhi44": "./bin/musuhi44",
|
|
51
|
+
"musuhi45": "./bin/musuhi45",
|
|
52
|
+
"musuhi46": "./bin/musuhi46",
|
|
53
|
+
"musuhi47": "./bin/musuhi47",
|
|
54
|
+
"musuhi48": "./bin/musuhi48",
|
|
55
|
+
"musuhi49": "./bin/musuhi49",
|
|
56
|
+
"musuhi50": "./bin/musuhi50",
|
|
57
|
+
"musuhi51": "./bin/musuhi51",
|
|
58
|
+
"musuhi52": "./bin/musuhi52",
|
|
59
|
+
"musuhi53": "./bin/musuhi53",
|
|
60
|
+
"musuhi54": "./bin/musuhi54",
|
|
61
|
+
"musuhi55": "./bin/musuhi55",
|
|
62
|
+
"musuhi56": "./bin/musuhi56",
|
|
63
|
+
"musuhi57": "./bin/musuhi57",
|
|
64
|
+
"musuhi58": "./bin/musuhi58",
|
|
65
|
+
"musuhi59": "./bin/musuhi59",
|
|
66
|
+
"musuhi60": "./bin/musuhi60",
|
|
67
|
+
"musuhi61": "./bin/musuhi61",
|
|
68
|
+
"musuhi62": "./bin/musuhi62",
|
|
69
|
+
"musuhi63": "./bin/musuhi63",
|
|
70
|
+
"musuhi64": "./bin/musuhi64",
|
|
71
|
+
"musuhi65": "./bin/musuhi65",
|
|
72
|
+
"musuhi66": "./bin/musuhi66",
|
|
73
|
+
"musuhi67": "./bin/musuhi67",
|
|
74
|
+
"musuhi68": "./bin/musuhi68",
|
|
75
|
+
"musuhi69": "./bin/musuhi69",
|
|
76
|
+
"musuhi70": "./bin/musuhi70",
|
|
77
|
+
"musuhi71": "./bin/musuhi71",
|
|
78
|
+
"musuhi72": "./bin/musuhi72",
|
|
79
|
+
"musuhi73": "./bin/musuhi73",
|
|
80
|
+
"musuhi74": "./bin/musuhi74",
|
|
81
|
+
"musuhi75": "./bin/musuhi75",
|
|
82
|
+
"musuhi76": "./bin/musuhi76",
|
|
83
|
+
"musuhi77": "./bin/musuhi77",
|
|
84
|
+
"musuhi78": "./bin/musuhi78",
|
|
85
|
+
"musuhi79": "./bin/musuhi79",
|
|
86
|
+
"musuhi80": "./bin/musuhi80",
|
|
87
|
+
"musuhi81": "./bin/musuhi81",
|
|
88
|
+
"musuhi82": "./bin/musuhi82",
|
|
89
|
+
"musuhi83": "./bin/musuhi83",
|
|
90
|
+
"musuhi84": "./bin/musuhi84",
|
|
91
|
+
"musuhi85": "./bin/musuhi85",
|
|
92
|
+
"musuhi86": "./bin/musuhi86",
|
|
93
|
+
"musuhi87": "./bin/musuhi87",
|
|
94
|
+
"musuhi88": "./bin/musuhi88",
|
|
95
|
+
"musuhi89": "./bin/musuhi89",
|
|
96
|
+
"musuhi90": "./bin/musuhi90",
|
|
97
|
+
"musuhi91": "./bin/musuhi91",
|
|
98
|
+
"musuhi92": "./bin/musuhi92",
|
|
99
|
+
"musuhi93": "./bin/musuhi93",
|
|
100
|
+
"musuhi94": "./bin/musuhi94",
|
|
101
|
+
"musuhi95": "./bin/musuhi95",
|
|
102
|
+
"musuhi96": "./bin/musuhi96",
|
|
103
|
+
"musuhi97": "./bin/musuhi97",
|
|
104
|
+
"musuhi98": "./bin/musuhi98",
|
|
105
|
+
"musuhi99": "./bin/musuhi99",
|
|
106
|
+
"musuhi100": "./bin/musuhi100"
|
|
107
|
+
},
|
|
108
|
+
"scripts": {
|
|
109
|
+
"postinstall": "node scripts/generate-commands.js && node scripts/setup-playwright.js",
|
|
110
|
+
"test": "jest",
|
|
111
|
+
"test:coverage": "jest --coverage",
|
|
112
|
+
"test:mcp": "node test-mcp.js",
|
|
113
|
+
"build": "node scripts/build.js"
|
|
114
|
+
},
|
|
115
|
+
"keywords": [
|
|
116
|
+
"vscode",
|
|
117
|
+
"musuhi",
|
|
118
|
+
"mcp",
|
|
119
|
+
"claude",
|
|
120
|
+
"knowledge-injection",
|
|
121
|
+
"development-prompts"
|
|
122
|
+
],
|
|
123
|
+
"author": "Mikoto Inc.",
|
|
124
|
+
"license": "MIT",
|
|
125
|
+
"dependencies": {
|
|
126
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
127
|
+
"dotenv": "^16.6.1",
|
|
128
|
+
"hono": "^4.11.3",
|
|
129
|
+
"jsonwebtoken": "^9.0.2",
|
|
130
|
+
"node-fetch": "^3.3.2"
|
|
131
|
+
},
|
|
132
|
+
"engines": {
|
|
133
|
+
"node": ">=18"
|
|
134
|
+
},
|
|
135
|
+
"files": [
|
|
136
|
+
"bin/",
|
|
137
|
+
"lib/",
|
|
138
|
+
"scripts/",
|
|
139
|
+
"README.md"
|
|
140
|
+
],
|
|
141
|
+
"preferGlobal": true,
|
|
142
|
+
"repository": {
|
|
143
|
+
"type": "git",
|
|
144
|
+
"url": "https://github.com/yamatovision/mcp-musuhi.git"
|
|
145
|
+
},
|
|
146
|
+
"homepage": "https://github.com/yamatovision/mcp-musuhi",
|
|
147
|
+
"bugs": {
|
|
148
|
+
"url": "https://github.com/yamatovision/mcp-musuhi/issues"
|
|
149
|
+
},
|
|
150
|
+
"devDependencies": {
|
|
151
|
+
"javascript-obfuscator": "^4.1.1",
|
|
152
|
+
"jest": "^30.2.0",
|
|
153
|
+
"terser": "^5.44.0"
|
|
154
|
+
}
|
|
155
|
+
}
|
package/scripts/build.js
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* むすひ 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/musuhi-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
|
+
];
|
|
36
|
+
|
|
37
|
+
// HIGH難読化設定(機密ファイル用)
|
|
38
|
+
const HIGH_OBFUSCATION_OPTIONS = {
|
|
39
|
+
compact: true,
|
|
40
|
+
controlFlowFlattening: true,
|
|
41
|
+
controlFlowFlatteningThreshold: 0.75,
|
|
42
|
+
deadCodeInjection: true,
|
|
43
|
+
deadCodeInjectionThreshold: 0.4,
|
|
44
|
+
debugProtection: true,
|
|
45
|
+
debugProtectionInterval: 4000,
|
|
46
|
+
disableConsoleOutput: false,
|
|
47
|
+
identifierNamesGenerator: 'hexadecimal',
|
|
48
|
+
log: false,
|
|
49
|
+
numbersToExpressions: true,
|
|
50
|
+
renameGlobals: true,
|
|
51
|
+
selfDefending: true,
|
|
52
|
+
simplify: true,
|
|
53
|
+
splitStrings: true,
|
|
54
|
+
splitStringsChunkLength: 5,
|
|
55
|
+
stringArray: true,
|
|
56
|
+
stringArrayCallsTransform: true,
|
|
57
|
+
stringArrayCallsTransformThreshold: 0.8,
|
|
58
|
+
stringArrayEncoding: ['base64'],
|
|
59
|
+
stringArrayIndexShift: true,
|
|
60
|
+
stringArrayRotate: true,
|
|
61
|
+
stringArrayShuffle: true,
|
|
62
|
+
stringArrayWrappersCount: 2,
|
|
63
|
+
stringArrayWrappersChainedCalls: true,
|
|
64
|
+
stringArrayWrappersParametersMaxCount: 4,
|
|
65
|
+
stringArrayWrappersType: 'function',
|
|
66
|
+
stringArrayThreshold: 0.8,
|
|
67
|
+
transformObjectKeys: true,
|
|
68
|
+
unicodeEscapeSequence: false
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// Terser設定(一般ファイル用)
|
|
72
|
+
const TERSER_OPTIONS = {
|
|
73
|
+
compress: {
|
|
74
|
+
dead_code: true,
|
|
75
|
+
drop_console: false,
|
|
76
|
+
drop_debugger: true,
|
|
77
|
+
passes: 2
|
|
78
|
+
},
|
|
79
|
+
mangle: {
|
|
80
|
+
reserved: ['require', 'module', 'exports', 'process', '__dirname', '__filename']
|
|
81
|
+
},
|
|
82
|
+
format: {
|
|
83
|
+
comments: false
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
class Logger {
|
|
88
|
+
static info(msg) { console.log(`\x1b[36m[INFO]\x1b[0m ${msg}`); }
|
|
89
|
+
static success(msg) { console.log(`\x1b[32m[OK]\x1b[0m ${msg}`); }
|
|
90
|
+
static warn(msg) { console.log(`\x1b[33m[WARN]\x1b[0m ${msg}`); }
|
|
91
|
+
static error(msg) { console.log(`\x1b[31m[ERROR]\x1b[0m ${msg}`); }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function ensureDir(dirPath) {
|
|
95
|
+
try {
|
|
96
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
97
|
+
} catch (e) {
|
|
98
|
+
if (e.code !== 'EEXIST') throw e;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function cleanDir(dirPath) {
|
|
103
|
+
try {
|
|
104
|
+
await fs.rm(dirPath, { recursive: true, force: true });
|
|
105
|
+
} catch (e) {
|
|
106
|
+
// ignore
|
|
107
|
+
}
|
|
108
|
+
await ensureDir(dirPath);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isSensitiveFile(relativePath) {
|
|
112
|
+
return SENSITIVE_FILES.some(sf => relativePath.endsWith(sf) || relativePath === sf);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function isCopyOnlyFile(relativePath) {
|
|
116
|
+
return COPY_ONLY_FILES.some(cf => relativePath.endsWith(cf) || relativePath === cf);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function isJavaScriptFile(filePath) {
|
|
120
|
+
// .js, .cjs, または拡張子なしのbin/ファイル(musuhi-vscode-base)
|
|
121
|
+
if (filePath.endsWith('.js') || filePath.endsWith('.cjs')) return true;
|
|
122
|
+
// bin/musuhi-vscode-base は拡張子がないがJSファイル
|
|
123
|
+
if (filePath.includes('bin/musuhi-vscode-base')) return true;
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function processWithTerser(code, filePath) {
|
|
128
|
+
try {
|
|
129
|
+
const { minify } = require('terser');
|
|
130
|
+
const result = await minify(code, TERSER_OPTIONS);
|
|
131
|
+
if (result.error) throw result.error;
|
|
132
|
+
return result.code;
|
|
133
|
+
} catch (error) {
|
|
134
|
+
Logger.warn(`Terser failed for ${filePath}, using original: ${error.message}`);
|
|
135
|
+
return code;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function processWithObfuscator(code) {
|
|
140
|
+
const JavaScriptObfuscator = require('javascript-obfuscator');
|
|
141
|
+
const result = JavaScriptObfuscator.obfuscate(code, HIGH_OBFUSCATION_OPTIONS);
|
|
142
|
+
return result.getObfuscatedCode();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function processFile(srcPath, destPath, relativePath) {
|
|
146
|
+
const content = await fs.readFile(srcPath, 'utf8');
|
|
147
|
+
|
|
148
|
+
// 非JSファイルまたはコピーのみファイル
|
|
149
|
+
if (!isJavaScriptFile(srcPath) || isCopyOnlyFile(relativePath)) {
|
|
150
|
+
await ensureDir(path.dirname(destPath));
|
|
151
|
+
await fs.writeFile(destPath, content, 'utf8');
|
|
152
|
+
Logger.info(`Copy: ${relativePath}`);
|
|
153
|
+
return 'copy';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// shebang行の抽出
|
|
157
|
+
let shebang = '';
|
|
158
|
+
let codeToProcess = content;
|
|
159
|
+
if (content.startsWith('#!')) {
|
|
160
|
+
const idx = content.indexOf('\n');
|
|
161
|
+
shebang = content.substring(0, idx + 1);
|
|
162
|
+
codeToProcess = content.substring(idx + 1);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
let processedCode;
|
|
166
|
+
let processType;
|
|
167
|
+
|
|
168
|
+
if (isSensitiveFile(relativePath)) {
|
|
169
|
+
// 機密ファイル: HIGH難読化
|
|
170
|
+
processedCode = processWithObfuscator(codeToProcess);
|
|
171
|
+
processType = 'HIGH';
|
|
172
|
+
Logger.success(`HIGH obfuscate: ${relativePath}`);
|
|
173
|
+
} else {
|
|
174
|
+
// 一般ファイル: Terser縮小化
|
|
175
|
+
processedCode = await processWithTerser(codeToProcess, relativePath);
|
|
176
|
+
processType = 'Terser';
|
|
177
|
+
Logger.info(`Terser minify: ${relativePath}`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const finalCode = shebang + processedCode;
|
|
181
|
+
|
|
182
|
+
await ensureDir(path.dirname(destPath));
|
|
183
|
+
await fs.writeFile(destPath, finalCode, 'utf8');
|
|
184
|
+
|
|
185
|
+
// bin/ および scripts/ ファイルの実行権限復元
|
|
186
|
+
if (relativePath.startsWith('bin/') || relativePath.startsWith('scripts/')) {
|
|
187
|
+
await fs.chmod(destPath, 0o755);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return processType;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async function collectFiles(dir, baseDir = dir) {
|
|
194
|
+
const files = [];
|
|
195
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
196
|
+
|
|
197
|
+
for (const entry of entries) {
|
|
198
|
+
const fullPath = path.join(dir, entry.name);
|
|
199
|
+
const relativePath = path.relative(baseDir, fullPath);
|
|
200
|
+
|
|
201
|
+
// 除外パターン
|
|
202
|
+
if (entry.name.startsWith('.') ||
|
|
203
|
+
entry.name === 'node_modules' ||
|
|
204
|
+
entry.name === 'dist' ||
|
|
205
|
+
entry.name === 'release' ||
|
|
206
|
+
entry.name === 'docs' ||
|
|
207
|
+
BUILD_EXCLUDE_FILES.includes(entry.name) ||
|
|
208
|
+
entry.name === 'test-mcp.js' ||
|
|
209
|
+
entry.name === 'test-mcp-api.js' ||
|
|
210
|
+
entry.name.endsWith('.md') && !COPY_ONLY_FILES.includes(relativePath)) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (entry.isDirectory()) {
|
|
215
|
+
const subFiles = await collectFiles(fullPath, baseDir);
|
|
216
|
+
files.push(...subFiles);
|
|
217
|
+
} else {
|
|
218
|
+
files.push({ fullPath, relativePath });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return files;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async function main() {
|
|
226
|
+
const startTime = Date.now();
|
|
227
|
+
|
|
228
|
+
console.log('');
|
|
229
|
+
console.log('╔═══════════════════════════════════════════════════════════╗');
|
|
230
|
+
console.log('║ むすひ CLI - Production Build ║');
|
|
231
|
+
console.log('║ 2-Stage Obfuscation: Terser + HIGH ║');
|
|
232
|
+
console.log('╚═══════════════════════════════════════════════════════════╝');
|
|
233
|
+
console.log('');
|
|
234
|
+
|
|
235
|
+
// 依存関係チェック
|
|
236
|
+
try {
|
|
237
|
+
require('terser');
|
|
238
|
+
require('javascript-obfuscator');
|
|
239
|
+
} catch (e) {
|
|
240
|
+
Logger.error('Missing dependencies. Run: npm install');
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// dist/をクリーン
|
|
245
|
+
Logger.info('Cleaning dist/...');
|
|
246
|
+
await cleanDir(DIST_DIR);
|
|
247
|
+
|
|
248
|
+
// 対象ファイル収集
|
|
249
|
+
Logger.info('Collecting files...');
|
|
250
|
+
|
|
251
|
+
const targetDirs = ['bin', 'lib', 'scripts'];
|
|
252
|
+
const allFiles = [];
|
|
253
|
+
|
|
254
|
+
for (const dir of targetDirs) {
|
|
255
|
+
const dirPath = path.join(SRC_DIR, dir);
|
|
256
|
+
try {
|
|
257
|
+
const files = await collectFiles(dirPath, SRC_DIR);
|
|
258
|
+
allFiles.push(...files);
|
|
259
|
+
} catch (e) {
|
|
260
|
+
Logger.warn(`Directory not found: ${dir}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
Logger.info(`Found ${allFiles.length} files to process`);
|
|
265
|
+
console.log('');
|
|
266
|
+
|
|
267
|
+
// ファイル処理
|
|
268
|
+
const stats = { terser: 0, high: 0, copy: 0, error: 0 };
|
|
269
|
+
|
|
270
|
+
for (const file of allFiles) {
|
|
271
|
+
const destPath = path.join(DIST_DIR, file.relativePath);
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
const type = await processFile(file.fullPath, destPath, file.relativePath);
|
|
275
|
+
if (type === 'Terser') stats.terser++;
|
|
276
|
+
else if (type === 'HIGH') stats.high++;
|
|
277
|
+
else stats.copy++;
|
|
278
|
+
} catch (error) {
|
|
279
|
+
Logger.error(`Failed: ${file.relativePath} - ${error.message}`);
|
|
280
|
+
stats.error++;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// package.json生成(dist用に調整)
|
|
285
|
+
Logger.info('Generating dist/package.json...');
|
|
286
|
+
const pkgPath = path.join(SRC_DIR, 'package.json');
|
|
287
|
+
const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'));
|
|
288
|
+
|
|
289
|
+
// binパスをdist/相対に変更しない(npm publishはdist/から行う)
|
|
290
|
+
const distPkg = {
|
|
291
|
+
name: pkg.name,
|
|
292
|
+
version: pkg.version,
|
|
293
|
+
description: pkg.description,
|
|
294
|
+
main: pkg.main.replace('lib/', './lib/'),
|
|
295
|
+
bin: {},
|
|
296
|
+
keywords: pkg.keywords,
|
|
297
|
+
author: pkg.author,
|
|
298
|
+
license: pkg.license,
|
|
299
|
+
dependencies: pkg.dependencies,
|
|
300
|
+
engines: pkg.engines,
|
|
301
|
+
files: ['bin/', 'lib/', 'scripts/'],
|
|
302
|
+
scripts: {
|
|
303
|
+
postinstall: 'node scripts/generate-commands.js && node scripts/setup-playwright.js'
|
|
304
|
+
},
|
|
305
|
+
preferGlobal: pkg.preferGlobal,
|
|
306
|
+
repository: pkg.repository
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
// binパスを相対パスに
|
|
310
|
+
for (const [cmd, binPath] of Object.entries(pkg.bin)) {
|
|
311
|
+
distPkg.bin[cmd] = binPath.replace('./bin/', './bin/');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
await fs.writeFile(
|
|
315
|
+
path.join(DIST_DIR, 'package.json'),
|
|
316
|
+
JSON.stringify(distPkg, null, 2),
|
|
317
|
+
'utf8'
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
// 結果表示
|
|
321
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
322
|
+
|
|
323
|
+
console.log('');
|
|
324
|
+
console.log('╔═══════════════════════════════════════════════════════════╗');
|
|
325
|
+
console.log('║ Build Complete ║');
|
|
326
|
+
console.log('╠═══════════════════════════════════════════════════════════╣');
|
|
327
|
+
console.log(`║ Terser (general): ${String(stats.terser).padStart(3)} files ║`);
|
|
328
|
+
console.log(`║ HIGH (sensitive): ${String(stats.high).padStart(3)} files ║`);
|
|
329
|
+
console.log(`║ Copy only: ${String(stats.copy).padStart(3)} files ║`);
|
|
330
|
+
console.log(`║ Errors: ${String(stats.error).padStart(3)} files ║`);
|
|
331
|
+
console.log(`║ Time: ${duration.padStart(5)}s ║`);
|
|
332
|
+
console.log('╠═══════════════════════════════════════════════════════════╣');
|
|
333
|
+
console.log('║ Output: dist/ ║');
|
|
334
|
+
console.log('║ ║');
|
|
335
|
+
console.log('║ To publish: ║');
|
|
336
|
+
console.log('║ cd dist && npm publish ║');
|
|
337
|
+
console.log('╚═══════════════════════════════════════════════════════════╝');
|
|
338
|
+
console.log('');
|
|
339
|
+
|
|
340
|
+
if (stats.error > 0) {
|
|
341
|
+
process.exit(1);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
main().catch(e => {
|
|
346
|
+
Logger.error(e.message);
|
|
347
|
+
process.exit(1);
|
|
348
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* むすひ コマンド生成スクリプト
|
|
5
|
+
* musuhi1〜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, 'musuhi-vscode-base');
|
|
13
|
+
|
|
14
|
+
// 生成するコマンド数(100スロット対応)
|
|
15
|
+
const MAX_SLOTS = 100;
|
|
16
|
+
|
|
17
|
+
console.log('🔵 むすひ コマンド生成開始...\n');
|
|
18
|
+
|
|
19
|
+
// musuhi1〜100 を生成
|
|
20
|
+
let createdCount = 0;
|
|
21
|
+
for (let i = 1; i <= MAX_SLOTS; i++) {
|
|
22
|
+
const commandName = `musuhi${i}`;
|
|
23
|
+
const commandPath = path.join(binDir, commandName);
|
|
24
|
+
|
|
25
|
+
// ラッパースクリプトを作成
|
|
26
|
+
const content = `#!/usr/bin/env node
|
|
27
|
+
require('./musuhi-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(` ✅ musuhi1〜${i} 作成完了`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ベーススクリプトにも実行権限を付与
|
|
41
|
+
if (fs.existsSync(baseScript)) {
|
|
42
|
+
fs.chmodSync(baseScript, '755');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log(`\n✨ ${createdCount}個のコマンドファイルを生成しました (musuhi1〜musuhi${MAX_SLOTS})`);
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* むすひ Playwright MCP Launcher
|
|
5
|
+
* - むすひ CLI認証チェック(トークンファイル存在確認)
|
|
6
|
+
* - セッションごとのChromeプロファイル(SingletonLock競合回避)
|
|
7
|
+
* - 古いセッションの自動クリーンアップ
|
|
8
|
+
* - Chrome未インストール時はChromiumにフォールバック
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { spawn, execSync } = require('child_process');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const os = require('os');
|
|
15
|
+
|
|
16
|
+
const TOKEN_FILE_PATH = path.join(os.homedir(), '.musuhi', 'portal-token.enc');
|
|
17
|
+
const BASE_DIR = path.join(os.homedir(), '.playwright-profile');
|
|
18
|
+
const SESSIONS_DIR = path.join(os.homedir(), '.playwright-profiles');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* むすひ認証チェック(レベル1: トークンファイル存在確認)
|
|
22
|
+
*/
|
|
23
|
+
function checkAuth() {
|
|
24
|
+
if (!fs.existsSync(TOKEN_FILE_PATH)) {
|
|
25
|
+
console.error('❌ むすひ認証が必要です。musuhiコマンドでログインしてください。');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 古いセッションプロファイルをクリーンアップ
|
|
32
|
+
*/
|
|
33
|
+
function cleanupOldSessions() {
|
|
34
|
+
if (!fs.existsSync(SESSIONS_DIR)) return;
|
|
35
|
+
|
|
36
|
+
const entries = fs.readdirSync(SESSIONS_DIR);
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (!entry.startsWith('session-')) continue;
|
|
39
|
+
|
|
40
|
+
const pid = parseInt(entry.replace('session-', ''));
|
|
41
|
+
if (isNaN(pid)) continue;
|
|
42
|
+
|
|
43
|
+
// プロセスが生きているかチェック
|
|
44
|
+
try {
|
|
45
|
+
process.kill(pid, 0);
|
|
46
|
+
} catch {
|
|
47
|
+
// プロセスが存在しない → 削除
|
|
48
|
+
const dirPath = path.join(SESSIONS_DIR, entry);
|
|
49
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* セッションプロファイルを作成
|
|
56
|
+
*/
|
|
57
|
+
function createSessionProfile() {
|
|
58
|
+
const sessionDir = path.join(SESSIONS_DIR, `session-${process.pid}`);
|
|
59
|
+
fs.mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
60
|
+
|
|
61
|
+
if (fs.existsSync(BASE_DIR)) {
|
|
62
|
+
// ベースプロファイルをコピー(Cookie/ログイン状態引き継ぎ)
|
|
63
|
+
fs.cpSync(BASE_DIR, sessionDir, { recursive: true });
|
|
64
|
+
// SingletonLockファイルを削除
|
|
65
|
+
const entries = fs.readdirSync(sessionDir);
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (entry.startsWith('Singleton')) {
|
|
68
|
+
fs.unlinkSync(path.join(sessionDir, entry));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return sessionDir;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* システムChromeがインストールされているか確認
|
|
80
|
+
*/
|
|
81
|
+
function isChromeInstalled() {
|
|
82
|
+
if (process.platform === 'darwin') {
|
|
83
|
+
return fs.existsSync('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome');
|
|
84
|
+
}
|
|
85
|
+
if (process.platform === 'linux') {
|
|
86
|
+
try {
|
|
87
|
+
execSync('which google-chrome 2>/dev/null || which google-chrome-stable 2>/dev/null', { stdio: 'pipe' });
|
|
88
|
+
return true;
|
|
89
|
+
} catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (process.platform === 'win32') {
|
|
94
|
+
const paths = [
|
|
95
|
+
path.join(process.env.PROGRAMFILES || '', 'Google', 'Chrome', 'Application', 'chrome.exe'),
|
|
96
|
+
path.join(process.env['PROGRAMFILES(X86)'] || '', 'Google', 'Chrome', 'Application', 'chrome.exe'),
|
|
97
|
+
path.join(process.env.LOCALAPPDATA || '', 'Google', 'Chrome', 'Application', 'chrome.exe')
|
|
98
|
+
];
|
|
99
|
+
return paths.some(p => fs.existsSync(p));
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* メイン処理
|
|
106
|
+
*/
|
|
107
|
+
function main() {
|
|
108
|
+
// 1. 認証チェック
|
|
109
|
+
checkAuth();
|
|
110
|
+
|
|
111
|
+
// 2. 古いセッションをクリーンアップ
|
|
112
|
+
cleanupOldSessions();
|
|
113
|
+
|
|
114
|
+
// 3. セッションプロファイルを作成
|
|
115
|
+
const sessionDir = createSessionProfile();
|
|
116
|
+
|
|
117
|
+
// 4. Playwright MCP起動引数を構築
|
|
118
|
+
const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
119
|
+
const args = ['@playwright/mcp@latest'];
|
|
120
|
+
|
|
121
|
+
if (isChromeInstalled()) {
|
|
122
|
+
args.push('--browser', 'chrome', '--user-data-dir', sessionDir);
|
|
123
|
+
} else {
|
|
124
|
+
console.error('⚠️ Google Chromeが見つかりません。Chromiumで起動します。');
|
|
125
|
+
console.error(' ログイン状態の引き継ぎにはChromeのインストールを推奨します。');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 5. Playwright MCPを起動
|
|
129
|
+
const child = spawn(npxCommand, args, { stdio: 'inherit' });
|
|
130
|
+
|
|
131
|
+
child.on('exit', (code) => {
|
|
132
|
+
// セッションプロファイルをクリーンアップ
|
|
133
|
+
fs.rmSync(sessionDir, { recursive: true, force: true });
|
|
134
|
+
process.exit(code || 0);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
process.on('SIGINT', () => child.kill('SIGINT'));
|
|
138
|
+
process.on('SIGTERM', () => child.kill('SIGTERM'));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
main();
|