adhdev 0.1.53 → 0.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/dist/cli-entrypoint.js +12020 -0
- package/dist/cli-entrypoint.js.map +1 -0
- package/dist/index.js +9789 -9864
- package/dist/index.js.map +1 -0
- package/package.json +19 -16
- package/providers/_builtin/CONTRIBUTING.md +141 -0
- package/providers/_builtin/README.md +51 -0
- package/providers/_builtin/acp/agentpool/provider.json +47 -0
- package/providers/_builtin/acp/amp/provider.json +45 -0
- package/providers/_builtin/acp/auggie/provider.json +50 -0
- package/providers/_builtin/acp/autodev/provider.json +47 -0
- package/providers/_builtin/acp/autohand/provider.json +45 -0
- package/providers/_builtin/acp/blackbox-ai/provider.json +47 -0
- package/providers/_builtin/acp/claude-agent/provider.json +50 -0
- package/providers/_builtin/acp/cline-acp/provider.json +47 -0
- package/providers/_builtin/acp/code-assistant/provider.json +47 -0
- package/providers/_builtin/acp/codebuddy/provider.json +47 -0
- package/providers/_builtin/acp/codex-cli/provider.json +50 -0
- package/providers/_builtin/acp/corust-agent/provider.json +45 -0
- package/providers/_builtin/acp/crow-cli/provider.json +47 -0
- package/providers/_builtin/acp/cursor-acp/provider.json +47 -0
- package/providers/_builtin/acp/deepagents/provider.json +45 -0
- package/providers/_builtin/acp/dimcode/provider.json +47 -0
- package/providers/_builtin/acp/docker-cagent/provider.json +50 -0
- package/providers/_builtin/acp/factory-droid/provider.json +53 -0
- package/providers/_builtin/acp/fast-agent/provider.json +45 -0
- package/providers/_builtin/acp/fount/provider.json +47 -0
- package/providers/_builtin/acp/gemini-cli/provider.json +107 -0
- package/providers/_builtin/acp/github-copilot/provider.json +47 -0
- package/providers/_builtin/acp/goose/provider.json +50 -0
- package/providers/_builtin/acp/junie/provider.json +45 -0
- package/providers/_builtin/acp/kilo/provider.json +45 -0
- package/providers/_builtin/acp/kimi-cli/provider.json +50 -0
- package/providers/_builtin/acp/kiro-cli/provider.json +47 -0
- package/providers/_builtin/acp/minion-code/provider.json +45 -0
- package/providers/_builtin/acp/mistral-vibe/provider.json +50 -0
- package/providers/_builtin/acp/nova/provider.json +47 -0
- package/providers/_builtin/acp/openclaw/provider.json +47 -0
- package/providers/_builtin/acp/opencode/provider.json +45 -0
- package/providers/_builtin/acp/openhands/provider.json +47 -0
- package/providers/_builtin/acp/pi-acp/provider.json +45 -0
- package/providers/_builtin/acp/qoder/provider.json +47 -0
- package/providers/_builtin/acp/qwen-code/provider.json +53 -0
- package/providers/_builtin/acp/stakpak/provider.json +47 -0
- package/providers/_builtin/acp/vtcode/provider.json +47 -0
- package/providers/_builtin/cli/claude-cli/provider.json +78 -0
- package/providers/_builtin/cli/codex-cli/provider.json +60 -0
- package/providers/_builtin/cli/gemini-cli/provider.json +64 -0
- package/providers/_builtin/extension/cline/provider.json +11 -0
- package/providers/_builtin/extension/cline/scripts/open_panel.js +1 -1
- package/providers/_builtin/extension/cline/{provider.js → scripts.js} +29 -55
- package/providers/_builtin/extension/roo-code/provider.json +11 -0
- package/providers/_builtin/extension/roo-code/{provider.js → scripts.js} +27 -97
- package/providers/_builtin/ide/antigravity/provider.json +32 -0
- package/providers/_builtin/ide/antigravity/scripts.js +73 -0
- package/providers/_builtin/ide/cursor/provider.json +35 -0
- package/providers/_builtin/ide/cursor/{provider.js → scripts.js} +31 -69
- package/providers/_builtin/ide/kiro/provider.json +36 -0
- package/providers/_builtin/ide/kiro/scripts/webview_send_message.js +72 -0
- package/providers/_builtin/ide/kiro/scripts.js +62 -0
- package/providers/_builtin/ide/pearai/provider.json +36 -0
- package/providers/_builtin/ide/pearai/scripts/list_sessions.js +38 -0
- package/providers/_builtin/ide/pearai/scripts/new_session.js +55 -0
- package/providers/_builtin/ide/pearai/scripts/webview_list_sessions.js +62 -0
- package/providers/_builtin/ide/pearai/scripts/webview_new_session.js +32 -4
- package/providers/_builtin/ide/pearai/scripts/webview_send_message.js +72 -0
- package/providers/_builtin/ide/pearai/scripts/webview_switch_session.js +34 -0
- package/providers/_builtin/ide/pearai/scripts.js +74 -0
- package/providers/_builtin/ide/trae/provider.json +35 -0
- package/providers/_builtin/ide/trae/scripts/send_message.js +53 -3
- package/providers/_builtin/ide/trae/scripts.js +57 -0
- package/providers/_builtin/ide/vscode/provider.json +33 -0
- package/providers/_builtin/ide/vscode-insiders/provider.json +31 -0
- package/providers/_builtin/ide/vscodium/provider.json +32 -0
- package/providers/_builtin/ide/windsurf/provider.json +22 -0
- package/providers/_builtin/ide/windsurf/scripts.js +57 -0
- package/providers/_builtin/validate.js +156 -0
- package/README.md +0 -43
- package/dist/dev-console-monaco.js +0 -176
- package/dist/dev-console.css +0 -326
- package/dist/dev-console.html +0 -148
- package/dist/dev-console.js +0 -1165
- package/dist/index.d.ts +0 -2
- package/dist/node_datachannel-LPY6EJH5.node +0 -0
- package/providers/_builtin/acp/codex-cli/provider.js +0 -54
- package/providers/_builtin/acp/goose/provider.js +0 -32
- package/providers/_builtin/acp/opencode/provider.js +0 -32
- package/providers/_builtin/cli/claude-cli/provider.js +0 -125
- package/providers/_builtin/cli/codex-cli/provider.js +0 -77
- package/providers/_builtin/cli/gemini-cli/provider.js +0 -121
- package/providers/_builtin/ide/antigravity/provider.js +0 -114
- package/providers/_builtin/ide/cursor/provider.js.backup +0 -116
- package/providers/_builtin/ide/cursor/provider.js.bak +0 -127
- package/providers/_builtin/ide/cursor/scripts_backup/focus_editor.js +0 -20
- package/providers/_builtin/ide/cursor/scripts_backup/list_chats.js +0 -111
- package/providers/_builtin/ide/cursor/scripts_backup/new_session.js +0 -62
- package/providers/_builtin/ide/cursor/scripts_backup/open_panel.js +0 -31
- package/providers/_builtin/ide/cursor/scripts_backup/read_chat.js +0 -433
- package/providers/_builtin/ide/cursor/scripts_backup/resolve_action.js +0 -90
- package/providers/_builtin/ide/cursor/scripts_backup/send_message.js +0 -86
- package/providers/_builtin/ide/cursor/scripts_backup/switch_session.js +0 -63
- package/providers/_builtin/ide/kiro/provider.js +0 -86
- package/providers/_builtin/ide/pearai/provider.js +0 -88
- package/providers/_builtin/ide/trae/provider.js +0 -83
- package/providers/_builtin/ide/vscode/provider.js +0 -36
- package/providers/_builtin/ide/vscode-insiders/provider.js +0 -27
- package/providers/_builtin/ide/vscodium/provider.js +0 -27
- package/providers/_builtin/ide/windsurf/provider.js +0 -76
- /package/providers/{_helpers → _builtin/_helpers}/index.js +0 -0
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor — IDE Provider
|
|
3
|
-
* @type {import('../../../src/providers/contracts').ProviderModule}
|
|
4
|
-
*/
|
|
5
|
-
module.exports = {
|
|
6
|
-
type: 'cursor',
|
|
7
|
-
name: 'Cursor',
|
|
8
|
-
category: 'ide',
|
|
9
|
-
displayName: 'Cursor',
|
|
10
|
-
icon: '⚡',
|
|
11
|
-
cli: 'cursor',
|
|
12
|
-
cdpPorts: [9333, 9334],
|
|
13
|
-
processNames: { darwin: 'Cursor', win32: ['Cursor.exe'] },
|
|
14
|
-
paths: {
|
|
15
|
-
darwin: ['/Applications/Cursor.app'],
|
|
16
|
-
win32: ['C:\\Users\\*\\AppData\\Local\\Programs\\cursor\\Cursor.exe'],
|
|
17
|
-
linux: ['/opt/Cursor', '/usr/share/cursor'],
|
|
18
|
-
},
|
|
19
|
-
inputMethod: 'cdp-type-and-send',
|
|
20
|
-
inputSelector: '.aislash-editor-input[contenteditable="true"]',
|
|
21
|
-
|
|
22
|
-
scripts: {
|
|
23
|
-
readChat() {
|
|
24
|
-
return `(() => {
|
|
25
|
-
try {
|
|
26
|
-
const c = document.querySelector('[data-composer-id]');
|
|
27
|
-
const id = c?.getAttribute('data-composer-id') || 'active';
|
|
28
|
-
const rawStatus = c?.getAttribute('data-composer-status') || 'idle';
|
|
29
|
-
const status = rawStatus === 'thinking' ? 'generating' : rawStatus;
|
|
30
|
-
const msgs = [];
|
|
31
|
-
document.querySelectorAll('.composer-human-ai-pair-container').forEach((p, i) => {
|
|
32
|
-
const h = p.querySelector('.composer-human-message');
|
|
33
|
-
if (h) msgs.push({ role: 'user', content: h.textContent.trim().substring(0, 6000), index: msgs.length });
|
|
34
|
-
p.querySelectorAll('.composer-rendered-message').forEach(a => {
|
|
35
|
-
if (a.closest('.composer-human-message')) return;
|
|
36
|
-
const t = a.textContent.trim();
|
|
37
|
-
if (t) msgs.push({ role: 'assistant', content: t.substring(0, 6000), index: msgs.length });
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
const inputEl = document.querySelector('.aislash-editor-input[contenteditable="true"]');
|
|
41
|
-
const inputContent = inputEl?.textContent?.trim() || '';
|
|
42
|
-
return JSON.stringify({ id, status, title: document.title.split(' — ')[0], messages: msgs, inputContent });
|
|
43
|
-
} catch(e) {
|
|
44
|
-
return JSON.stringify({ id: '', status: 'error', messages: [] });
|
|
45
|
-
}
|
|
46
|
-
})()`;
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
sendMessage(text) {
|
|
50
|
-
return `(() => {
|
|
51
|
-
try {
|
|
52
|
-
const input = document.querySelector('.aislash-editor-input[contenteditable="true"]');
|
|
53
|
-
if (!input) return JSON.stringify({ sent: false, error: 'Input box not found' });
|
|
54
|
-
return JSON.stringify({
|
|
55
|
-
sent: false,
|
|
56
|
-
needsTypeAndSend: true,
|
|
57
|
-
selector: '.aislash-editor-input[contenteditable="true"]',
|
|
58
|
-
});
|
|
59
|
-
} catch(e) {
|
|
60
|
-
return JSON.stringify({ sent: false, error: e.message });
|
|
61
|
-
}
|
|
62
|
-
})()`;
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
listSessions() {
|
|
66
|
-
return `(() => {
|
|
67
|
-
try {
|
|
68
|
-
const sessions = [];
|
|
69
|
-
const composer = document.querySelector('[data-composer-id]');
|
|
70
|
-
if (composer) {
|
|
71
|
-
sessions.push({
|
|
72
|
-
id: composer.getAttribute('data-composer-id'),
|
|
73
|
-
title: document.title.split(' — ')[0],
|
|
74
|
-
active: true,
|
|
75
|
-
status: composer.getAttribute('data-composer-status') || 'idle',
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
return JSON.stringify(sessions);
|
|
79
|
-
} catch(e) {
|
|
80
|
-
return JSON.stringify([]);
|
|
81
|
-
}
|
|
82
|
-
})()`;
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
newSession() {
|
|
86
|
-
return `(() => {
|
|
87
|
-
try {
|
|
88
|
-
const newBtn = [...document.querySelectorAll('a.action-label.codicon-add-two')]
|
|
89
|
-
.find(a => (a.getAttribute('aria-label') || '').startsWith('New Chat'));
|
|
90
|
-
if (newBtn) { newBtn.click(); return JSON.stringify({ created: true }); }
|
|
91
|
-
return JSON.stringify({ created: false, error: 'New Chat button not found' });
|
|
92
|
-
} catch(e) {
|
|
93
|
-
return JSON.stringify({ created: false, error: e.message });
|
|
94
|
-
}
|
|
95
|
-
})()`;
|
|
96
|
-
},
|
|
97
|
-
|
|
98
|
-
focusEditor() {
|
|
99
|
-
return `(() => {
|
|
100
|
-
try {
|
|
101
|
-
const input = document.querySelector('.aislash-editor-input[contenteditable="true"]');
|
|
102
|
-
if (input) { input.focus(); return 'focused'; }
|
|
103
|
-
return 'not_found';
|
|
104
|
-
} catch(e) { return 'error'; }
|
|
105
|
-
})()`;
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
openPanel() {
|
|
109
|
-
return `(() => {
|
|
110
|
-
try {
|
|
111
|
-
const sidebar = document.getElementById('workbench.parts.auxiliarybar');
|
|
112
|
-
if (sidebar && sidebar.offsetWidth > 0) {
|
|
113
|
-
const chatView = document.querySelector('[data-composer-id]');
|
|
114
|
-
if (chatView) return 'visible';
|
|
115
|
-
}
|
|
116
|
-
const btns = [...document.querySelectorAll('li.action-item a, button, [role="tab"]')];
|
|
117
|
-
const toggle = btns.find(b => {
|
|
118
|
-
const label = (b.textContent || b.getAttribute('aria-label') || '').toLowerCase();
|
|
119
|
-
return /agent|chat|composer|cursor tab/i.test(label);
|
|
120
|
-
});
|
|
121
|
-
if (toggle) { toggle.click(); return 'opened'; }
|
|
122
|
-
return 'not_found';
|
|
123
|
-
} catch (e) { return 'error'; }
|
|
124
|
-
})()`;
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor v1 — focus_editor
|
|
3
|
-
*
|
|
4
|
-
* CURSOR.md 4-5: 셀렉터 우선순위
|
|
5
|
-
* [contenteditable="true"][role="textbox"]
|
|
6
|
-
* → .chat-input textarea
|
|
7
|
-
* → .composer-input
|
|
8
|
-
* → textarea
|
|
9
|
-
*
|
|
10
|
-
* 최종 확인: 2026-03-06
|
|
11
|
-
*/
|
|
12
|
-
(() => {
|
|
13
|
-
const editor = document.querySelector('[contenteditable="true"][role="textbox"]')
|
|
14
|
-
|| document.querySelector('.chat-input textarea')
|
|
15
|
-
|| document.querySelector('.composer-input')
|
|
16
|
-
|| document.querySelector('textarea.native-input')
|
|
17
|
-
|| document.querySelector('textarea');
|
|
18
|
-
if (editor) { editor.focus(); return 'focused'; }
|
|
19
|
-
return 'no editor found';
|
|
20
|
-
})()
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor v1 — list_chats
|
|
3
|
-
*
|
|
4
|
-
* CURSOR.md 4-2: React Fiber 주 수단, DOM 폴백
|
|
5
|
-
* Fiber keys: summaries, recentConversations, chatHistory, composers
|
|
6
|
-
* "More" 항목 제외, modSec 정렬, 중복 제거, 100자 truncate
|
|
7
|
-
*
|
|
8
|
-
* 최종 확인: 2026-03-06
|
|
9
|
-
*/
|
|
10
|
-
(async () => {
|
|
11
|
-
// ─── 1. React Fiber에서 히스토리 추출 ───
|
|
12
|
-
const getFiberHistory = function () {
|
|
13
|
-
// CURSOR.md: Fiber 엔트리 포인트
|
|
14
|
-
const entryPoints = ['.composer-view', '.chat-view', '.agent-sidebar-cell', '[data-past-conversations-toggle="true"]', '.history-toggle-button', '#workbench.parts.auxiliarybar'];
|
|
15
|
-
for (var i = 0; i < entryPoints.length; i++) {
|
|
16
|
-
var el = document.querySelector(entryPoints[i]);
|
|
17
|
-
if (!el) continue;
|
|
18
|
-
var fiberKey = Object.keys(el).find(function (k) { return k.startsWith('__reactFiber'); });
|
|
19
|
-
if (!fiberKey) continue;
|
|
20
|
-
var fiber = el[fiberKey];
|
|
21
|
-
var summaries = null;
|
|
22
|
-
var currentWsUris = null;
|
|
23
|
-
// CURSOR.md: Fiber 순회 (최대 200)
|
|
24
|
-
for (var d = 0; d < 200 && fiber; d++) {
|
|
25
|
-
if (fiber.memoizedState) {
|
|
26
|
-
var s = fiber.memoizedState;
|
|
27
|
-
while (s) {
|
|
28
|
-
try {
|
|
29
|
-
var ms = s.memoizedState;
|
|
30
|
-
if (ms && typeof ms === 'object') {
|
|
31
|
-
// CURSOR.md Fiber keys
|
|
32
|
-
if (ms.summaries) summaries = ms.summaries;
|
|
33
|
-
else if (ms.recentConversations) summaries = ms.recentConversations;
|
|
34
|
-
else if (ms.chatHistory) summaries = ms.chatHistory;
|
|
35
|
-
else if (ms.composers && Array.isArray(ms.composers)) {
|
|
36
|
-
summaries = {};
|
|
37
|
-
ms.composers.forEach(c => summaries[c.id || c.composerId] = c);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// CURSOR.md: 워크스페이스 URI 추출
|
|
41
|
-
var lrs = s.queue && s.queue.lastRenderedState;
|
|
42
|
-
if (lrs && lrs.workspaceUris && Array.isArray(lrs.workspaceUris)) currentWsUris = lrs.workspaceUris;
|
|
43
|
-
if (summaries) break;
|
|
44
|
-
} catch (e) { }
|
|
45
|
-
s = s.next;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
if (summaries) break;
|
|
49
|
-
fiber = fiber.return;
|
|
50
|
-
}
|
|
51
|
-
if (summaries) {
|
|
52
|
-
var wsUris = currentWsUris ? new Set(currentWsUris) : null;
|
|
53
|
-
var res = [];
|
|
54
|
-
var entries = Object.entries(summaries);
|
|
55
|
-
for (var j = 0; j < entries.length; j++) {
|
|
56
|
-
var pair = entries[j];
|
|
57
|
-
var id = pair[0];
|
|
58
|
-
var info = pair[1];
|
|
59
|
-
if (!id || !info) continue;
|
|
60
|
-
// CURSOR.md: 히스토리 항목 필드 (summary → title → name → historyItemName)
|
|
61
|
-
var title = info.summary || info.title || info.name || info.historyItemName || 'New Chat';
|
|
62
|
-
var status = info.mode || info.unifiedMode || 'standard';
|
|
63
|
-
var lastMod = (info.lastModifiedTime && info.lastModifiedTime.seconds) || info.lastUpdatedAt || info.createdAt || 0;
|
|
64
|
-
// 워크스페이스 필터링
|
|
65
|
-
if (wsUris && info.workspaces) {
|
|
66
|
-
var match = false;
|
|
67
|
-
for (var k = 0; k < info.workspaces.length; k++) {
|
|
68
|
-
if (wsUris.has(info.workspaces[k].workspaceFolderAbsoluteUri || '')) { match = true; break; }
|
|
69
|
-
}
|
|
70
|
-
if (!match) continue;
|
|
71
|
-
}
|
|
72
|
-
// CURSOR.md: "More" 항목 제외 필수
|
|
73
|
-
if (id === 'More' || (title || '').toLowerCase() === 'more' || id === 'history.more') continue;
|
|
74
|
-
res.push({ id: id, title: title, status: status, modSec: lastMod });
|
|
75
|
-
}
|
|
76
|
-
// modSec 내림차순 정렬
|
|
77
|
-
res.sort(function (a, b) { return b.modSec - a.modSec; });
|
|
78
|
-
return res;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return null;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
// ─── 2. DOM 폴백 (CURSOR.md 셀렉터 참조표) ───
|
|
85
|
-
const getDomHistory = function () {
|
|
86
|
-
const selectors = ['.composer-below-chat-history-item', '.agent-sidebar-cell', '.chat-history-item', '.composer-history-item', '.history-item-container', '.monaco-list-row[aria-label*="Chat"]', '.monaco-list-row[aria-label*="Composer"]', '.monaco-list-row[aria-label*="Conversation"]'];
|
|
87
|
-
const items = document.querySelectorAll(selectors.join(', '));
|
|
88
|
-
return Array.from(items).map(function (el) {
|
|
89
|
-
// .agent-sidebar-cell-text, .auxiliary-bar-chat-title (CURSOR.md)
|
|
90
|
-
const titleEl = el.querySelector('.agent-sidebar-cell-text, .auxiliary-bar-chat-title, [class*="title"], [class*="label"], .composer-history-item-title') || el;
|
|
91
|
-
let title = titleEl && titleEl.textContent ? titleEl.textContent.trim() : (el.getAttribute('title') || el.getAttribute('aria-label'));
|
|
92
|
-
if (title) title = title.replace(/\s+\d+[hdmyws]$/, '').replace(/^\d+[hdmyws]\s+/, '').trim();
|
|
93
|
-
return { id: el.getAttribute('data-composer-id') || el.getAttribute('data-id') || el.id || title, status: el.getAttribute('data-composer-status') || '', title: title || 'New Chat' };
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// ─── 3. 결과 조합 ───
|
|
98
|
-
let history = getFiberHistory();
|
|
99
|
-
if (!history || history.length === 0) history = getDomHistory();
|
|
100
|
-
if (history && history.length > 0) {
|
|
101
|
-
// 중복 제거 + 100자 truncate
|
|
102
|
-
const seen = new Set();
|
|
103
|
-
return history.filter(item => {
|
|
104
|
-
const key = item.id || item.title;
|
|
105
|
-
if (seen.has(key)) return false;
|
|
106
|
-
seen.add(key);
|
|
107
|
-
return true;
|
|
108
|
-
}).map(item => ({ id: item.id, title: item.title && item.title.length > 100 ? item.title.substring(0, 100) + '...' : item.title, status: item.status }));
|
|
109
|
-
}
|
|
110
|
-
return [];
|
|
111
|
-
})()
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor v1 — new_session
|
|
3
|
-
*
|
|
4
|
-
* Cursor는 workbench DOM 직접 접근.
|
|
5
|
-
* "New Chat" / "New Composer" 버튼 찾기.
|
|
6
|
-
*
|
|
7
|
-
* 전략:
|
|
8
|
-
* 1. 키보드 단축키 Ctrl+L (새 composer)
|
|
9
|
-
* 2. aria-label 기반
|
|
10
|
-
* 3. 텍스트 기반
|
|
11
|
-
*
|
|
12
|
-
* 최종 확인: 2026-03-07
|
|
13
|
-
*/
|
|
14
|
-
(() => {
|
|
15
|
-
try {
|
|
16
|
-
// ─── 1. aria-label 기반 ───
|
|
17
|
-
const allBtns = Array.from(document.querySelectorAll('button, [role="button"], .action-item'))
|
|
18
|
-
.filter(b => b.offsetWidth > 0);
|
|
19
|
-
|
|
20
|
-
for (const btn of allBtns) {
|
|
21
|
-
const label = (btn.getAttribute('aria-label') || '').toLowerCase();
|
|
22
|
-
if (label.includes('new chat') || label.includes('new composer') ||
|
|
23
|
-
label.includes('new conversation') || label.includes('start new')) {
|
|
24
|
-
btn.click();
|
|
25
|
-
return 'clicked (aria)';
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// ─── 2. 텍스트 기반 ───
|
|
30
|
-
for (const btn of allBtns) {
|
|
31
|
-
const text = (btn.textContent || '').trim();
|
|
32
|
-
if (text === '+' || text === 'New Chat' || text === 'New Composer' ||
|
|
33
|
-
text === 'Start New Chat') {
|
|
34
|
-
btn.click();
|
|
35
|
-
return 'clicked (text)';
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ─── 3. Codicon 아이콘 기반 (Cursor 스타일) ───
|
|
40
|
-
for (const btn of allBtns) {
|
|
41
|
-
const hasPlus = btn.querySelector('.codicon-plus, .codicon-add, [class*="plus"]');
|
|
42
|
-
if (hasPlus) {
|
|
43
|
-
const label = (btn.getAttribute('aria-label') || btn.getAttribute('title') || '').toLowerCase();
|
|
44
|
-
if (label.includes('chat') || label.includes('composer') || label.includes('new') || label === '') {
|
|
45
|
-
btn.click();
|
|
46
|
-
return 'clicked (icon)';
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ─── 4. 키보드 단축키 Ctrl+L (Cursor 기본 바인딩) ───
|
|
52
|
-
document.dispatchEvent(new KeyboardEvent('keydown', {
|
|
53
|
-
key: 'l', code: 'KeyL', keyCode: 76,
|
|
54
|
-
ctrlKey: true, metaKey: false,
|
|
55
|
-
bubbles: true, cancelable: true,
|
|
56
|
-
}));
|
|
57
|
-
|
|
58
|
-
return 'sent Ctrl+L';
|
|
59
|
-
} catch (e) {
|
|
60
|
-
return 'error: ' + e.message;
|
|
61
|
-
}
|
|
62
|
-
})()
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor v1 — open_panel
|
|
3
|
-
*
|
|
4
|
-
* Cursor Agent 패널이 숨겨져 있을 때 패널 열기.
|
|
5
|
-
* Cursor 워크벤치 페이지에서 실행 (type=page, workbench URL)
|
|
6
|
-
*
|
|
7
|
-
* 반환: 'visible' | 'opened' | 'error: ...'
|
|
8
|
-
* 최종 확인: 2026-03-07
|
|
9
|
-
*/
|
|
10
|
-
(() => {
|
|
11
|
-
try {
|
|
12
|
-
// Cursor Agent 패널 확인
|
|
13
|
-
const sidebar = document.getElementById('workbench.parts.auxiliarybar') ||
|
|
14
|
-
document.getElementById('workbench.parts.unifiedsidebar');
|
|
15
|
-
if (sidebar && sidebar.offsetWidth > 0 && sidebar.offsetHeight > 0) {
|
|
16
|
-
return 'visible';
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Toggle 버튼 클릭
|
|
20
|
-
const toggleBtns = Array.from(document.querySelectorAll('li.action-item a'));
|
|
21
|
-
for (const btn of toggleBtns) {
|
|
22
|
-
const label = (btn.getAttribute('aria-label') || '').toLowerCase();
|
|
23
|
-
if (label.includes('toggle agents') || label.includes('toggle primary')) {
|
|
24
|
-
btn.click();
|
|
25
|
-
return 'opened (toggle)';
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return 'error: no toggle button found';
|
|
30
|
-
} catch (e) { return 'error: ' + e.message; }
|
|
31
|
-
})()
|