claude-code-extensions 0.1.0 → 0.1.2
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/ast.d.ts +43 -0
- package/dist/ast.js +308 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli-list.d.ts +5 -0
- package/dist/cli-list.js +33 -0
- package/dist/cli-list.js.map +1 -0
- package/dist/cli-reload.d.ts +7 -0
- package/dist/cli-reload.js +24 -0
- package/dist/cli-reload.js.map +1 -0
- package/dist/cli-setup.d.ts +14 -0
- package/dist/cli-setup.js +110 -0
- package/dist/cli-setup.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.js +183 -0
- package/dist/cli.js.map +1 -0
- package/dist/patch-worker.d.ts +6 -0
- package/dist/patch-worker.js +27 -0
- package/dist/patch-worker.js.map +1 -0
- package/dist/patches/always-show-context.d.ts +23 -0
- package/dist/patches/always-show-context.js +97 -0
- package/dist/patches/always-show-context.js.map +1 -0
- package/dist/patches/always-show-thinking.d.ts +18 -0
- package/dist/patches/always-show-thinking.js +55 -0
- package/dist/patches/always-show-thinking.js.map +1 -0
- package/dist/patches/banner.d.ts +10 -0
- package/dist/patches/banner.js +105 -0
- package/dist/patches/banner.js.map +1 -0
- package/dist/patches/cd-command.d.ts +16 -0
- package/dist/patches/cd-command.js +89 -0
- package/dist/patches/cd-command.js.map +1 -0
- package/dist/patches/cx-badge.d.ts +10 -0
- package/dist/patches/cx-badge.js +115 -0
- package/dist/patches/cx-badge.js.map +1 -0
- package/dist/patches/cx-resume-commands.d.ts +14 -0
- package/dist/patches/cx-resume-commands.js +53 -0
- package/dist/patches/cx-resume-commands.js.map +1 -0
- package/dist/patches/disable-paste-collapse.d.ts +16 -0
- package/dist/patches/disable-paste-collapse.js +49 -0
- package/dist/patches/disable-paste-collapse.js.map +1 -0
- package/dist/patches/disable-telemetry.d.ts +13 -0
- package/dist/patches/disable-telemetry.js +76 -0
- package/dist/patches/disable-telemetry.js.map +1 -0
- package/{patches/index.js → dist/patches/index.d.ts} +2 -0
- package/dist/patches/index.js +20 -0
- package/dist/patches/index.js.map +1 -0
- package/dist/patches/no-attribution.d.ts +15 -0
- package/dist/patches/no-attribution.js +42 -0
- package/dist/patches/no-attribution.js.map +1 -0
- package/dist/patches/no-feedback.d.ts +12 -0
- package/dist/patches/no-feedback.js +31 -0
- package/dist/patches/no-feedback.js.map +1 -0
- package/dist/patches/no-npm-warning.d.ts +9 -0
- package/dist/patches/no-npm-warning.js +31 -0
- package/dist/patches/no-npm-warning.js.map +1 -0
- package/dist/patches/no-tips.d.ts +10 -0
- package/dist/patches/no-tips.js +26 -0
- package/dist/patches/no-tips.js.map +1 -0
- package/dist/patches/persist-max-effort.d.ts +15 -0
- package/dist/patches/persist-max-effort.js +75 -0
- package/dist/patches/persist-max-effort.js.map +1 -0
- package/dist/patches/queue.d.ts +10 -0
- package/dist/patches/queue.js +202 -0
- package/dist/patches/queue.js.map +1 -0
- package/dist/patches/random-clawd.d.ts +9 -0
- package/dist/patches/random-clawd.js +49 -0
- package/dist/patches/random-clawd.js.map +1 -0
- package/dist/patches/reload.d.ts +10 -0
- package/dist/patches/reload.js +50 -0
- package/dist/patches/reload.js.map +1 -0
- package/dist/patches/show-file-in-collapsed-read.d.ts +17 -0
- package/dist/patches/show-file-in-collapsed-read.js +151 -0
- package/dist/patches/show-file-in-collapsed-read.js.map +1 -0
- package/dist/patches/simple-spinner.d.ts +12 -0
- package/dist/patches/simple-spinner.js +31 -0
- package/dist/patches/simple-spinner.js.map +1 -0
- package/dist/patches/swap-enter-submit.d.ts +26 -0
- package/dist/patches/swap-enter-submit.js +155 -0
- package/dist/patches/swap-enter-submit.js.map +1 -0
- package/dist/setup.d.ts +11 -0
- package/dist/setup.js +268 -0
- package/dist/setup.js.map +1 -0
- package/dist/transform-worker.d.ts +10 -0
- package/dist/transform-worker.js +35 -0
- package/dist/transform-worker.js.map +1 -0
- package/dist/transform.d.ts +12 -0
- package/dist/transform.js +83 -0
- package/dist/transform.js.map +1 -0
- package/dist/types.d.ts +105 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +19 -11
- package/ast.js +0 -276
- package/cx +0 -228
- package/cx-setup +0 -101
- package/patch-worker.js +0 -31
- package/patches/always-show-context.js +0 -123
- package/patches/always-show-thinking.js +0 -65
- package/patches/banner.js +0 -58
- package/patches/cd-command.js +0 -104
- package/patches/cx-badge.js +0 -112
- package/patches/cx-resume-commands.js +0 -58
- package/patches/disable-paste-collapse.js +0 -52
- package/patches/disable-telemetry.js +0 -84
- package/patches/no-attribution.js +0 -55
- package/patches/no-npm-warning.js +0 -32
- package/patches/no-tips.js +0 -29
- package/patches/persist-max-effort.js +0 -70
- package/patches/queue.js +0 -215
- package/patches/random-clawd.js +0 -52
- package/patches/reload.js +0 -68
- package/patches/show-file-in-collapsed-read.js +0 -178
- package/patches/swap-enter-submit.js +0 -188
- package/setup.js +0 -222
- package/transform-worker.js +0 -38
- package/transform.js +0 -99
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Show File Paths in Collapsed Read/Search Display
|
|
3
|
+
*
|
|
4
|
+
* Instead of just "Read 3 files", shows the actual file paths:
|
|
5
|
+
* Read 3 files (src/foo.ts, src/bar.ts, src/baz.ts)
|
|
6
|
+
* Instead of just "Searched for 1 pattern", shows:
|
|
7
|
+
* Searched for 1 pattern ("handleSubmit")
|
|
8
|
+
*
|
|
9
|
+
* Addresses: https://github.com/anthropics/claude-code/issues/21151 (184 thumbs up)
|
|
10
|
+
*
|
|
11
|
+
* The data is already there — readFilePaths and searchArgs are extracted
|
|
12
|
+
* from the message but only shown during active execution as a hint.
|
|
13
|
+
* This patch adds them to the completed collapsed display.
|
|
14
|
+
*/
|
|
15
|
+
const patch = {
|
|
16
|
+
id: 'show-file-in-collapsed-read',
|
|
17
|
+
name: 'Show File in Collapsed Read',
|
|
18
|
+
description: 'Show file paths and search patterns in collapsed tool display',
|
|
19
|
+
apply(ctx) {
|
|
20
|
+
const { ast, editor, find, index, assert, src, query } = ctx;
|
|
21
|
+
const { findFirst, findAll } = find;
|
|
22
|
+
// ─── Step 1: Find the collapsed display rendering function ───
|
|
23
|
+
// Identified by containing key:"read", key:"search", and key:"comma-r" literals.
|
|
24
|
+
// Use the indexed findFunctionsContainingStrings for O(matches) lookup.
|
|
25
|
+
const renderFns = query.findFunctionsContainingStrings(ast, 'comma-r', 'read', 'search');
|
|
26
|
+
const renderFn = renderFns[0];
|
|
27
|
+
assert(renderFn, 'Could not find collapsed display render function (markers: key:"read", key:"search", key:"comma-r")');
|
|
28
|
+
// ─── Step 2: Discover variable names ───
|
|
29
|
+
// Find the readFilePaths variable: pattern is X=q.readFilePaths
|
|
30
|
+
// Find the searchArgs variable: pattern is X=q.searchArgs
|
|
31
|
+
// Find the getDisplayPath function: pattern is X(Y):M where it's used near readFilePaths
|
|
32
|
+
// Find readFilePaths property access
|
|
33
|
+
const readFilePathsAccess = findFirst(renderFn, (n) => n.type === 'MemberExpression'
|
|
34
|
+
&& n.property.type === 'Identifier'
|
|
35
|
+
&& n.property.name === 'readFilePaths');
|
|
36
|
+
assert(readFilePathsAccess, 'Could not find q.readFilePaths access');
|
|
37
|
+
// The assignment: Q = q.readFilePaths — Q is the variable we need
|
|
38
|
+
const readPathsAssignment = findFirst(renderFn, (n) => n.type === 'VariableDeclarator'
|
|
39
|
+
&& n.init === readFilePathsAccess);
|
|
40
|
+
assert(readPathsAssignment, 'Could not find readFilePaths variable assignment');
|
|
41
|
+
const readPathsVar = readPathsAssignment.id.name;
|
|
42
|
+
// Find searchArgs variable similarly
|
|
43
|
+
const searchArgsAccess = findFirst(renderFn, (n) => n.type === 'MemberExpression'
|
|
44
|
+
&& n.property.type === 'Identifier'
|
|
45
|
+
&& n.property.name === 'searchArgs');
|
|
46
|
+
assert(searchArgsAccess, 'Could not find q.searchArgs access');
|
|
47
|
+
const searchArgsAssignment = findFirst(renderFn, (n) => n.type === 'VariableDeclarator'
|
|
48
|
+
&& n.init === searchArgsAccess);
|
|
49
|
+
assert(searchArgsAssignment, 'Could not find searchArgs variable assignment');
|
|
50
|
+
const searchArgsVar = searchArgsAssignment.id.name;
|
|
51
|
+
// Find getDisplayPath function name by looking for its call pattern:
|
|
52
|
+
// It's called like: F5(X6) right after readFilePaths is accessed,
|
|
53
|
+
// in the pattern: X!==void 0?F5(X):M
|
|
54
|
+
// The call is on a variable that came from Q?.at(-1)
|
|
55
|
+
const getDisplayPathCall = findFirst(renderFn, (n) => {
|
|
56
|
+
if (n.type !== 'ConditionalExpression')
|
|
57
|
+
return false;
|
|
58
|
+
// Look for: X!==void 0 ? CALL(X) : Y
|
|
59
|
+
// where CALL is a single-argument function call
|
|
60
|
+
if (n.consequent.type !== 'CallExpression')
|
|
61
|
+
return false;
|
|
62
|
+
if (n.consequent.arguments.length !== 1)
|
|
63
|
+
return false;
|
|
64
|
+
// The callee should be an Identifier (the getDisplayPath function)
|
|
65
|
+
if (n.consequent.callee.type !== 'Identifier')
|
|
66
|
+
return false;
|
|
67
|
+
// This should appear after readFilePaths is used
|
|
68
|
+
return n.start > readFilePathsAccess.start;
|
|
69
|
+
});
|
|
70
|
+
assert(getDisplayPathCall, 'Could not find getDisplayPath call pattern');
|
|
71
|
+
const displayPathFn = getDisplayPathCall.consequent.callee.name;
|
|
72
|
+
// ─── Step 3: Find the React library reference ───
|
|
73
|
+
// Look for createElement calls in the function — C4.default.createElement(...)
|
|
74
|
+
// Find the pattern: X.default.createElement(Y, {key:"read"}, ...)
|
|
75
|
+
const readElement = findFirst(renderFn, (n) => {
|
|
76
|
+
if (n.type !== 'CallExpression')
|
|
77
|
+
return false;
|
|
78
|
+
// Check for: X.default.createElement
|
|
79
|
+
const callee = n.callee;
|
|
80
|
+
if (callee.type !== 'MemberExpression')
|
|
81
|
+
return false;
|
|
82
|
+
if (callee.property.name !== 'createElement')
|
|
83
|
+
return false;
|
|
84
|
+
// Check args for key:"read"
|
|
85
|
+
return n.arguments.some((arg) => arg.type === 'ObjectExpression'
|
|
86
|
+
&& arg.properties?.some((p) => p.key?.name === 'key' && p.value?.value === 'read'));
|
|
87
|
+
});
|
|
88
|
+
assert(readElement, 'Could not find createElement with key:"read"');
|
|
89
|
+
// Extract the React reference (e.g., C4) from C4.default.createElement
|
|
90
|
+
const reactRef = src(readElement.callee.object.object);
|
|
91
|
+
// ─── Step 4: Find the Text component reference ───
|
|
92
|
+
// The readElement is: createElement(T, {key:"read"}, M6, " ", createElement(T, {bold:!0}, b), ...)
|
|
93
|
+
// The first argument (index 0) is the Text component reference.
|
|
94
|
+
const textComponent = src(readElement.arguments[0]);
|
|
95
|
+
// ─── Step 5: Find the "Searched for" element and inject search pattern ───
|
|
96
|
+
// Pattern: z6.push(createElement(T, {key:"search"}, M6, " ", createElement(T, {bold:true}, I), " ", I===1?"pattern":"patterns"))
|
|
97
|
+
// We want to add the search pattern text after "patterns")
|
|
98
|
+
const searchElement = findFirst(renderFn, (n) => {
|
|
99
|
+
if (n.type !== 'CallExpression')
|
|
100
|
+
return false;
|
|
101
|
+
if (n.callee.type !== 'MemberExpression')
|
|
102
|
+
return false;
|
|
103
|
+
if (n.callee.property.name !== 'createElement')
|
|
104
|
+
return false;
|
|
105
|
+
return n.arguments.some((arg) => arg.type === 'ObjectExpression'
|
|
106
|
+
&& arg.properties?.some((p) => p.key?.name === 'key' && p.value?.value === 'search'));
|
|
107
|
+
});
|
|
108
|
+
assert(searchElement, 'Could not find createElement with key:"search"');
|
|
109
|
+
// Find the push() call that contains this search element
|
|
110
|
+
const searchPush = findFirst(renderFn, (n) => n.type === 'CallExpression'
|
|
111
|
+
&& n.callee.type === 'MemberExpression'
|
|
112
|
+
&& n.callee.property.name === 'push'
|
|
113
|
+
&& n.arguments.length === 1
|
|
114
|
+
&& n.arguments[0] === searchElement);
|
|
115
|
+
assert(searchPush, 'Could not find push() call for search element');
|
|
116
|
+
// After the search push, inject a conditional that shows the search patterns
|
|
117
|
+
// Show: (pattern1, pattern2, ...)
|
|
118
|
+
const searchPathCode = `;if(${searchArgsVar}&&${searchArgsVar}.length>0){` +
|
|
119
|
+
`z6.push(${reactRef}.default.createElement(${textComponent},{key:"search-args",dimColor:!0},` +
|
|
120
|
+
`" (",${searchArgsVar}.map(function(p){return\'"\\'\\'"+p+\'"\\'\\'\'}).join(", "),")"))` +
|
|
121
|
+
`}`;
|
|
122
|
+
// Wait — the array variable name might not be z6. Let's find it.
|
|
123
|
+
// The push() callee object is the array variable.
|
|
124
|
+
const elemArrayVar = src(searchPush.callee.object);
|
|
125
|
+
const searchPathCodeFinal = `;if(${searchArgsVar}&&${searchArgsVar}.length>0){` +
|
|
126
|
+
`${elemArrayVar}.push(${reactRef}.default.createElement(${textComponent},{key:"search-args",dimColor:!0},` +
|
|
127
|
+
`" (",${searchArgsVar}.map(function(p){return '"'+p+'"'}).join(", "),")"))` +
|
|
128
|
+
`}`;
|
|
129
|
+
// Find the enclosing if-block for the search element by walking up the parent chain
|
|
130
|
+
const searchIfBlock = index.ancestor(searchElement, 'IfStatement');
|
|
131
|
+
assert(searchIfBlock, 'Could not find if block containing search element');
|
|
132
|
+
editor.insertAt(searchIfBlock.end, searchPathCodeFinal);
|
|
133
|
+
// ─── Step 6: Find the "Read" element and inject file paths ───
|
|
134
|
+
// After the if(b>0){...} block, inject file path display
|
|
135
|
+
const readIfBlock = index.ancestor(readElement, 'IfStatement');
|
|
136
|
+
assert(readIfBlock, 'Could not find if block containing read element');
|
|
137
|
+
// Inject after the read if-block:
|
|
138
|
+
// Show file paths: " (src/foo.ts, src/bar.ts)" for up to 3 files,
|
|
139
|
+
// or " (src/foo.ts… +2 more)" for >3 files
|
|
140
|
+
const readPathCode = `;if(${readPathsVar}&&${readPathsVar}.length>0){` +
|
|
141
|
+
`var __paths=${readPathsVar}.length<=3?` +
|
|
142
|
+
`${readPathsVar}.map(${displayPathFn}).join(", "):` +
|
|
143
|
+
`${displayPathFn}(${readPathsVar}[${readPathsVar}.length-1])+"… +"+(${readPathsVar}.length-1)+" more";` +
|
|
144
|
+
`${elemArrayVar}.push(${reactRef}.default.createElement(${textComponent},{key:"read-paths",dimColor:!0},` +
|
|
145
|
+
`" (",__paths,")"))` +
|
|
146
|
+
`}`;
|
|
147
|
+
editor.insertAt(readIfBlock.end, readPathCode);
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
export default patch;
|
|
151
|
+
//# sourceMappingURL=show-file-in-collapsed-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-file-in-collapsed-read.js","sourceRoot":"","sources":["../../src/patches/show-file-in-collapsed-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Spinner Patch
|
|
3
|
+
*
|
|
4
|
+
* Replaces the rotating spinner verbs ("Thinking", "Analyzing", etc.)
|
|
5
|
+
* with a single static "working" verb, and replaces the completion
|
|
6
|
+
* verbs ("Baked", "Brewed", etc.) with a single "worked" verb.
|
|
7
|
+
*
|
|
8
|
+
* The spinner animation (dots) is preserved — only the text is simplified.
|
|
9
|
+
*/
|
|
10
|
+
import type { Patch } from '../types.js';
|
|
11
|
+
declare const patch: Patch;
|
|
12
|
+
export default patch;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple Spinner Patch
|
|
3
|
+
*
|
|
4
|
+
* Replaces the rotating spinner verbs ("Thinking", "Analyzing", etc.)
|
|
5
|
+
* with a single static "working" verb, and replaces the completion
|
|
6
|
+
* verbs ("Baked", "Brewed", etc.) with a single "worked" verb.
|
|
7
|
+
*
|
|
8
|
+
* The spinner animation (dots) is preserved — only the text is simplified.
|
|
9
|
+
*/
|
|
10
|
+
const patch = {
|
|
11
|
+
id: 'simple-spinner',
|
|
12
|
+
name: 'Simple Spinner',
|
|
13
|
+
description: 'Replace spinner verb cycling with static "working" / "worked"',
|
|
14
|
+
defaultEnabled: false,
|
|
15
|
+
apply(ctx) {
|
|
16
|
+
const { ast, editor, query, assert } = ctx;
|
|
17
|
+
const { findArrayWithConsecutiveStrings } = query;
|
|
18
|
+
// ── Active spinner verbs ────────────────────────────────────────────
|
|
19
|
+
// SPINNER_VERBS is a large array starting with "Accomplishing", "Actioning", ...
|
|
20
|
+
const spinnerArr = findArrayWithConsecutiveStrings(ast, 'Accomplishing', 'Actioning');
|
|
21
|
+
assert(spinnerArr, 'Could not find SPINNER_VERBS array (looked for "Accomplishing","Actioning")');
|
|
22
|
+
editor.replaceRange(spinnerArr.start, spinnerArr.end, '["working"]');
|
|
23
|
+
// ── Completion verbs ────────────────────────────────────────────────
|
|
24
|
+
// TURN_COMPLETION_VERBS is a smaller array starting with "Baked", "Brewed", ...
|
|
25
|
+
const completionArr = findArrayWithConsecutiveStrings(ast, 'Baked', 'Brewed');
|
|
26
|
+
assert(completionArr, 'Could not find TURN_COMPLETION_VERBS array (looked for "Baked","Brewed")');
|
|
27
|
+
editor.replaceRange(completionArr.start, completionArr.end, '["worked"]');
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export default patch;
|
|
31
|
+
//# sourceMappingURL=simple-spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-spinner.js","sourceRoot":"","sources":["../../src/patches/simple-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,KAAK,GAAU;IACnB,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,+DAA+D;IAC5E,cAAc,EAAE,KAAK;IAErB,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC3C,MAAM,EAAE,+BAA+B,EAAE,GAAG,KAAK,CAAC;QAElD,uEAAuE;QACvE,iFAAiF;QACjF,MAAM,UAAU,GAAG,+BAA+B,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;QACtF,MAAM,CAAC,UAAU,EAAE,6EAA6E,CAAC,CAAC;QAClG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAErE,uEAAuE;QACvE,gFAAgF;QAChF,MAAM,aAAa,GAAG,+BAA+B,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9E,MAAM,CAAC,aAAa,EAAE,0EAA0E,CAAC,CAAC;QAClG,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC5E,CAAC;CACF,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swap Enter / Meta+Enter
|
|
3
|
+
*
|
|
4
|
+
* Makes Enter insert a newline and Meta+Enter (Option+Enter on macOS) submit.
|
|
5
|
+
*
|
|
6
|
+
* Addresses: https://github.com/anthropics/claude-code/issues/2054 (72 reactions)
|
|
7
|
+
*
|
|
8
|
+
* CJK users, SSH users, and anyone with Slack-style muscle memory constantly
|
|
9
|
+
* submit half-written prompts by accident. This patch swaps the default
|
|
10
|
+
* bindings so Enter is safe (newline) and Meta+Enter is deliberate (submit).
|
|
11
|
+
*
|
|
12
|
+
* Why keybinding changes alone aren't enough:
|
|
13
|
+
*
|
|
14
|
+
* The Enter key's submit behavior is hard-coded in useTextInput.ts's
|
|
15
|
+
* handleEnter() function — it directly calls onSubmit() for plain Enter
|
|
16
|
+
* and cursor.insert('\n') for Meta/Shift+Enter, bypassing the keybinding
|
|
17
|
+
* system entirely.
|
|
18
|
+
*
|
|
19
|
+
* This patch modifies THREE layers:
|
|
20
|
+
* 1. DEFAULT_BINDINGS — so shortcut hints and the help menu show correctly
|
|
21
|
+
* 2. handleEnter() — so the actual key behavior is swapped
|
|
22
|
+
* 3. Tip/help text — so instructions match the new behavior
|
|
23
|
+
*/
|
|
24
|
+
import type { Patch } from '../types.js';
|
|
25
|
+
declare const patch: Patch;
|
|
26
|
+
export default patch;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swap Enter / Meta+Enter
|
|
3
|
+
*
|
|
4
|
+
* Makes Enter insert a newline and Meta+Enter (Option+Enter on macOS) submit.
|
|
5
|
+
*
|
|
6
|
+
* Addresses: https://github.com/anthropics/claude-code/issues/2054 (72 reactions)
|
|
7
|
+
*
|
|
8
|
+
* CJK users, SSH users, and anyone with Slack-style muscle memory constantly
|
|
9
|
+
* submit half-written prompts by accident. This patch swaps the default
|
|
10
|
+
* bindings so Enter is safe (newline) and Meta+Enter is deliberate (submit).
|
|
11
|
+
*
|
|
12
|
+
* Why keybinding changes alone aren't enough:
|
|
13
|
+
*
|
|
14
|
+
* The Enter key's submit behavior is hard-coded in useTextInput.ts's
|
|
15
|
+
* handleEnter() function — it directly calls onSubmit() for plain Enter
|
|
16
|
+
* and cursor.insert('\n') for Meta/Shift+Enter, bypassing the keybinding
|
|
17
|
+
* system entirely.
|
|
18
|
+
*
|
|
19
|
+
* This patch modifies THREE layers:
|
|
20
|
+
* 1. DEFAULT_BINDINGS — so shortcut hints and the help menu show correctly
|
|
21
|
+
* 2. handleEnter() — so the actual key behavior is swapped
|
|
22
|
+
* 3. Tip/help text — so instructions match the new behavior
|
|
23
|
+
*/
|
|
24
|
+
const patch = {
|
|
25
|
+
id: 'swap-enter-submit',
|
|
26
|
+
name: 'Swap Enter / Meta+Enter',
|
|
27
|
+
description: 'Enter inserts newline, Option/Alt+Enter submits',
|
|
28
|
+
defaultEnabled: false,
|
|
29
|
+
apply(ctx) {
|
|
30
|
+
const { ast, editor, query, find, src, assert } = ctx;
|
|
31
|
+
const { findObjectWithStringProps } = query;
|
|
32
|
+
const { findFirst, findAll } = find;
|
|
33
|
+
// ── Patch 1: DEFAULT_BINDINGS ────────────────────────────────────
|
|
34
|
+
const obj = findObjectWithStringProps(ast, [
|
|
35
|
+
['enter', 'chat:submit'],
|
|
36
|
+
['up', 'history:previous'],
|
|
37
|
+
]);
|
|
38
|
+
assert(obj, 'Could not find DEFAULT_BINDINGS object');
|
|
39
|
+
const enterProp = obj.properties.find((p) => p.type === 'Property' &&
|
|
40
|
+
((p.key.type === 'Identifier' && p.key.name === 'enter') ||
|
|
41
|
+
(p.key.type === 'Literal' && p.key.value === 'enter')));
|
|
42
|
+
assert(enterProp, 'Could not find "enter" property in DEFAULT_BINDINGS');
|
|
43
|
+
assert(enterProp.value.type === 'Literal' && enterProp.value.value === 'chat:submit', 'enter property value is not "chat:submit"');
|
|
44
|
+
editor.replaceRange(enterProp.value.start, enterProp.value.end, '"chat:newline"');
|
|
45
|
+
editor.insertAt(enterProp.end, ',"meta+enter":"chat:submit"');
|
|
46
|
+
// ── Patch 2: handleEnter() in useTextInput ───────────────────────
|
|
47
|
+
//
|
|
48
|
+
// Original handleEnter:
|
|
49
|
+
// if (backslash) → backslash+newline (keep)
|
|
50
|
+
// if (key.meta || key.shift) → cursor.insert('\n')
|
|
51
|
+
// if (Apple_Terminal && shift) → cursor.insert('\n')
|
|
52
|
+
// onSubmit?.(originalValue)
|
|
53
|
+
//
|
|
54
|
+
// After patch:
|
|
55
|
+
// if (backslash) → backslash+newline (unchanged)
|
|
56
|
+
// if (key.meta) → onSubmit (Meta/Option+Enter submits)
|
|
57
|
+
// if (key.shift) → cursor.insert('\n') (Shift+Enter still inserts newline)
|
|
58
|
+
// (Apple_Terminal block removed — not needed; Meta works via Option key,
|
|
59
|
+
// and plain Enter newlines go through keybinding system)
|
|
60
|
+
// return cursor (plain Enter = no-op; keybinding system handles
|
|
61
|
+
// Enter → chat:newline → handleNewline in PromptInput)
|
|
62
|
+
// Find handleEnter by stable markers. Take the SMALLEST matching
|
|
63
|
+
// function (handleEnter is nested inside useTextInput).
|
|
64
|
+
const isHandleEnterCandidate = (node) => {
|
|
65
|
+
if (node.type !== 'FunctionDeclaration' && node.type !== 'FunctionExpression')
|
|
66
|
+
return false;
|
|
67
|
+
if (!findFirst(node, (n) => n.type === 'Literal' && n.value === 'Apple_Terminal'))
|
|
68
|
+
return false;
|
|
69
|
+
if (!findFirst(node, (n) => n.type === 'CallExpression' && n.callee.type === 'MemberExpression' &&
|
|
70
|
+
n.callee.property.name === 'backspace'))
|
|
71
|
+
return false;
|
|
72
|
+
return findFirst(node, (n) => n.type === 'LogicalExpression' && n.operator === '||' &&
|
|
73
|
+
n.left.type === 'MemberExpression' && n.left.property.name === 'meta' &&
|
|
74
|
+
n.right.type === 'MemberExpression' && n.right.property.name === 'shift') !== null;
|
|
75
|
+
};
|
|
76
|
+
const candidates = findAll(ast, isHandleEnterCandidate);
|
|
77
|
+
assert(candidates.length >= 1, 'Could not find handleEnter function');
|
|
78
|
+
candidates.sort((a, b) => (a.end - a.start) - (b.end - b.start));
|
|
79
|
+
const handleEnterFn = candidates[0];
|
|
80
|
+
// Discover minified variable names
|
|
81
|
+
// key variable: from key.meta || key.shift
|
|
82
|
+
const metaOrShift = findFirst(handleEnterFn, (n) => n.type === 'LogicalExpression' && n.operator === '||' &&
|
|
83
|
+
n.left.type === 'MemberExpression' && n.left.property.name === 'meta' &&
|
|
84
|
+
n.right.type === 'MemberExpression' && n.right.property.name === 'shift');
|
|
85
|
+
const keyVar = src(metaOrShift.left.object);
|
|
86
|
+
// if-statement that tests meta||shift
|
|
87
|
+
const metaShiftIf = findFirst(handleEnterFn, (n) => {
|
|
88
|
+
if (n.type !== 'IfStatement')
|
|
89
|
+
return false;
|
|
90
|
+
const t = n.test;
|
|
91
|
+
return t.type === 'LogicalExpression' && t.operator === '||' &&
|
|
92
|
+
t.left.type === 'MemberExpression' && t.left.property.name === 'meta' &&
|
|
93
|
+
t.right.type === 'MemberExpression' && t.right.property.name === 'shift';
|
|
94
|
+
});
|
|
95
|
+
assert(metaShiftIf, 'Could not find if-statement for meta||shift');
|
|
96
|
+
// cursor variable: from cursor.insert('\n') (where cursor is a plain Identifier)
|
|
97
|
+
const isNewlineArg = (n) => (n.type === 'Literal' && n.value === '\n') ||
|
|
98
|
+
(n.type === 'TemplateLiteral' && n.expressions.length === 0 &&
|
|
99
|
+
n.quasis.length === 1 && n.quasis[0].value.cooked === '\n');
|
|
100
|
+
const cursorInserts = findAll(handleEnterFn, (n) => n.type === 'CallExpression' &&
|
|
101
|
+
n.callee.type === 'MemberExpression' &&
|
|
102
|
+
n.callee.object.type === 'Identifier' &&
|
|
103
|
+
n.callee.property.name === 'insert' &&
|
|
104
|
+
n.arguments.length === 1 && isNewlineArg(n.arguments[0]));
|
|
105
|
+
assert(cursorInserts.length >= 1, 'Could not find cursor.insert("\\n") in handleEnter');
|
|
106
|
+
const cursorVar = cursorInserts[0].callee.object.name;
|
|
107
|
+
// onSubmit?.(originalValue): last statement in handleEnter body
|
|
108
|
+
const bodyStmts = handleEnterFn.body.body;
|
|
109
|
+
const lastStmt = bodyStmts[bodyStmts.length - 1];
|
|
110
|
+
assert(lastStmt.type === 'ExpressionStatement', 'Last statement of handleEnter is not an ExpressionStatement');
|
|
111
|
+
const onSubmitCallSrc = src(lastStmt.expression);
|
|
112
|
+
// Apple Terminal if-block
|
|
113
|
+
const appleTerminalIf = findFirst(handleEnterFn, (n) => {
|
|
114
|
+
if (n.type !== 'IfStatement')
|
|
115
|
+
return false;
|
|
116
|
+
return findFirst(n.test, (t) => t.type === 'Literal' && t.value === 'Apple_Terminal') !== null;
|
|
117
|
+
});
|
|
118
|
+
// ── Apply edits (editor applies in reverse position order) ───────
|
|
119
|
+
// 2d: Replace fallthrough onSubmit with return cursor (no-op).
|
|
120
|
+
editor.replaceRange(lastStmt.start, lastStmt.end, `return ${cursorVar}`);
|
|
121
|
+
// 2c: Remove Apple Terminal if-block — no longer needed.
|
|
122
|
+
// Meta/Option works natively in Apple Terminal (sends ESC+CR when
|
|
123
|
+
// "Use Option as Meta Key" is enabled via /terminal-setup).
|
|
124
|
+
// Plain Enter newlines go through the keybinding system.
|
|
125
|
+
if (appleTerminalIf) {
|
|
126
|
+
editor.replaceRange(appleTerminalIf.start, appleTerminalIf.end, '');
|
|
127
|
+
}
|
|
128
|
+
// 2b: Replace meta||shift block. Now: Meta+Enter (Option+Enter) → submit,
|
|
129
|
+
// Shift+Enter → newline (for CSI u terminals), plain Enter → no-op.
|
|
130
|
+
// Meta+Enter is the only reliable modifier+Enter across all terminals
|
|
131
|
+
// because it sends ESC+CR — a distinct sequence. Ctrl+Enter and
|
|
132
|
+
// Shift+Enter send the same byte as plain Enter in most terminals.
|
|
133
|
+
editor.replaceRange(metaShiftIf.start, metaShiftIf.end, `if(${keyVar}.meta){${onSubmitCallSrc};return}` +
|
|
134
|
+
`if(${keyVar}.shift)return ${cursorVar}.insert("\\n");`);
|
|
135
|
+
// ── Patch 3: Tip text ────────────────────────────────────────────
|
|
136
|
+
const shiftEnterTip = findFirst(ast, (n) => n.type === 'Literal' && n.value === 'Press Shift+Enter to send a multi-line message');
|
|
137
|
+
if (shiftEnterTip) {
|
|
138
|
+
editor.replaceRange(shiftEnterTip.start, shiftEnterTip.end, '"Press Option+Enter to submit your message"');
|
|
139
|
+
}
|
|
140
|
+
const optionEnterTip = findFirst(ast, (n) => n.type === 'Literal' && n.value === 'Press Option+Enter to send a multi-line message');
|
|
141
|
+
if (optionEnterTip) {
|
|
142
|
+
editor.replaceRange(optionEnterTip.start, optionEnterTip.end, '"Press Option+Enter to submit your message"');
|
|
143
|
+
}
|
|
144
|
+
// ── Patch 4: Help menu newline instructions ──────────────────────
|
|
145
|
+
for (const val of ['shift + ⏎ for newline', '\\⏎ for newline',
|
|
146
|
+
'backslash (\\) + return (⏎) for newline']) {
|
|
147
|
+
const nodes = findAll(ast, (n) => n.type === 'Literal' && n.value === val);
|
|
148
|
+
for (const node of nodes) {
|
|
149
|
+
editor.replaceRange(node.start, node.end, '"option + ⏎ to send"');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
export default patch;
|
|
155
|
+
//# sourceMappingURL=swap-enter-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap-enter-submit.js","sourceRoot":"","sources":["../../src/patches/swap-enter-submit.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive patch configurator.
|
|
3
|
+
* Toggle patches on/off with a keyboard-driven TUI.
|
|
4
|
+
*
|
|
5
|
+
* Called by `cx setup` — not meant to be run directly.
|
|
6
|
+
*/
|
|
7
|
+
export interface SetupOptions {
|
|
8
|
+
/** When true, show a welcome header and return instead of exiting. */
|
|
9
|
+
firstRun?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export default function setup(opts?: SetupOptions): Promise<void>;
|