cli-jaw 1.0.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +47 -20
- package/README.md +88 -57
- package/README.zh-CN.md +44 -17
- package/dist/bin/cli-jaw.js +5 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/browser.js +9 -3
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/doctor.js +85 -58
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/launchd.js +2 -25
- package/dist/bin/commands/launchd.js.map +1 -1
- package/dist/bin/commands/service.js +283 -0
- package/dist/bin/commands/service.js.map +1 -0
- package/dist/lib/quota-copilot.js +133 -14
- package/dist/lib/quota-copilot.js.map +1 -1
- package/dist/lib/upload.js +2 -1
- package/dist/lib/upload.js.map +1 -1
- package/dist/server.js +33 -26
- package/dist/server.js.map +1 -1
- package/dist/src/agent/spawn.js +100 -7
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/browser/connection.js +93 -12
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/browser/index.js +1 -1
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/cli/command-context.js +9 -4
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/commands.js +25 -12
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers.js +43 -6
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/registry.js +2 -2
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/command-contract/policy.js +5 -3
- package/dist/src/command-contract/policy.js.map +1 -1
- package/dist/src/core/config.js +1 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/instance.js +47 -0
- package/dist/src/core/instance.js.map +1 -0
- package/dist/src/orchestrator/collect.js +1 -1
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +4 -4
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/prompt/builder.js +1 -0
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/routes/browser.js +24 -22
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/quota.js +20 -7
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/telegram/bot.js +42 -11
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/telegram-file.js +121 -0
- package/dist/src/telegram/telegram-file.js.map +1 -0
- package/package.json +1 -1
- package/public/css/sidebar.css +17 -0
- package/public/dist/bundle.js +33 -33
- package/public/dist/bundle.js.map +3 -3
- package/public/index.html +8 -2
- package/public/js/features/settings.ts +37 -10
- package/public/js/main.ts +3 -1
- package/public/js/render.ts +76 -19
- package/public/js/ui.ts +5 -2
- package/public/js/ws.ts +4 -0
- package/public/locales/en.json +16 -0
- package/public/locales/ko.json +16 -0
- package/scripts/install.sh +200 -0
|
@@ -43,6 +43,12 @@ function hasWslWindowsChrome() {
|
|
|
43
43
|
];
|
|
44
44
|
return paths.some(p => fs.existsSync(p));
|
|
45
45
|
}
|
|
46
|
+
/** Detect headless server (no display, no desktop environment). */
|
|
47
|
+
function isHeadless() {
|
|
48
|
+
if (process.platform !== 'linux')
|
|
49
|
+
return false;
|
|
50
|
+
return !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY && !isWSL();
|
|
51
|
+
}
|
|
46
52
|
function check(name, fn) {
|
|
47
53
|
try {
|
|
48
54
|
const detail = fn();
|
|
@@ -138,21 +144,6 @@ if (process.platform === 'darwin') {
|
|
|
138
144
|
}
|
|
139
145
|
});
|
|
140
146
|
}
|
|
141
|
-
if (process.platform === 'linux') {
|
|
142
|
-
check('Display Server', () => {
|
|
143
|
-
if (process.env.WAYLAND_DISPLAY)
|
|
144
|
-
return `Wayland (${process.env.WAYLAND_DISPLAY})`;
|
|
145
|
-
if (process.env.DISPLAY)
|
|
146
|
-
return `X11 (${process.env.DISPLAY})`;
|
|
147
|
-
if (isWSL()) {
|
|
148
|
-
if (hasWslWindowsChrome()) {
|
|
149
|
-
return 'WSL (no DISPLAY; Windows Chrome path detected via /mnt/c)';
|
|
150
|
-
}
|
|
151
|
-
throw new Error('WARN: no DISPLAY in WSL — enable WSLg/set DISPLAY, or install Windows Chrome for /mnt/c fallback');
|
|
152
|
-
}
|
|
153
|
-
throw new Error('WARN: no DISPLAY — browser skill needs X11/Wayland');
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
147
|
// 9. Skill dependencies (Phase 9)
|
|
157
148
|
check('uv (Python)', () => {
|
|
158
149
|
try {
|
|
@@ -166,55 +157,91 @@ check('uv (Python)', () => {
|
|
|
166
157
|
throw new Error(`WARN: not installed — run: ${installHint}`);
|
|
167
158
|
}
|
|
168
159
|
});
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
160
|
+
const headless = isHeadless();
|
|
161
|
+
if (headless) {
|
|
162
|
+
// Headless server: browser checks are optional, show as INFO instead of WARN
|
|
163
|
+
if (!values.json) {
|
|
164
|
+
console.log('\n \u2139\ufe0f Browser checks (optional on headless server):');
|
|
165
|
+
console.log(' Display Server: skipped (headless)');
|
|
166
|
+
console.log(' playwright-core: skipped (headless)');
|
|
167
|
+
console.log(' Google Chrome: skipped (headless)');
|
|
173
168
|
}
|
|
174
|
-
|
|
175
|
-
|
|
169
|
+
results.push({ name: 'Display Server', status: 'info', detail: 'headless server \u2014 skipped' }, { name: 'playwright-core', status: 'info', detail: 'headless server \u2014 skipped' }, { name: 'Google Chrome', status: 'info', detail: 'headless server \u2014 skipped' });
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
if (process.platform === 'linux') {
|
|
173
|
+
check('Display Server', () => {
|
|
174
|
+
if (process.env.WAYLAND_DISPLAY)
|
|
175
|
+
return `Wayland (${process.env.WAYLAND_DISPLAY})`;
|
|
176
|
+
if (process.env.DISPLAY)
|
|
177
|
+
return `X11 (${process.env.DISPLAY})`;
|
|
178
|
+
if (isWSL()) {
|
|
179
|
+
if (hasWslWindowsChrome()) {
|
|
180
|
+
return 'WSL (no DISPLAY; Windows Chrome path detected via /mnt/c)';
|
|
181
|
+
}
|
|
182
|
+
throw new Error('WARN: no DISPLAY in WSL \u2014 enable WSLg/set DISPLAY, or install Windows Chrome for /mnt/c fallback');
|
|
183
|
+
}
|
|
184
|
+
throw new Error('WARN: no DISPLAY \u2014 browser skill needs X11/Wayland');
|
|
185
|
+
});
|
|
176
186
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
187
|
+
check('playwright-core', () => {
|
|
188
|
+
// Check global install via npm root -g (more reliable than require.resolve for global packages)
|
|
189
|
+
try {
|
|
190
|
+
const globalRoot = execSync('npm root -g', { encoding: 'utf8', stdio: 'pipe' }).trim();
|
|
191
|
+
if (fs.existsSync(path.join(globalRoot, 'playwright-core')))
|
|
192
|
+
return 'installed (global)';
|
|
193
|
+
}
|
|
194
|
+
catch { /* npm not available or error */ }
|
|
195
|
+
// Fallback: check require.resolve (works for local installs)
|
|
196
|
+
try {
|
|
197
|
+
execSync('node -e "require.resolve(\'playwright-core\')"', { stdio: 'pipe' });
|
|
181
198
|
return 'installed';
|
|
182
|
-
if (fs.existsSync(path.join(os.homedir(), 'Applications/Google Chrome.app')))
|
|
183
|
-
return 'installed (user)';
|
|
184
|
-
}
|
|
185
|
-
else if (process.platform === 'win32') {
|
|
186
|
-
const pf = process.env.PROGRAMFILES || 'C:\\Program Files';
|
|
187
|
-
const pf86 = process.env['PROGRAMFILES(X86)'] || 'C:\\Program Files (x86)';
|
|
188
|
-
const local = process.env.LOCALAPPDATA || '';
|
|
189
|
-
const winPaths = [
|
|
190
|
-
`${pf}\\Google\\Chrome\\Application\\chrome.exe`,
|
|
191
|
-
`${pf86}\\Google\\Chrome\\Application\\chrome.exe`,
|
|
192
|
-
`${local}\\Google\\Chrome\\Application\\chrome.exe`,
|
|
193
|
-
`${pf}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
|
|
194
|
-
];
|
|
195
|
-
for (const p of winPaths) {
|
|
196
|
-
if (p && fs.existsSync(p))
|
|
197
|
-
return 'installed';
|
|
198
199
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
'/
|
|
206
|
-
'/snap/bin/chromium',
|
|
207
|
-
'/usr/bin/brave-browser',
|
|
208
|
-
'/mnt/c/Program Files/Google/Chrome/Application/chrome.exe',
|
|
209
|
-
'/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',
|
|
210
|
-
];
|
|
211
|
-
for (const p of linuxPaths) {
|
|
212
|
-
if (fs.existsSync(p))
|
|
200
|
+
catch {
|
|
201
|
+
throw new Error('WARN: not installed \u2014 run: npm i -g playwright-core');
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
check('Google Chrome', () => {
|
|
205
|
+
if (process.platform === 'darwin') {
|
|
206
|
+
if (fs.existsSync('/Applications/Google Chrome.app'))
|
|
213
207
|
return 'installed';
|
|
208
|
+
if (fs.existsSync(path.join(os.homedir(), 'Applications/Google Chrome.app')))
|
|
209
|
+
return 'installed (user)';
|
|
214
210
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
211
|
+
else if (process.platform === 'win32') {
|
|
212
|
+
const pf = process.env.PROGRAMFILES || 'C:\\Program Files';
|
|
213
|
+
const pf86 = process.env['PROGRAMFILES(X86)'] || 'C:\\Program Files (x86)';
|
|
214
|
+
const local = process.env.LOCALAPPDATA || '';
|
|
215
|
+
const winPaths = [
|
|
216
|
+
`${pf}\\Google\\Chrome\\Application\\chrome.exe`,
|
|
217
|
+
`${pf86}\\Google\\Chrome\\Application\\chrome.exe`,
|
|
218
|
+
`${local}\\Google\\Chrome\\Application\\chrome.exe`,
|
|
219
|
+
`${pf}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
|
|
220
|
+
];
|
|
221
|
+
for (const p of winPaths) {
|
|
222
|
+
if (p && fs.existsSync(p))
|
|
223
|
+
return 'installed';
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
const linuxPaths = [
|
|
228
|
+
'/usr/bin/google-chrome-stable',
|
|
229
|
+
'/usr/bin/google-chrome',
|
|
230
|
+
'/usr/bin/chromium-browser',
|
|
231
|
+
'/usr/bin/chromium',
|
|
232
|
+
'/snap/bin/chromium',
|
|
233
|
+
'/usr/bin/brave-browser',
|
|
234
|
+
'/mnt/c/Program Files/Google/Chrome/Application/chrome.exe',
|
|
235
|
+
'/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',
|
|
236
|
+
];
|
|
237
|
+
for (const p of linuxPaths) {
|
|
238
|
+
if (fs.existsSync(p))
|
|
239
|
+
return 'installed';
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
throw new Error('WARN: not found \u2014 required for browser skill');
|
|
243
|
+
});
|
|
244
|
+
}
|
|
218
245
|
// Output
|
|
219
246
|
if (values.json) {
|
|
220
247
|
console.log(JSON.stringify({ checks: results }, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../bin/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEjG,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAEzE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IACtD,MAAM,EAAE,KAAK;CAChB,CAAC,CAAC;AAEH,MAAM,OAAO,GAA4D,EAAE,CAAC;AAE5E,SAAS,cAAc,CAAC,IAAY;IAChC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,eAAe,IAAI,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9G,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,KAAK,IAAI,IAAI,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAS,KAAK;IACV,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB;IACxB,MAAM,KAAK,GAAG;QACV,2DAA2D;QAC3D,iEAAiE;KACpE,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,EAAgB;IACzC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,MAAM,GAAI,CAAW,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACzC,MAAM,GAAG,GAAI,CAAW,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;AACL,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE3D,oBAAoB;AACpB,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,QAAQ,GAA+B,IAAI,CAAC;AAChD,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACzF,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,OAAO,OAAO,QAAQ,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,cAAc;AACd,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE;IACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACjG,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACpE,OAAO,GAAG,MAAM,cAAc,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;IACrE,KAAK,CAAC,QAAQ,GAAG,EAAE,EAAE,GAAG,EAAE;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK;YAAE,OAAO,cAAc,KAAK,GAAG,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,cAAc;AACd,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE;IACnB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC5E,OAAO,YAAY,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,KAAK,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC3B,MAAM,SAAS,GAAG,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,eAAe,CAAC;AACjF,CAAC,CAAC,CAAC;AAEH,wCAAwC;AACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAChC,KAAK,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC9B,IAAI,CAAC;YACD,QAAQ,CAAC,qFAAqF,EAAE;gBAC5F,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;aAC/B,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACL,+BAA+B;YAC/B,IAAI,CAAC;gBACD,QAAQ,CAAC,sFAAsF,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACxH,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../bin/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,18 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { execSync } from 'node:child_process';
|
|
10
10
|
import { existsSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
11
|
-
import { join
|
|
11
|
+
import { join } from 'node:path';
|
|
12
12
|
import { homedir } from 'node:os';
|
|
13
|
-
import { createHash } from 'node:crypto';
|
|
14
13
|
import { parseArgs } from 'node:util';
|
|
15
14
|
import { JAW_HOME } from '../../src/core/config.js';
|
|
16
|
-
|
|
17
|
-
const base = basename(JAW_HOME);
|
|
18
|
-
if (base === '.cli-jaw')
|
|
19
|
-
return 'default';
|
|
20
|
-
const hash = createHash('md5').update(JAW_HOME).digest('hex').slice(0, 8);
|
|
21
|
-
return `${base.replace(/^\./, '')}-${hash}`;
|
|
22
|
-
}
|
|
15
|
+
import { instanceId, getNodePath, getJawPath } from '../../src/core/instance.js';
|
|
23
16
|
const xmlEsc = (s) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
24
17
|
// parseArgs is safe here — launchd is a leaf command (no subcommands to absorb)
|
|
25
18
|
const { values: launchdOpts, positionals: launchdPos } = parseArgs({
|
|
@@ -42,22 +35,6 @@ const INSTANCE = instanceId();
|
|
|
42
35
|
const LABEL = `com.cli-jaw.${INSTANCE}`;
|
|
43
36
|
const PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${LABEL}.plist`);
|
|
44
37
|
const LOG_DIR = join(JAW_HOME, 'logs');
|
|
45
|
-
function getNodePath() {
|
|
46
|
-
try {
|
|
47
|
-
return execSync('which node', { encoding: 'utf8' }).trim();
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return '/usr/local/bin/node';
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function getJawPath() {
|
|
54
|
-
try {
|
|
55
|
-
return execSync('which jaw', { encoding: 'utf8' }).trim();
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
return execSync('which cli-jaw', { encoding: 'utf8' }).trim();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
38
|
function generatePlist() {
|
|
62
39
|
const nodePath = getNodePath();
|
|
63
40
|
const jawPath = getJawPath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../bin/commands/launchd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../bin/commands/launchd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-jaw service — 크로스 플랫폼 서비스 관리
|
|
3
|
+
* Usage:
|
|
4
|
+
* jaw service — OS 감지 → 설치 + 시작 (원스텝)
|
|
5
|
+
* jaw service --port 3458 — 커스텀 포트로 등록
|
|
6
|
+
* jaw service status — 현재 상태 확인
|
|
7
|
+
* jaw service unset — 서비스 제거
|
|
8
|
+
* jaw service logs — 로그 보기
|
|
9
|
+
*/
|
|
10
|
+
import { execFileSync, spawn as nodeSpawn } from 'node:child_process';
|
|
11
|
+
import { existsSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { parseArgs } from 'node:util';
|
|
14
|
+
import { JAW_HOME } from '../../src/core/config.js';
|
|
15
|
+
import { instanceId, getNodePath, getJawPath, sanitizeUnitName } from '../../src/core/instance.js';
|
|
16
|
+
// ─── Args ────────────────────────────────────────────
|
|
17
|
+
const { values: opts, positionals: pos } = parseArgs({
|
|
18
|
+
args: process.argv.slice(3),
|
|
19
|
+
options: {
|
|
20
|
+
port: { type: 'string', default: '3457' },
|
|
21
|
+
backend: { type: 'string' },
|
|
22
|
+
},
|
|
23
|
+
strict: false,
|
|
24
|
+
allowPositionals: true,
|
|
25
|
+
});
|
|
26
|
+
// unknown flag guard
|
|
27
|
+
const knownKeys = new Set(['port', 'backend']);
|
|
28
|
+
for (const key of Object.keys(opts)) {
|
|
29
|
+
if (!knownKeys.has(key)) {
|
|
30
|
+
console.error(`❌ Unknown option: --${key}`);
|
|
31
|
+
console.error(' Usage: jaw service [--port PORT] [--backend systemd|launchd|docker] [status|unset|logs]');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// --backend whitelist validation
|
|
36
|
+
const VALID_BACKENDS = new Set(['launchd', 'systemd', 'docker']);
|
|
37
|
+
if (opts.backend && !VALID_BACKENDS.has(opts.backend)) {
|
|
38
|
+
console.error(`❌ Unknown backend: ${opts.backend}`);
|
|
39
|
+
console.error(' Supported: launchd, systemd, docker');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const PORT = opts.port;
|
|
43
|
+
// port validation: must be numeric and in valid range
|
|
44
|
+
const portNum = Number(PORT);
|
|
45
|
+
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
|
|
46
|
+
console.error(`\u274c Invalid port: ${PORT}`);
|
|
47
|
+
console.error(' Port must be an integer between 1 and 65535');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const INSTANCE = instanceId();
|
|
51
|
+
const LOG_DIR = join(JAW_HOME, 'logs');
|
|
52
|
+
function detectBackend() {
|
|
53
|
+
// macOS → launchd
|
|
54
|
+
if (process.platform === 'darwin')
|
|
55
|
+
return 'launchd';
|
|
56
|
+
// Docker container detection
|
|
57
|
+
if (existsSync('/.dockerenv'))
|
|
58
|
+
return 'docker';
|
|
59
|
+
// Linux: verify PID 1 is actually systemd (not just binary installed)
|
|
60
|
+
try {
|
|
61
|
+
const pid1 = readFileSync('/proc/1/comm', 'utf8').trim();
|
|
62
|
+
if (pid1 === 'systemd')
|
|
63
|
+
return 'systemd';
|
|
64
|
+
}
|
|
65
|
+
catch { /* /proc may not exist */ }
|
|
66
|
+
// Fallback: check systemctl exists (less reliable but covers more cases)
|
|
67
|
+
try {
|
|
68
|
+
execFileSync('which', ['systemctl'], { stdio: 'pipe' });
|
|
69
|
+
console.warn('⚠️ PID 1이 systemd가 아닐 수 있습니다. --backend systemd로 강제 지정 가능');
|
|
70
|
+
return 'systemd';
|
|
71
|
+
}
|
|
72
|
+
catch { /* no systemctl */ }
|
|
73
|
+
console.error('❌ 지원되지 않는 환경입니다.');
|
|
74
|
+
console.error(' 지원: macOS (launchd), Linux (systemd), Docker');
|
|
75
|
+
console.error(' 수동 설정은 jaw serve를 tmux/screen에서 실행하세요.');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const backend = opts.backend || detectBackend();
|
|
79
|
+
// ─── macOS: delegate to launchd command ──────────────
|
|
80
|
+
if (backend === 'launchd') {
|
|
81
|
+
// launchd.ts supports: status, unset, default (install)
|
|
82
|
+
// service.ts additionally supports: logs
|
|
83
|
+
// Map unsupported subcommands for launchd
|
|
84
|
+
const subcommand = pos[0];
|
|
85
|
+
if (subcommand === 'logs') {
|
|
86
|
+
// launchd doesn't have 'logs' → show log file path directly
|
|
87
|
+
const logDir = join(JAW_HOME, 'logs');
|
|
88
|
+
console.log(`📋 macOS launchd logs:\n`);
|
|
89
|
+
console.log(` stdout: ${logDir}/jaw-serve.log`);
|
|
90
|
+
console.log(` stderr: ${logDir}/jaw-serve.err\n`);
|
|
91
|
+
console.log(` tail -f ${logDir}/jaw-serve.log`);
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
// Rebuild argv from parsed values — eliminates all --backend variants
|
|
95
|
+
// Only pass --port on install (default). status/unset read from existing plist.
|
|
96
|
+
const isInstall = !subcommand || (subcommand !== 'status' && subcommand !== 'unset');
|
|
97
|
+
const portArgs = isInstall && PORT !== '3457' ? ['--port', PORT] : [];
|
|
98
|
+
process.argv = [
|
|
99
|
+
process.argv[0], process.argv[1],
|
|
100
|
+
'launchd',
|
|
101
|
+
...(subcommand ? [subcommand] : []),
|
|
102
|
+
...portArgs,
|
|
103
|
+
];
|
|
104
|
+
await import('./launchd.js');
|
|
105
|
+
process.exit(0);
|
|
106
|
+
}
|
|
107
|
+
// ─── Docker: info only ───────────────────────────────
|
|
108
|
+
if (backend === 'docker') {
|
|
109
|
+
console.log('🐳 Docker 컨테이너 내부에서 실행 중입니다.\n');
|
|
110
|
+
console.log(' 컨테이너 자체가 restart policy로 관리됩니다.');
|
|
111
|
+
console.log(' docker-compose.yml의 restart: unless-stopped 설정을 확인하세요.\n');
|
|
112
|
+
console.log(' 상태 확인: docker ps | grep cli-jaw');
|
|
113
|
+
console.log(' 로그 확인: docker logs -f cli-jaw');
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
// ═══════════════════════════════════════════════════════
|
|
117
|
+
// systemd backend
|
|
118
|
+
// ═══════════════════════════════════════════════════════
|
|
119
|
+
const SAFE_INSTANCE = sanitizeUnitName(INSTANCE);
|
|
120
|
+
const UNIT_NAME = `jaw-${SAFE_INSTANCE}`;
|
|
121
|
+
const UNIT_PATH = `/etc/systemd/system/${UNIT_NAME}.service`;
|
|
122
|
+
/** Create secure temp file for unit generation. */
|
|
123
|
+
function makeTmpUnit() {
|
|
124
|
+
try {
|
|
125
|
+
return execFileSync('mktemp', ['/tmp/jaw-unit-XXXXXX.service'], { encoding: 'utf8' }).trim();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// fallback if mktemp unavailable
|
|
129
|
+
const fallback = `/tmp/jaw-unit-${Date.now()}-${process.pid}.service`;
|
|
130
|
+
return fallback;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Run a sudo command with visible output (password prompt visible). */
|
|
134
|
+
function sudo(args) {
|
|
135
|
+
execFileSync('sudo', args, { stdio: 'inherit' });
|
|
136
|
+
}
|
|
137
|
+
function generateUnit() {
|
|
138
|
+
const nodePath = getNodePath();
|
|
139
|
+
const jawPath = getJawPath();
|
|
140
|
+
let user;
|
|
141
|
+
try {
|
|
142
|
+
user = execFileSync('whoami', { encoding: 'utf8' }).trim();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
user = 'nobody';
|
|
146
|
+
}
|
|
147
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
148
|
+
// systemd quoting: paths with spaces must be quoted
|
|
149
|
+
const q = (s) => s.includes(' ') ? `"${s}"` : s;
|
|
150
|
+
return `[Unit]
|
|
151
|
+
Description=CLI-JAW Server (${SAFE_INSTANCE})
|
|
152
|
+
After=network.target
|
|
153
|
+
|
|
154
|
+
[Service]
|
|
155
|
+
Type=simple
|
|
156
|
+
User=${user}
|
|
157
|
+
WorkingDirectory=${q(JAW_HOME)}
|
|
158
|
+
ExecStart=${q(nodePath)} ${q(jawPath)} --home ${q(JAW_HOME)} serve --port ${PORT} --no-open
|
|
159
|
+
Restart=always
|
|
160
|
+
RestartSec=5
|
|
161
|
+
Environment=NODE_ENV=production
|
|
162
|
+
Environment="PATH=${process.env.PATH || '/usr/local/bin:/usr/bin:/bin'}"
|
|
163
|
+
Environment=CLI_JAW_HOME=${q(JAW_HOME)}
|
|
164
|
+
StandardOutput=journal
|
|
165
|
+
StandardError=journal
|
|
166
|
+
SyslogIdentifier=${UNIT_NAME}
|
|
167
|
+
|
|
168
|
+
[Install]
|
|
169
|
+
WantedBy=multi-user.target`;
|
|
170
|
+
}
|
|
171
|
+
function isActive() {
|
|
172
|
+
try {
|
|
173
|
+
return execFileSync('systemctl', ['is-active', UNIT_NAME], { encoding: 'utf8' }).trim();
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return 'inactive';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const sub = pos[0];
|
|
180
|
+
switch (sub) {
|
|
181
|
+
case 'unset': {
|
|
182
|
+
if (!existsSync(UNIT_PATH)) {
|
|
183
|
+
console.log('⚠️ jaw serve가 systemd에 등록되어 있지 않습니다');
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
sudo(['systemctl', 'stop', UNIT_NAME]);
|
|
188
|
+
}
|
|
189
|
+
catch { /* ok if already stopped */ }
|
|
190
|
+
try {
|
|
191
|
+
sudo(['systemctl', 'disable', UNIT_NAME]);
|
|
192
|
+
}
|
|
193
|
+
catch { /* ok */ }
|
|
194
|
+
sudo(['rm', '-f', UNIT_PATH]);
|
|
195
|
+
sudo(['systemctl', 'daemon-reload']);
|
|
196
|
+
console.log('✅ jaw serve 자동 실행 해제 완료');
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 'status': {
|
|
200
|
+
if (!existsSync(UNIT_PATH)) {
|
|
201
|
+
console.log('\u26a0\ufe0f jaw serve\uac00 systemd\uc5d0 \ub4f1\ub85d\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4');
|
|
202
|
+
console.log(' \ub4f1\ub85d: jaw service');
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
// Read actual port from unit file if possible
|
|
206
|
+
let displayPort = PORT;
|
|
207
|
+
try {
|
|
208
|
+
const unitContent = readFileSync(UNIT_PATH, 'utf8');
|
|
209
|
+
const portMatch = unitContent.match(/--port\s+(\d+)/);
|
|
210
|
+
if (portMatch)
|
|
211
|
+
displayPort = portMatch[1];
|
|
212
|
+
}
|
|
213
|
+
catch { /* use CLI port as fallback */ }
|
|
214
|
+
const state = isActive();
|
|
215
|
+
const icon = state === 'active' ? '\ud83d\udfe2' : state === 'failed' ? '\ud83d\udd34' : '\u26aa';
|
|
216
|
+
console.log(`\ud83e\udd88 jaw serve \u2014 ${icon} ${state}`);
|
|
217
|
+
console.log(` instance: ${INSTANCE}`);
|
|
218
|
+
console.log(` unit: ${UNIT_NAME}`);
|
|
219
|
+
console.log(` port: ${displayPort}`);
|
|
220
|
+
console.log(` unit file: ${UNIT_PATH}`);
|
|
221
|
+
console.log(`\n \ub85c\uadf8: jaw service logs`);
|
|
222
|
+
console.log(` \uc911\uc9c0: jaw service unset`);
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
case 'logs': {
|
|
226
|
+
console.log(`📋 journalctl -u ${UNIT_NAME} -f\n`);
|
|
227
|
+
const child = nodeSpawn('journalctl', ['-u', UNIT_NAME, '-f', '--no-pager', '-n', '50'], {
|
|
228
|
+
stdio: 'inherit',
|
|
229
|
+
});
|
|
230
|
+
// Clean exit on Ctrl+C
|
|
231
|
+
const cleanup = () => { child.kill('SIGINT'); process.exit(0); };
|
|
232
|
+
process.on('SIGINT', cleanup);
|
|
233
|
+
process.on('SIGTERM', cleanup);
|
|
234
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
default: {
|
|
238
|
+
// 원스텝: 유닛 생성 → daemon-reload → enable --now
|
|
239
|
+
console.log('🦈 jaw service setup (systemd)\n');
|
|
240
|
+
if (existsSync(UNIT_PATH)) {
|
|
241
|
+
console.log('📄 기존 유닛 발견 — 재생성합니다');
|
|
242
|
+
try {
|
|
243
|
+
sudo(['systemctl', 'stop', UNIT_NAME]);
|
|
244
|
+
}
|
|
245
|
+
catch { /* ok */ }
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.log('📄 유닛 없음 — 새로 생성합니다');
|
|
249
|
+
}
|
|
250
|
+
// 1. 유닛 파일 생성 (mktemp → sudo cp)
|
|
251
|
+
const unit = generateUnit();
|
|
252
|
+
const tmpUnit = makeTmpUnit();
|
|
253
|
+
writeFileSync(tmpUnit, unit);
|
|
254
|
+
sudo(['cp', tmpUnit, UNIT_PATH]);
|
|
255
|
+
try {
|
|
256
|
+
writeFileSync(tmpUnit, '');
|
|
257
|
+
}
|
|
258
|
+
catch { /* cleanup */ }
|
|
259
|
+
console.log(`✅ 유닛 저장: ${UNIT_PATH}`);
|
|
260
|
+
// 2. 등록 + 시작
|
|
261
|
+
sudo(['systemctl', 'daemon-reload']);
|
|
262
|
+
sudo(['systemctl', 'enable', '--now', UNIT_NAME]);
|
|
263
|
+
console.log('✅ systemd 등록 + 시작 완료\n');
|
|
264
|
+
// 3. 상태 확인
|
|
265
|
+
setTimeout(() => {
|
|
266
|
+
const state = isActive();
|
|
267
|
+
if (state === 'active') {
|
|
268
|
+
console.log('🦈 jaw serve가 백그라운드에서 실행 중입니다');
|
|
269
|
+
console.log(` instance: ${INSTANCE}`);
|
|
270
|
+
console.log(` http://localhost:${PORT}`);
|
|
271
|
+
console.log(` 로그: jaw service logs`);
|
|
272
|
+
console.log('\n 해제: jaw service unset');
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.log('⚠️ 시작되지 않았습니다. 상태를 확인하세요:');
|
|
276
|
+
console.log(` systemctl status ${UNIT_NAME}`);
|
|
277
|
+
console.log(` journalctl -u ${UNIT_NAME} --no-pager -n 20`);
|
|
278
|
+
}
|
|
279
|
+
}, 2000);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../bin/commands/service.ts"],"names":[],"mappings":"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"}
|