@42ws/cli 0.0.35 → 0.0.37
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/dist/commands/chatlog.d.ts +10 -0
- package/dist/commands/chatlog.d.ts.map +1 -0
- package/dist/commands/chatlog.js +103 -0
- package/dist/commands/chatlog.js.map +1 -0
- package/dist/commands/context.d.ts +12 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +271 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dev.d.ts +13 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +300 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/domains.d.ts +10 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +179 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/editlog.d.ts +12 -0
- package/dist/commands/editlog.d.ts.map +1 -0
- package/dist/commands/editlog.js +188 -0
- package/dist/commands/editlog.js.map +1 -0
- package/dist/commands/prompts.js +2 -2
- package/dist/commands/prompts.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +3 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +2 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/i18n.d.ts.map +1 -1
- package/dist/lib/i18n.js +46 -0
- package/dist/lib/i18n.js.map +1 -1
- package/dist/lib/inspector-client.d.ts +3 -0
- package/dist/lib/inspector-client.d.ts.map +1 -0
- package/dist/lib/inspector-client.js +246 -0
- package/dist/lib/inspector-client.js.map +1 -0
- package/dist/lib/suggest.d.ts +12 -0
- package/dist/lib/suggest.d.ts.map +1 -0
- package/dist/lib/suggest.js +36 -0
- package/dist/lib/suggest.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const INSPECTOR_ENDPOINT = "/__42ws_inspector";
|
|
2
|
+
export declare const INSPECTOR_CLIENT_JS = "(function () {\n 'use strict';\n if (window.__42wsInspector) return;\n window.__42wsInspector = true;\n\n var NL = String.fromCharCode(10);\n var ENDPOINT = '/__42ws_inspector';\n var MARK = 'data-42ws-inspector';\n\n // ---- error ring buffer (last 5) ----------------------------------------\n var errors = [];\n function pushError(type, message) {\n errors.push({ type: type, message: String(message).slice(0, 400) });\n if (errors.length > 5) errors.shift();\n updateBadge();\n try {\n fetch(ENDPOINT + '/log', {\n method: 'POST',\n keepalive: true,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ type: type, message: String(message).slice(0, 1000), url: location.href })\n });\n } catch (e) { /* ignore */ }\n }\n\n window.addEventListener('error', function (ev) {\n var t = ev.target;\n if (t && t !== window && t.tagName) {\n var src = t.src || t.href || '';\n pushError('Resource', t.tagName.toLowerCase() + ' failed to load: ' + src);\n } else {\n pushError('JS', (ev.message || 'Error') + (ev.filename ? ' @ ' + ev.filename + ':' + ev.lineno : ''));\n }\n }, true);\n\n window.addEventListener('unhandledrejection', function (ev) {\n var r = ev.reason;\n pushError('Promise', (r && r.message) ? r.message : String(r));\n });\n\n var origFetch = window.fetch;\n if (origFetch) {\n window.fetch = function () {\n var args = arguments;\n var url = (args[0] && args[0].url) ? args[0].url : String(args[0]);\n var p = origFetch.apply(this, args);\n if (url.indexOf(ENDPOINT) === -1) {\n p.then(function (res) {\n if (res && res.status >= 400) {\n var method = (args[1] && args[1].method) ? args[1].method : 'GET';\n pushError('HTTP ' + res.status, method + ' ' + url);\n }\n return res;\n }).catch(function (err) {\n pushError('Network', (err && err.message ? err.message : 'fetch failed') + ' ' + url);\n });\n }\n return p;\n };\n }\n\n // ---- selector / pack ----------------------------------------------------\n function truncate(s, n) {\n s = String(s);\n return s.length > n ? s.slice(0, n) + ' \u2026(truncated)' : s;\n }\n\n function cssPath(el) {\n if (!el || el.nodeType !== 1) return '(unknown)';\n var parts = [];\n var cur = el;\n while (cur && cur.nodeType === 1 && parts.length < 5) {\n if (cur.id) { parts.unshift('#' + cur.id); break; }\n var sel = cur.tagName.toLowerCase();\n var cls = (cur.className && typeof cur.className === 'string')\n ? cur.className.trim().split(/\\s+/).filter(Boolean).slice(0, 2) : [];\n if (cls.length) sel += '.' + cls.join('.');\n var parent = cur.parentElement;\n if (parent) {\n var same = Array.prototype.filter.call(parent.children, function (c) { return c.tagName === cur.tagName; });\n if (same.length > 1) sel += ':nth-of-type(' + (same.indexOf(cur) + 1) + ')';\n }\n parts.unshift(sel);\n cur = cur.parentElement;\n }\n return parts.join(' > ');\n }\n\n function buildPack(el) {\n var errLines = errors.length\n ? errors.map(function (e) { return '- [' + e.type + '] ' + e.message; }).join(NL)\n : '- (none)';\n var ctx = el.parentElement ? truncate(el.parentElement.outerHTML, 1000) : '(no parent)';\n return [\n '<!-- 42ws page diagnostic pack -->',\n '## url',\n location.href,\n '',\n '## selector',\n cssPath(el),\n '',\n '## outerHTML excerpt',\n truncate(el.outerHTML, 600),\n '',\n '## context HTML',\n ctx,\n '',\n '## errors (last 5)',\n errLines,\n ''\n ].join(NL);\n }\n\n function copyText(text) {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n return navigator.clipboard.writeText(text).then(function () { return true; }, function () { return fallbackCopy(text); });\n }\n return Promise.resolve(fallbackCopy(text));\n }\n function fallbackCopy(text) {\n try {\n var ta = document.createElement('textarea');\n ta.value = text;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n document.body.appendChild(ta);\n ta.select();\n var ok = document.execCommand('copy');\n document.body.removeChild(ta);\n return ok;\n } catch (e) { return false; }\n }\n\n // ---- UI: toolbar + overlay ----------------------------------------------\n var inspecting = false;\n var overlay, bar, badge, toast;\n\n function mkEl(tag, css) {\n var el = document.createElement(tag);\n el.setAttribute(MARK, '');\n if (css) el.style.cssText = css;\n return el;\n }\n\n function buildUI() {\n overlay = mkEl('div', 'position:fixed;z-index:2147483646;pointer-events:none;border:2px solid #ff3b6b;background:rgba(255,59,107,0.12);display:none;border-radius:2px;');\n document.body.appendChild(overlay);\n\n bar = mkEl('div', 'position:fixed;bottom:16px;right:16px;z-index:2147483647;display:flex;gap:8px;align-items:center;font:600 12px/1 ui-monospace,monospace;background:#10111a;color:#fff;padding:8px 10px;border-radius:10px;box-shadow:0 4px 20px rgba(0,0,0,.35);');\n\n var tag = mkEl('span', 'color:#ff3b6b;letter-spacing:.5px;');\n tag.textContent = '42ws';\n bar.appendChild(tag);\n\n var btn = mkEl('button', 'cursor:pointer;border:0;border-radius:6px;padding:6px 10px;font:inherit;background:#2b2d3a;color:#fff;');\n btn.textContent = '\u691C\u8A3C\u3059\u308B';\n btn.onclick = function () { setInspecting(!inspecting); };\n bar.appendChild(btn);\n bar.__btn = btn;\n\n badge = mkEl('span', 'min-width:18px;text-align:center;border-radius:9px;padding:3px 7px;background:#2b2d3a;color:#8b8d98;');\n badge.textContent = '0';\n badge.title = 'JS/HTTP \u30A8\u30E9\u30FC\u4EF6\u6570';\n bar.appendChild(badge);\n\n document.body.appendChild(bar);\n }\n\n function updateBadge() {\n if (!badge) return;\n badge.textContent = String(errors.length);\n badge.style.background = errors.length ? '#ff3b6b' : '#2b2d3a';\n badge.style.color = errors.length ? '#fff' : '#8b8d98';\n }\n\n function showToast(msg) {\n if (toast) toast.remove();\n toast = mkEl('div', 'position:fixed;bottom:64px;right:16px;z-index:2147483647;max-width:320px;font:500 12px/1.5 ui-monospace,monospace;background:#10111a;color:#fff;padding:10px 12px;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.35);white-space:pre-wrap;');\n toast.textContent = msg;\n document.body.appendChild(toast);\n setTimeout(function () { if (toast) { toast.remove(); toast = null; } }, 4000);\n }\n\n function setInspecting(on) {\n inspecting = on;\n if (bar && bar.__btn) {\n bar.__btn.textContent = on ? '\u9078\u629E\u4E2D\u2026(Esc\u3067\u4E2D\u6B62)' : '\u691C\u8A3C\u3059\u308B';\n bar.__btn.style.background = on ? '#ff3b6b' : '#2b2d3a';\n }\n document.body.style.cursor = on ? 'crosshair' : '';\n if (!on && overlay) overlay.style.display = 'none';\n }\n\n function isOurs(el) {\n while (el) { if (el.nodeType === 1 && el.hasAttribute && el.hasAttribute(MARK)) return true; el = el.parentNode; }\n return false;\n }\n\n document.addEventListener('mousemove', function (ev) {\n if (!inspecting || !overlay) return;\n var el = ev.target;\n if (!el || isOurs(el)) { overlay.style.display = 'none'; return; }\n var r = el.getBoundingClientRect();\n overlay.style.display = 'block';\n overlay.style.left = r.left + 'px';\n overlay.style.top = r.top + 'px';\n overlay.style.width = r.width + 'px';\n overlay.style.height = r.height + 'px';\n }, true);\n\n document.addEventListener('keydown', function (ev) {\n if (ev.key === 'Escape' && inspecting) setInspecting(false);\n });\n\n document.addEventListener('click', function (ev) {\n if (!inspecting) return;\n var el = ev.target;\n if (isOurs(el)) return;\n ev.preventDefault();\n ev.stopPropagation();\n setInspecting(false);\n var pack = buildPack(el);\n el.scrollIntoView({ block: 'center', behavior: 'smooth' });\n var prev = el.style.outline;\n el.style.outline = '3px solid #ff3b6b';\n setTimeout(function () { el.style.outline = prev; }, 1500);\n copyText(pack).then(function (ok) {\n showToast(ok\n ? '\u8A3A\u65AD\u30D1\u30C3\u30AF\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002AI \u306B\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002' + NL + '(\u898B\u305F\u76EE\u306E\u5D29\u308C\u306F\u624B\u52D5\u3067\u30B9\u30AF\u30B7\u30E7\u3057\u3066\u6DFB\u4ED8)'\n : '\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3078\u306E\u30B3\u30D4\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30B3\u30F3\u30BD\u30FC\u30EB\u306B\u51FA\u529B\u3057\u307E\u3059\u3002');\n if (!ok) console.log(pack);\n });\n }, true);\n\n if (document.body) buildUI();\n else window.addEventListener('DOMContentLoaded', buildUI);\n})();\n";
|
|
3
|
+
//# sourceMappingURL=inspector-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-client.d.ts","sourceRoot":"","sources":["../../src/lib/inspector-client.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AAEtD,eAAO,MAAM,mBAAmB,o3RA6O/B,CAAC"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
// 42ws dev サーバーが HTML に inject するクライアント検証スクリプト。
|
|
2
|
+
// このファイルは「文字列としての JS ソース」を export する。TS テンプレート
|
|
3
|
+
// リテラル内に置くため、クライアント側コードでは次を厳守する:
|
|
4
|
+
// - バッククォートと ${ を使わない(テンプレートリテラル禁止)
|
|
5
|
+
// - 改行文字が必要な箇所は NL 変数 (String.fromCharCode(10)) を使う
|
|
6
|
+
// これにより TS 側でのエスケープ事故を防ぐ。
|
|
7
|
+
export const INSPECTOR_ENDPOINT = '/__42ws_inspector';
|
|
8
|
+
export const INSPECTOR_CLIENT_JS = `(function () {
|
|
9
|
+
'use strict';
|
|
10
|
+
if (window.__42wsInspector) return;
|
|
11
|
+
window.__42wsInspector = true;
|
|
12
|
+
|
|
13
|
+
var NL = String.fromCharCode(10);
|
|
14
|
+
var ENDPOINT = '${INSPECTOR_ENDPOINT}';
|
|
15
|
+
var MARK = 'data-42ws-inspector';
|
|
16
|
+
|
|
17
|
+
// ---- error ring buffer (last 5) ----------------------------------------
|
|
18
|
+
var errors = [];
|
|
19
|
+
function pushError(type, message) {
|
|
20
|
+
errors.push({ type: type, message: String(message).slice(0, 400) });
|
|
21
|
+
if (errors.length > 5) errors.shift();
|
|
22
|
+
updateBadge();
|
|
23
|
+
try {
|
|
24
|
+
fetch(ENDPOINT + '/log', {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
keepalive: true,
|
|
27
|
+
headers: { 'content-type': 'application/json' },
|
|
28
|
+
body: JSON.stringify({ type: type, message: String(message).slice(0, 1000), url: location.href })
|
|
29
|
+
});
|
|
30
|
+
} catch (e) { /* ignore */ }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
window.addEventListener('error', function (ev) {
|
|
34
|
+
var t = ev.target;
|
|
35
|
+
if (t && t !== window && t.tagName) {
|
|
36
|
+
var src = t.src || t.href || '';
|
|
37
|
+
pushError('Resource', t.tagName.toLowerCase() + ' failed to load: ' + src);
|
|
38
|
+
} else {
|
|
39
|
+
pushError('JS', (ev.message || 'Error') + (ev.filename ? ' @ ' + ev.filename + ':' + ev.lineno : ''));
|
|
40
|
+
}
|
|
41
|
+
}, true);
|
|
42
|
+
|
|
43
|
+
window.addEventListener('unhandledrejection', function (ev) {
|
|
44
|
+
var r = ev.reason;
|
|
45
|
+
pushError('Promise', (r && r.message) ? r.message : String(r));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
var origFetch = window.fetch;
|
|
49
|
+
if (origFetch) {
|
|
50
|
+
window.fetch = function () {
|
|
51
|
+
var args = arguments;
|
|
52
|
+
var url = (args[0] && args[0].url) ? args[0].url : String(args[0]);
|
|
53
|
+
var p = origFetch.apply(this, args);
|
|
54
|
+
if (url.indexOf(ENDPOINT) === -1) {
|
|
55
|
+
p.then(function (res) {
|
|
56
|
+
if (res && res.status >= 400) {
|
|
57
|
+
var method = (args[1] && args[1].method) ? args[1].method : 'GET';
|
|
58
|
+
pushError('HTTP ' + res.status, method + ' ' + url);
|
|
59
|
+
}
|
|
60
|
+
return res;
|
|
61
|
+
}).catch(function (err) {
|
|
62
|
+
pushError('Network', (err && err.message ? err.message : 'fetch failed') + ' ' + url);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return p;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ---- selector / pack ----------------------------------------------------
|
|
70
|
+
function truncate(s, n) {
|
|
71
|
+
s = String(s);
|
|
72
|
+
return s.length > n ? s.slice(0, n) + ' …(truncated)' : s;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function cssPath(el) {
|
|
76
|
+
if (!el || el.nodeType !== 1) return '(unknown)';
|
|
77
|
+
var parts = [];
|
|
78
|
+
var cur = el;
|
|
79
|
+
while (cur && cur.nodeType === 1 && parts.length < 5) {
|
|
80
|
+
if (cur.id) { parts.unshift('#' + cur.id); break; }
|
|
81
|
+
var sel = cur.tagName.toLowerCase();
|
|
82
|
+
var cls = (cur.className && typeof cur.className === 'string')
|
|
83
|
+
? cur.className.trim().split(/\\s+/).filter(Boolean).slice(0, 2) : [];
|
|
84
|
+
if (cls.length) sel += '.' + cls.join('.');
|
|
85
|
+
var parent = cur.parentElement;
|
|
86
|
+
if (parent) {
|
|
87
|
+
var same = Array.prototype.filter.call(parent.children, function (c) { return c.tagName === cur.tagName; });
|
|
88
|
+
if (same.length > 1) sel += ':nth-of-type(' + (same.indexOf(cur) + 1) + ')';
|
|
89
|
+
}
|
|
90
|
+
parts.unshift(sel);
|
|
91
|
+
cur = cur.parentElement;
|
|
92
|
+
}
|
|
93
|
+
return parts.join(' > ');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function buildPack(el) {
|
|
97
|
+
var errLines = errors.length
|
|
98
|
+
? errors.map(function (e) { return '- [' + e.type + '] ' + e.message; }).join(NL)
|
|
99
|
+
: '- (none)';
|
|
100
|
+
var ctx = el.parentElement ? truncate(el.parentElement.outerHTML, 1000) : '(no parent)';
|
|
101
|
+
return [
|
|
102
|
+
'<!-- 42ws page diagnostic pack -->',
|
|
103
|
+
'## url',
|
|
104
|
+
location.href,
|
|
105
|
+
'',
|
|
106
|
+
'## selector',
|
|
107
|
+
cssPath(el),
|
|
108
|
+
'',
|
|
109
|
+
'## outerHTML excerpt',
|
|
110
|
+
truncate(el.outerHTML, 600),
|
|
111
|
+
'',
|
|
112
|
+
'## context HTML',
|
|
113
|
+
ctx,
|
|
114
|
+
'',
|
|
115
|
+
'## errors (last 5)',
|
|
116
|
+
errLines,
|
|
117
|
+
''
|
|
118
|
+
].join(NL);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function copyText(text) {
|
|
122
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
123
|
+
return navigator.clipboard.writeText(text).then(function () { return true; }, function () { return fallbackCopy(text); });
|
|
124
|
+
}
|
|
125
|
+
return Promise.resolve(fallbackCopy(text));
|
|
126
|
+
}
|
|
127
|
+
function fallbackCopy(text) {
|
|
128
|
+
try {
|
|
129
|
+
var ta = document.createElement('textarea');
|
|
130
|
+
ta.value = text;
|
|
131
|
+
ta.style.position = 'fixed';
|
|
132
|
+
ta.style.opacity = '0';
|
|
133
|
+
document.body.appendChild(ta);
|
|
134
|
+
ta.select();
|
|
135
|
+
var ok = document.execCommand('copy');
|
|
136
|
+
document.body.removeChild(ta);
|
|
137
|
+
return ok;
|
|
138
|
+
} catch (e) { return false; }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ---- UI: toolbar + overlay ----------------------------------------------
|
|
142
|
+
var inspecting = false;
|
|
143
|
+
var overlay, bar, badge, toast;
|
|
144
|
+
|
|
145
|
+
function mkEl(tag, css) {
|
|
146
|
+
var el = document.createElement(tag);
|
|
147
|
+
el.setAttribute(MARK, '');
|
|
148
|
+
if (css) el.style.cssText = css;
|
|
149
|
+
return el;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function buildUI() {
|
|
153
|
+
overlay = mkEl('div', 'position:fixed;z-index:2147483646;pointer-events:none;border:2px solid #ff3b6b;background:rgba(255,59,107,0.12);display:none;border-radius:2px;');
|
|
154
|
+
document.body.appendChild(overlay);
|
|
155
|
+
|
|
156
|
+
bar = mkEl('div', 'position:fixed;bottom:16px;right:16px;z-index:2147483647;display:flex;gap:8px;align-items:center;font:600 12px/1 ui-monospace,monospace;background:#10111a;color:#fff;padding:8px 10px;border-radius:10px;box-shadow:0 4px 20px rgba(0,0,0,.35);');
|
|
157
|
+
|
|
158
|
+
var tag = mkEl('span', 'color:#ff3b6b;letter-spacing:.5px;');
|
|
159
|
+
tag.textContent = '42ws';
|
|
160
|
+
bar.appendChild(tag);
|
|
161
|
+
|
|
162
|
+
var btn = mkEl('button', 'cursor:pointer;border:0;border-radius:6px;padding:6px 10px;font:inherit;background:#2b2d3a;color:#fff;');
|
|
163
|
+
btn.textContent = '検証する';
|
|
164
|
+
btn.onclick = function () { setInspecting(!inspecting); };
|
|
165
|
+
bar.appendChild(btn);
|
|
166
|
+
bar.__btn = btn;
|
|
167
|
+
|
|
168
|
+
badge = mkEl('span', 'min-width:18px;text-align:center;border-radius:9px;padding:3px 7px;background:#2b2d3a;color:#8b8d98;');
|
|
169
|
+
badge.textContent = '0';
|
|
170
|
+
badge.title = 'JS/HTTP エラー件数';
|
|
171
|
+
bar.appendChild(badge);
|
|
172
|
+
|
|
173
|
+
document.body.appendChild(bar);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function updateBadge() {
|
|
177
|
+
if (!badge) return;
|
|
178
|
+
badge.textContent = String(errors.length);
|
|
179
|
+
badge.style.background = errors.length ? '#ff3b6b' : '#2b2d3a';
|
|
180
|
+
badge.style.color = errors.length ? '#fff' : '#8b8d98';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function showToast(msg) {
|
|
184
|
+
if (toast) toast.remove();
|
|
185
|
+
toast = mkEl('div', 'position:fixed;bottom:64px;right:16px;z-index:2147483647;max-width:320px;font:500 12px/1.5 ui-monospace,monospace;background:#10111a;color:#fff;padding:10px 12px;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.35);white-space:pre-wrap;');
|
|
186
|
+
toast.textContent = msg;
|
|
187
|
+
document.body.appendChild(toast);
|
|
188
|
+
setTimeout(function () { if (toast) { toast.remove(); toast = null; } }, 4000);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function setInspecting(on) {
|
|
192
|
+
inspecting = on;
|
|
193
|
+
if (bar && bar.__btn) {
|
|
194
|
+
bar.__btn.textContent = on ? '選択中…(Escで中止)' : '検証する';
|
|
195
|
+
bar.__btn.style.background = on ? '#ff3b6b' : '#2b2d3a';
|
|
196
|
+
}
|
|
197
|
+
document.body.style.cursor = on ? 'crosshair' : '';
|
|
198
|
+
if (!on && overlay) overlay.style.display = 'none';
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function isOurs(el) {
|
|
202
|
+
while (el) { if (el.nodeType === 1 && el.hasAttribute && el.hasAttribute(MARK)) return true; el = el.parentNode; }
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
document.addEventListener('mousemove', function (ev) {
|
|
207
|
+
if (!inspecting || !overlay) return;
|
|
208
|
+
var el = ev.target;
|
|
209
|
+
if (!el || isOurs(el)) { overlay.style.display = 'none'; return; }
|
|
210
|
+
var r = el.getBoundingClientRect();
|
|
211
|
+
overlay.style.display = 'block';
|
|
212
|
+
overlay.style.left = r.left + 'px';
|
|
213
|
+
overlay.style.top = r.top + 'px';
|
|
214
|
+
overlay.style.width = r.width + 'px';
|
|
215
|
+
overlay.style.height = r.height + 'px';
|
|
216
|
+
}, true);
|
|
217
|
+
|
|
218
|
+
document.addEventListener('keydown', function (ev) {
|
|
219
|
+
if (ev.key === 'Escape' && inspecting) setInspecting(false);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
document.addEventListener('click', function (ev) {
|
|
223
|
+
if (!inspecting) return;
|
|
224
|
+
var el = ev.target;
|
|
225
|
+
if (isOurs(el)) return;
|
|
226
|
+
ev.preventDefault();
|
|
227
|
+
ev.stopPropagation();
|
|
228
|
+
setInspecting(false);
|
|
229
|
+
var pack = buildPack(el);
|
|
230
|
+
el.scrollIntoView({ block: 'center', behavior: 'smooth' });
|
|
231
|
+
var prev = el.style.outline;
|
|
232
|
+
el.style.outline = '3px solid #ff3b6b';
|
|
233
|
+
setTimeout(function () { el.style.outline = prev; }, 1500);
|
|
234
|
+
copyText(pack).then(function (ok) {
|
|
235
|
+
showToast(ok
|
|
236
|
+
? '診断パックをコピーしました。AI に貼り付けてください。' + NL + '(見た目の崩れは手動でスクショして添付)'
|
|
237
|
+
: 'クリップボードへのコピーに失敗しました。コンソールに出力します。');
|
|
238
|
+
if (!ok) console.log(pack);
|
|
239
|
+
});
|
|
240
|
+
}, true);
|
|
241
|
+
|
|
242
|
+
if (document.body) buildUI();
|
|
243
|
+
else window.addEventListener('DOMContentLoaded', buildUI);
|
|
244
|
+
})();
|
|
245
|
+
`;
|
|
246
|
+
//# sourceMappingURL=inspector-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-client.js","sourceRoot":"","sources":["../../src/lib/inspector-client.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,+CAA+C;AAC/C,iCAAiC;AACjC,sCAAsC;AACtC,sDAAsD;AACtD,0BAA0B;AAE1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;oBAMf,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuOrC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Suggestion {
|
|
2
|
+
/** i18n key — `suggest.<key>.label` / `.hint` を引く */
|
|
3
|
+
key: string;
|
|
4
|
+
cmd?: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* サーバから返ってきた `_suggest` を整形して stderr に出す(JSON モード時はスキップ)。
|
|
9
|
+
* label / hint は CLI 側 i18n テーブルで翻訳する。未登録のキーは表示をスキップ。
|
|
10
|
+
*/
|
|
11
|
+
export declare function printSuggestions(suggestions: unknown): void;
|
|
12
|
+
//# sourceMappingURL=suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/lib/suggest.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAqB3D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isJsonMode } from './output.js';
|
|
2
|
+
import { t } from './i18n.js';
|
|
3
|
+
/**
|
|
4
|
+
* サーバから返ってきた `_suggest` を整形して stderr に出す(JSON モード時はスキップ)。
|
|
5
|
+
* label / hint は CLI 側 i18n テーブルで翻訳する。未登録のキーは表示をスキップ。
|
|
6
|
+
*/
|
|
7
|
+
export function printSuggestions(suggestions) {
|
|
8
|
+
if (isJsonMode())
|
|
9
|
+
return;
|
|
10
|
+
if (!Array.isArray(suggestions) || suggestions.length === 0)
|
|
11
|
+
return;
|
|
12
|
+
const list = suggestions;
|
|
13
|
+
let printedHeader = false;
|
|
14
|
+
for (const s of list) {
|
|
15
|
+
if (!s || typeof s.key !== 'string')
|
|
16
|
+
continue;
|
|
17
|
+
const labelKey = `suggest.${s.key}.label`;
|
|
18
|
+
const label = t(labelKey);
|
|
19
|
+
if (label === labelKey)
|
|
20
|
+
continue; // 翻訳が無いキーはスキップ(壊さない)
|
|
21
|
+
if (!printedHeader) {
|
|
22
|
+
process.stderr.write(t('suggest.header') + '\n');
|
|
23
|
+
printedHeader = true;
|
|
24
|
+
}
|
|
25
|
+
process.stderr.write(` • ${label}\n`);
|
|
26
|
+
const hintKey = `suggest.${s.key}.hint`;
|
|
27
|
+
const hint = t(hintKey);
|
|
28
|
+
if (hint !== hintKey)
|
|
29
|
+
process.stderr.write(` ${hint}\n`);
|
|
30
|
+
if (s.cmd)
|
|
31
|
+
process.stderr.write(` $ ${s.cmd}\n`);
|
|
32
|
+
if (s.url)
|
|
33
|
+
process.stderr.write(` → ${s.url}\n`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/lib/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAS9B;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAoB;IACnD,IAAI,UAAU,EAAE;QAAE,OAAO;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACpE,MAAM,IAAI,GAAG,WAA2B,CAAC;IACzC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,SAAS;QAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,QAAQ,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,QAAQ;YAAE,SAAS,CAAC,qBAAqB;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC;YACjD,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC,GAAG;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,GAAG;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|