chrome-jig 0.3.0 → 0.4.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.md +41 -24
- package/SKILL.md +47 -12
- package/dist/chrome/connection.d.ts +3 -2
- package/dist/chrome/connection.d.ts.map +1 -1
- package/dist/chrome/connection.js +18 -11
- package/dist/chrome/connection.js.map +1 -1
- package/dist/cli.js +136 -108
- package/dist/cli.js.map +1 -1
- package/dist/commands/eval-file.d.ts +7 -0
- package/dist/commands/eval-file.d.ts.map +1 -0
- package/dist/commands/eval-file.js +19 -0
- package/dist/commands/eval-file.js.map +1 -0
- package/dist/commands/nrepl.d.ts +7 -1
- package/dist/commands/nrepl.d.ts.map +1 -1
- package/dist/commands/nrepl.js +11 -7
- package/dist/commands/nrepl.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/repl/repl.d.ts +1 -0
- package/dist/repl/repl.d.ts.map +1 -1
- package/dist/repl/repl.js +1 -1
- package/dist/repl/repl.js.map +1 -1
- package/dist/session/repl-protocol.d.ts +2 -0
- package/dist/session/repl-protocol.d.ts.map +1 -1
- package/dist/session/repl-protocol.js +5 -1
- package/dist/session/repl-protocol.js.map +1 -1
- package/editor/nvim/README.md +8 -8
- package/editor/nvim/lua/cjig/init.lua +180 -182
- package/package.json +13 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl-protocol.d.ts","sourceRoot":"","sources":["../../src/session/repl-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuCpF,qBAAa,YAAa,YAAW,QAAQ;
|
|
1
|
+
{"version":3,"file":"repl-protocol.d.ts","sourceRoot":"","sources":["../../src/session/repl-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuCpF,qBAAa,YAAa,YAAW,QAAQ;IAI/B,OAAO,CAAC,IAAI;IAHxB,gDAAgD;IAChD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAEhB,IAAI,GAAE,IAAI,GAAG,MAAa;IAE9C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,IAAI;IAgCpD,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM;IAWxD,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAIvE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAoB5E"}
|
|
@@ -36,8 +36,12 @@ function parseDotCommand(input) {
|
|
|
36
36
|
return { name: name.toLowerCase(), args };
|
|
37
37
|
}
|
|
38
38
|
export class ReplProtocol {
|
|
39
|
+
lang;
|
|
39
40
|
/** Track last injected ref for file watching */
|
|
40
41
|
lastInjectRef = null;
|
|
42
|
+
constructor(lang = 'js') {
|
|
43
|
+
this.lang = lang;
|
|
44
|
+
}
|
|
41
45
|
parse(input) {
|
|
42
46
|
const trimmed = input.trim();
|
|
43
47
|
if (!trimmed)
|
|
@@ -64,7 +68,7 @@ export class ReplProtocol {
|
|
|
64
68
|
};
|
|
65
69
|
}
|
|
66
70
|
// Bare text → eval
|
|
67
|
-
return { method: 'eval', params: { code: trimmed } };
|
|
71
|
+
return { method: 'eval', params: { code: trimmed, lang: this.lang } };
|
|
68
72
|
}
|
|
69
73
|
formatResult(_request, result) {
|
|
70
74
|
if (result === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl-protocol.js","sourceRoot":"","sources":["../../src/session/repl-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,iEAAiE;AACjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,MAAM,EAAE,GAAG,EAAE,GAAG;IAChB,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,MAAM,EAAE,GAAG;IACnB,MAAM,EAAE,GAAG,EAAE,MAAM;CACpB,CAAC,CAAC;AAEH,2CAA2C;AAC3C,MAAM,YAAY,GAA8C;IAC9D,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE7C,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;IAC1E,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;IAE7E,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;IACtE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;IACjE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;IAEpE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;CAC5C,CAAC;AAEF,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"repl-protocol.js","sourceRoot":"","sources":["../../src/session/repl-protocol.ts"],"names":[],"mappings":"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"}
|
package/editor/nvim/README.md
CHANGED
|
@@ -63,16 +63,16 @@ Then remove the corresponding line from your Neovim config.
|
|
|
63
63
|
|
|
64
64
|
## Default Keymaps
|
|
65
65
|
|
|
66
|
-
All under `<leader>
|
|
66
|
+
All under `<leader>b` (configurable via `opts.leader`):
|
|
67
67
|
|
|
68
68
|
| Key | Mode | Action |
|
|
69
69
|
|---|---|---|
|
|
70
|
-
| `<leader>
|
|
71
|
-
| `<leader>
|
|
72
|
-
| `<leader>
|
|
73
|
-
| `<leader>
|
|
74
|
-
| `<leader>
|
|
75
|
-
| `<leader>
|
|
70
|
+
| `<leader>be` | v | Eval selection |
|
|
71
|
+
| `<leader>bf` | n | Eval form at cursor |
|
|
72
|
+
| `<leader>bt` | n | List tabs |
|
|
73
|
+
| `<leader>br` | n | Reload tab |
|
|
74
|
+
| `<leader>bc` | n | Connect |
|
|
75
|
+
| `<leader>bd` | n | Disconnect |
|
|
76
76
|
|
|
77
77
|
Disable with `require("cjig").setup({ keymaps = false })`.
|
|
78
78
|
|
|
@@ -81,7 +81,7 @@ Disable with `require("cjig").setup({ keymaps = false })`.
|
|
|
81
81
|
```lua
|
|
82
82
|
require("cjig").setup({
|
|
83
83
|
keymaps = true, -- set false to skip default keymaps
|
|
84
|
-
leader = "<leader>
|
|
84
|
+
leader = "<leader>b", -- keymap prefix
|
|
85
85
|
})
|
|
86
86
|
```
|
|
87
87
|
|
|
@@ -10,217 +10,215 @@ local M = {}
|
|
|
10
10
|
|
|
11
11
|
-- Evaluable treesitter node types
|
|
12
12
|
local EVAL_NODES = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
expression_statement = true,
|
|
14
|
+
variable_declaration = true,
|
|
15
|
+
lexical_declaration = true,
|
|
16
|
+
function_declaration = true,
|
|
17
|
+
call_expression = true,
|
|
18
|
+
assignment_expression = true,
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
--- Detect language from filetype.
|
|
22
22
|
--- @return string "js" or "cljs"
|
|
23
23
|
local function detect_lang()
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
if vim.bo.filetype == "clojure" then
|
|
25
|
+
return "cljs"
|
|
26
|
+
end
|
|
27
|
+
return "js"
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
--- Get visual selection text.
|
|
31
31
|
--- @return string
|
|
32
32
|
local function get_visual_selection()
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
33
|
+
local _, srow, scol, _ = unpack(vim.fn.getpos("'<"))
|
|
34
|
+
local _, erow, ecol, _ = unpack(vim.fn.getpos("'>"))
|
|
35
|
+
|
|
36
|
+
if srow > erow or (srow == erow and scol > ecol) then
|
|
37
|
+
srow, erow = erow, srow
|
|
38
|
+
scol, ecol = ecol, scol
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
local lines = vim.api.nvim_buf_get_lines(0, srow - 1, erow, false)
|
|
42
|
+
if #lines == 0 then
|
|
43
|
+
return ""
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if #lines == 1 then
|
|
47
|
+
lines[1] = lines[1]:sub(scol, ecol)
|
|
48
|
+
else
|
|
49
|
+
lines[1] = lines[1]:sub(scol)
|
|
50
|
+
lines[#lines] = lines[#lines]:sub(1, ecol)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
return table.concat(lines, "\n")
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
--- Walk up treesitter tree to find nearest evaluable node.
|
|
55
57
|
--- @return string|nil
|
|
56
58
|
local function get_treesitter_form()
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
59
|
+
local ok, ts_utils = pcall(require, "nvim-treesitter.ts_utils")
|
|
60
|
+
local node
|
|
61
|
+
|
|
62
|
+
if ok then
|
|
63
|
+
node = ts_utils.get_node_at_cursor()
|
|
64
|
+
else
|
|
65
|
+
-- Fallback: use built-in treesitter
|
|
66
|
+
node = vim.treesitter.get_node()
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if not node then
|
|
70
|
+
return nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
-- Walk up to nearest evaluable node
|
|
74
|
+
while node do
|
|
75
|
+
if EVAL_NODES[node:type()] then
|
|
76
|
+
local sr, sc, er, ec = node:range()
|
|
77
|
+
local lines = vim.api.nvim_buf_get_text(0, sr, sc, er, ec, {})
|
|
78
|
+
local text = table.concat(lines, "\n")
|
|
79
|
+
|
|
80
|
+
-- Strip trailing semicolon from expression statements
|
|
81
|
+
if node:type() == "expression_statement" then
|
|
82
|
+
text = text:gsub(";%s*$", "")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
return text
|
|
86
|
+
end
|
|
87
|
+
node = node:parent()
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
return nil
|
|
87
91
|
end
|
|
88
92
|
|
|
89
93
|
--- Eval code string in browser, show result in float.
|
|
90
94
|
--- @param code string
|
|
91
95
|
local function eval_and_show(code)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
96
|
+
if code == "" then
|
|
97
|
+
ui.show_error("No code to evaluate")
|
|
98
|
+
return
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
local lang = detect_lang()
|
|
102
|
+
|
|
103
|
+
rpc.ensure_connected(function()
|
|
104
|
+
vim.schedule(function()
|
|
105
|
+
rpc.request("eval", { code = code, lang = lang }, function(result)
|
|
106
|
+
vim.schedule(function()
|
|
107
|
+
ui.show_result(result)
|
|
108
|
+
end)
|
|
109
|
+
end, function(err)
|
|
110
|
+
vim.schedule(function()
|
|
111
|
+
ui.show_error(err)
|
|
112
|
+
end)
|
|
113
|
+
end)
|
|
114
|
+
end)
|
|
115
|
+
end)
|
|
112
116
|
end
|
|
113
117
|
|
|
114
118
|
--- Register all user commands.
|
|
115
119
|
local function register_commands()
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
120
|
+
vim.api.nvim_create_user_command("CjigConnect", function()
|
|
121
|
+
rpc.connect()
|
|
122
|
+
end, { desc = "Connect to Chrome via cjig serve" })
|
|
123
|
+
|
|
124
|
+
vim.api.nvim_create_user_command("CjigDisconnect", function()
|
|
125
|
+
rpc.disconnect()
|
|
126
|
+
end, { desc = "Disconnect from cjig" })
|
|
127
|
+
|
|
128
|
+
vim.api.nvim_create_user_command("CjigEval", function()
|
|
129
|
+
local code = get_visual_selection()
|
|
130
|
+
eval_and_show(code)
|
|
131
|
+
end, { range = true, desc = "Eval visual selection in browser" })
|
|
132
|
+
|
|
133
|
+
vim.api.nvim_create_user_command("CjigEvalForm", function()
|
|
134
|
+
local code = get_treesitter_form()
|
|
135
|
+
if not code then
|
|
136
|
+
ui.show_error("No evaluable form at cursor")
|
|
137
|
+
return
|
|
138
|
+
end
|
|
139
|
+
eval_and_show(code)
|
|
140
|
+
end, { desc = "Eval treesitter form at cursor" })
|
|
141
|
+
|
|
142
|
+
vim.api.nvim_create_user_command("CjigTabs", function()
|
|
143
|
+
rpc.ensure_connected(function()
|
|
144
|
+
vim.schedule(function()
|
|
145
|
+
rpc.request("tabs", {}, function(result)
|
|
146
|
+
vim.schedule(function()
|
|
147
|
+
if result and result.formatted then
|
|
148
|
+
ui.show_result(result.formatted)
|
|
149
|
+
else
|
|
150
|
+
ui.show_result(result)
|
|
151
|
+
end
|
|
152
|
+
end)
|
|
153
|
+
end, function(err)
|
|
154
|
+
vim.schedule(function()
|
|
155
|
+
ui.show_error(err)
|
|
156
|
+
end)
|
|
157
|
+
end)
|
|
158
|
+
end)
|
|
159
|
+
end)
|
|
160
|
+
end, { desc = "List browser tabs" })
|
|
161
|
+
|
|
162
|
+
vim.api.nvim_create_user_command("CjigInject", function(opts)
|
|
163
|
+
local ref = opts.args
|
|
164
|
+
if ref == "" then
|
|
165
|
+
ui.show_error("Usage: :CjigInject <name>")
|
|
166
|
+
return
|
|
167
|
+
end
|
|
168
|
+
rpc.ensure_connected(function()
|
|
169
|
+
vim.schedule(function()
|
|
170
|
+
rpc.request("inject", { ref = ref }, function(result)
|
|
171
|
+
vim.schedule(function()
|
|
172
|
+
if result and result.formatted then
|
|
173
|
+
vim.notify("cjig: " .. result.formatted, vim.log.levels.INFO)
|
|
174
|
+
else
|
|
175
|
+
ui.show_result(result)
|
|
176
|
+
end
|
|
177
|
+
end)
|
|
178
|
+
end, function(err)
|
|
179
|
+
vim.schedule(function()
|
|
180
|
+
ui.show_error(err)
|
|
181
|
+
end)
|
|
182
|
+
end)
|
|
183
|
+
end)
|
|
184
|
+
end)
|
|
185
|
+
end, { nargs = 1, desc = "Inject a harness script" })
|
|
186
|
+
|
|
187
|
+
vim.api.nvim_create_user_command("CjigReload", function()
|
|
188
|
+
rpc.ensure_connected(function()
|
|
189
|
+
vim.schedule(function()
|
|
190
|
+
rpc.request("reload", {}, function(_)
|
|
191
|
+
vim.schedule(function()
|
|
192
|
+
vim.notify("cjig: Reloaded", vim.log.levels.INFO)
|
|
193
|
+
end)
|
|
194
|
+
end, function(err)
|
|
195
|
+
vim.schedule(function()
|
|
196
|
+
ui.show_error(err)
|
|
197
|
+
end)
|
|
198
|
+
end)
|
|
199
|
+
end)
|
|
200
|
+
end)
|
|
201
|
+
end, { desc = "Reload current browser tab" })
|
|
198
202
|
end
|
|
199
203
|
|
|
200
204
|
--- Setup the plugin with optional config.
|
|
201
205
|
--- @param opts? table
|
|
202
206
|
function M.setup(opts)
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
{ silent = true, desc = "cjig: reload tab" })
|
|
219
|
-
vim.keymap.set("n", leader .. "c", "<cmd>CjigConnect<CR>",
|
|
220
|
-
{ silent = true, desc = "cjig: connect" })
|
|
221
|
-
vim.keymap.set("n", leader .. "d", "<cmd>CjigDisconnect<CR>",
|
|
222
|
-
{ silent = true, desc = "cjig: disconnect" })
|
|
223
|
-
end
|
|
207
|
+
opts = opts or {}
|
|
208
|
+
|
|
209
|
+
register_commands()
|
|
210
|
+
|
|
211
|
+
-- Default keymaps (disable with opts.keymaps = false)
|
|
212
|
+
if opts.keymaps ~= false then
|
|
213
|
+
local leader = opts.leader or "<leader>b"
|
|
214
|
+
|
|
215
|
+
vim.keymap.set("v", leader .. "e", ":<C-u>CjigEval<CR>", { silent = true, desc = "cjig: eval selection" })
|
|
216
|
+
vim.keymap.set("n", leader .. "f", "<cmd>CjigEvalForm<CR>", { silent = true, desc = "cjig: eval form" })
|
|
217
|
+
vim.keymap.set("n", leader .. "t", "<cmd>CjigTabs<CR>", { silent = true, desc = "cjig: list tabs" })
|
|
218
|
+
vim.keymap.set("n", leader .. "r", "<cmd>CjigReload<CR>", { silent = true, desc = "cjig: reload tab" })
|
|
219
|
+
vim.keymap.set("n", leader .. "c", "<cmd>CjigConnect<CR>", { silent = true, desc = "cjig: connect" })
|
|
220
|
+
vim.keymap.set("n", leader .. "d", "<cmd>CjigDisconnect<CR>", { silent = true, desc = "cjig: disconnect" })
|
|
221
|
+
end
|
|
224
222
|
end
|
|
225
223
|
|
|
226
224
|
return M
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chrome-jig",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Chrome debugging REPL with CDP, script injection, and Claude skill support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -8,6 +8,15 @@
|
|
|
8
8
|
"bin": {
|
|
9
9
|
"cjig": "./bin/cjig.js"
|
|
10
10
|
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsx src/cli.ts",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"test:watch": "vitest",
|
|
17
|
+
"lint": "eslint src --ext .ts",
|
|
18
|
+
"serve:examples": "pnpm exec serve examples -p 3333 -C"
|
|
19
|
+
},
|
|
11
20
|
"keywords": [
|
|
12
21
|
"chrome",
|
|
13
22
|
"devtools",
|
|
@@ -30,6 +39,7 @@
|
|
|
30
39
|
"typescript": "^5.9.3",
|
|
31
40
|
"vitest": "^4.0.18"
|
|
32
41
|
},
|
|
42
|
+
"packageManager": "pnpm@10.28.2",
|
|
33
43
|
"engines": {
|
|
34
44
|
"node": ">=18.0.0"
|
|
35
45
|
},
|
|
@@ -39,14 +49,5 @@
|
|
|
39
49
|
"editor",
|
|
40
50
|
"SKILL.md",
|
|
41
51
|
"README.md"
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
"build": "tsc",
|
|
45
|
-
"dev": "tsx src/cli.ts",
|
|
46
|
-
"typecheck": "tsc --noEmit",
|
|
47
|
-
"test": "vitest run",
|
|
48
|
-
"test:watch": "vitest",
|
|
49
|
-
"lint": "eslint src --ext .ts",
|
|
50
|
-
"serve:examples": "pnpm exec serve examples -p 3333 -C"
|
|
51
|
-
}
|
|
52
|
-
}
|
|
52
|
+
]
|
|
53
|
+
}
|