claude-code-extensions 0.1.0 → 0.1.1

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.
Files changed (115) hide show
  1. package/dist/ast.d.ts +43 -0
  2. package/dist/ast.js +308 -0
  3. package/dist/ast.js.map +1 -0
  4. package/dist/cli-setup.d.ts +14 -0
  5. package/dist/cli-setup.js +110 -0
  6. package/dist/cli-setup.js.map +1 -0
  7. package/dist/cli.d.ts +18 -0
  8. package/dist/cli.js +218 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/patch-worker.d.ts +6 -0
  11. package/dist/patch-worker.js +27 -0
  12. package/dist/patch-worker.js.map +1 -0
  13. package/dist/patches/always-show-context.d.ts +23 -0
  14. package/dist/patches/always-show-context.js +97 -0
  15. package/dist/patches/always-show-context.js.map +1 -0
  16. package/dist/patches/always-show-thinking.d.ts +18 -0
  17. package/dist/patches/always-show-thinking.js +55 -0
  18. package/dist/patches/always-show-thinking.js.map +1 -0
  19. package/dist/patches/banner.d.ts +10 -0
  20. package/dist/patches/banner.js +60 -0
  21. package/dist/patches/banner.js.map +1 -0
  22. package/dist/patches/cd-command.d.ts +16 -0
  23. package/dist/patches/cd-command.js +89 -0
  24. package/dist/patches/cd-command.js.map +1 -0
  25. package/dist/patches/cx-badge.d.ts +10 -0
  26. package/dist/patches/cx-badge.js +115 -0
  27. package/dist/patches/cx-badge.js.map +1 -0
  28. package/dist/patches/cx-resume-commands.d.ts +14 -0
  29. package/dist/patches/cx-resume-commands.js +53 -0
  30. package/dist/patches/cx-resume-commands.js.map +1 -0
  31. package/dist/patches/disable-paste-collapse.d.ts +16 -0
  32. package/dist/patches/disable-paste-collapse.js +49 -0
  33. package/dist/patches/disable-paste-collapse.js.map +1 -0
  34. package/dist/patches/disable-telemetry.d.ts +13 -0
  35. package/dist/patches/disable-telemetry.js +76 -0
  36. package/dist/patches/disable-telemetry.js.map +1 -0
  37. package/{patches/index.js → dist/patches/index.d.ts} +4 -0
  38. package/dist/patches/index.js +22 -0
  39. package/dist/patches/index.js.map +1 -0
  40. package/dist/patches/no-attribution.d.ts +15 -0
  41. package/dist/patches/no-attribution.js +42 -0
  42. package/dist/patches/no-attribution.js.map +1 -0
  43. package/dist/patches/no-feedback.d.ts +12 -0
  44. package/dist/patches/no-feedback.js +31 -0
  45. package/dist/patches/no-feedback.js.map +1 -0
  46. package/dist/patches/no-npm-warning.d.ts +9 -0
  47. package/dist/patches/no-npm-warning.js +31 -0
  48. package/dist/patches/no-npm-warning.js.map +1 -0
  49. package/dist/patches/no-tips.d.ts +10 -0
  50. package/dist/patches/no-tips.js +26 -0
  51. package/dist/patches/no-tips.js.map +1 -0
  52. package/dist/patches/persist-max-effort.d.ts +15 -0
  53. package/dist/patches/persist-max-effort.js +75 -0
  54. package/dist/patches/persist-max-effort.js.map +1 -0
  55. package/dist/patches/queue.d.ts +10 -0
  56. package/dist/patches/queue.js +202 -0
  57. package/dist/patches/queue.js.map +1 -0
  58. package/dist/patches/random-clawd.d.ts +9 -0
  59. package/dist/patches/random-clawd.js +49 -0
  60. package/dist/patches/random-clawd.js.map +1 -0
  61. package/dist/patches/reload.d.ts +10 -0
  62. package/dist/patches/reload.js +50 -0
  63. package/dist/patches/reload.js.map +1 -0
  64. package/dist/patches/session-export.d.ts +16 -0
  65. package/dist/patches/session-export.js +93 -0
  66. package/dist/patches/session-export.js.map +1 -0
  67. package/dist/patches/session-timer.d.ts +18 -0
  68. package/dist/patches/session-timer.js +217 -0
  69. package/dist/patches/session-timer.js.map +1 -0
  70. package/dist/patches/show-file-in-collapsed-read.d.ts +17 -0
  71. package/dist/patches/show-file-in-collapsed-read.js +151 -0
  72. package/dist/patches/show-file-in-collapsed-read.js.map +1 -0
  73. package/dist/patches/simple-spinner.d.ts +12 -0
  74. package/dist/patches/simple-spinner.js +30 -0
  75. package/dist/patches/simple-spinner.js.map +1 -0
  76. package/dist/patches/swap-enter-submit.d.ts +26 -0
  77. package/dist/patches/swap-enter-submit.js +155 -0
  78. package/dist/patches/swap-enter-submit.js.map +1 -0
  79. package/dist/setup.d.ts +11 -0
  80. package/dist/setup.js +268 -0
  81. package/dist/setup.js.map +1 -0
  82. package/dist/transform-worker.d.ts +10 -0
  83. package/dist/transform-worker.js +35 -0
  84. package/dist/transform-worker.js.map +1 -0
  85. package/dist/transform.d.ts +12 -0
  86. package/dist/transform.js +83 -0
  87. package/dist/transform.js.map +1 -0
  88. package/dist/types.d.ts +105 -0
  89. package/dist/types.js +8 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +16 -11
  92. package/ast.js +0 -276
  93. package/cx +0 -228
  94. package/cx-setup +0 -101
  95. package/patch-worker.js +0 -31
  96. package/patches/always-show-context.js +0 -123
  97. package/patches/always-show-thinking.js +0 -65
  98. package/patches/banner.js +0 -58
  99. package/patches/cd-command.js +0 -104
  100. package/patches/cx-badge.js +0 -112
  101. package/patches/cx-resume-commands.js +0 -58
  102. package/patches/disable-paste-collapse.js +0 -52
  103. package/patches/disable-telemetry.js +0 -84
  104. package/patches/no-attribution.js +0 -55
  105. package/patches/no-npm-warning.js +0 -32
  106. package/patches/no-tips.js +0 -29
  107. package/patches/persist-max-effort.js +0 -70
  108. package/patches/queue.js +0 -215
  109. package/patches/random-clawd.js +0 -52
  110. package/patches/reload.js +0 -68
  111. package/patches/show-file-in-collapsed-read.js +0 -178
  112. package/patches/swap-enter-submit.js +0 -188
  113. package/setup.js +0 -222
  114. package/transform-worker.js +0 -38
  115. package/transform.js +0 -99
@@ -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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"}
@@ -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>;
package/dist/setup.js ADDED
@@ -0,0 +1,268 @@
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
+ import { readFileSync, writeFileSync, existsSync, rmSync } from 'fs';
8
+ import { resolve, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ import { listPatches } from './transform.js';
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const CONFIG_PATH = resolve(__dirname, '..', '.cx-patches.json');
13
+ // ── Config persistence ────────────────────────────────────────────────────
14
+ function loadConfig() {
15
+ if (!existsSync(CONFIG_PATH))
16
+ return { patches: {} };
17
+ try {
18
+ return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
19
+ }
20
+ catch {
21
+ return { patches: {} };
22
+ }
23
+ }
24
+ function saveConfig(patches) {
25
+ writeFileSync(CONFIG_PATH, JSON.stringify({ patches }, null, 2) + '\n');
26
+ }
27
+ const groups = [
28
+ { label: 'Display', ids: [
29
+ 'always-show-thinking', 'disable-paste-collapse',
30
+ 'show-file-in-collapsed-read', 'cx-badge',
31
+ 'cx-resume-commands', 'random-clawd', 'session-timer',
32
+ ] },
33
+ { label: 'Input', ids: [
34
+ 'queue', 'swap-enter-submit', 'reload',
35
+ ] },
36
+ { label: 'Spinner', ids: [
37
+ 'no-tips', 'simple-spinner',
38
+ ] },
39
+ { label: 'Behavior', ids: [
40
+ 'persist-max-effort', 'no-npm-warning', 'no-feedback', 'session-export',
41
+ ] },
42
+ ];
43
+ // ── State ─────────────────────────────────────────────────────────────────
44
+ const patchMap = new Map(listPatches().map(p => [p.id, p]));
45
+ // Patches that are always on and should not appear in the setup TUI
46
+ const hidden = new Set(['banner']);
47
+ // Build ordered list from groups, append any ungrouped patches at the end
48
+ const groupedIds = new Set(groups.flatMap(g => g.ids));
49
+ const ungrouped = listPatches().filter(p => !groupedIds.has(p.id) && !hidden.has(p.id));
50
+ if (ungrouped.length)
51
+ groups.push({ label: 'Other', ids: ungrouped.map(p => p.id) });
52
+ const allPatchList = groups.flatMap(g => g.ids.map(id => patchMap.get(id)).filter((p) => !!p));
53
+ // sectionStarts[i] = label if patch i starts a new section
54
+ const sectionStarts = {};
55
+ let idx = 0;
56
+ for (const g of groups) {
57
+ const valid = g.ids.filter(id => patchMap.has(id));
58
+ if (valid.length) {
59
+ sectionStarts[idx] = g.label;
60
+ idx += valid.length;
61
+ }
62
+ }
63
+ const config = loadConfig();
64
+ const states = allPatchList.map(p => config.patches?.[p.id] !== undefined ? config.patches[p.id] : (p.defaultEnabled !== false));
65
+ let cursor = 0;
66
+ let dirty = false;
67
+ let resetPending = false;
68
+ let firstRunMode = false;
69
+ // ── Rendering ─────────────────────────────────────────────────────────────
70
+ const ESC = '\x1b';
71
+ const CLEAR = `${ESC}[2J${ESC}[H`;
72
+ const HIDE_CURSOR = `${ESC}[?25l`;
73
+ const SHOW_CURSOR = `${ESC}[?25h`;
74
+ const BOLD = `${ESC}[1m`;
75
+ const DIM = `${ESC}[2m`;
76
+ const RESET = `${ESC}[0m`;
77
+ const GREEN = `${ESC}[32m`;
78
+ const YELLOW = `${ESC}[33m`;
79
+ const CYAN = `${ESC}[36m`;
80
+ const WHITE = `${ESC}[37m`;
81
+ const BG_HIGHLIGHT = `${ESC}[48;5;236m`;
82
+ const maxId = Math.max(...allPatchList.map(p => p.id.length));
83
+ function render() {
84
+ const rows = process.stdout.rows || 24;
85
+ const lines = [];
86
+ const patchLineIndex = [];
87
+ // Header
88
+ lines.push('');
89
+ if (firstRunMode) {
90
+ lines.push(` ${BOLD}${CYAN}Welcome to cx${RESET} ${DIM}— Claude Code Extensions${RESET}`);
91
+ lines.push(` ${DIM}These patches will be applied to Claude Code at runtime.${RESET}`);
92
+ lines.push(` ${DIM}Press Enter to proceed with defaults, or toggle patches with Space.${RESET}`);
93
+ lines.push(` ${DIM}You can always change this later by running ${RESET}${BOLD}cx setup${RESET}${DIM}.${RESET}`);
94
+ }
95
+ else {
96
+ lines.push(` ${BOLD}${CYAN}cx setup${RESET} ${DIM}— toggle patches on/off${RESET}`);
97
+ }
98
+ // Patch list with section headers
99
+ for (let i = 0; i < allPatchList.length; i++) {
100
+ if (sectionStarts[i]) {
101
+ lines.push('');
102
+ lines.push(` ${DIM}${sectionStarts[i]}${RESET}`);
103
+ }
104
+ const p = allPatchList[i];
105
+ const on = states[i];
106
+ const sel = i === cursor;
107
+ const bg = sel ? BG_HIGHLIGHT : '';
108
+ const pointer = sel ? `${bg}${WHITE}> ` : `${bg} `;
109
+ const checkbox = on ? `${GREEN}✔${RESET}${bg}` : `${DIM}○${RESET}${bg}`;
110
+ const name = sel ? `${BOLD}${WHITE}${p.id}${RESET}${bg}` : p.id;
111
+ const pad = ' '.repeat(maxId - p.id.length + 2);
112
+ const desc = `${DIM}${p.description}${RESET}`;
113
+ patchLineIndex[i] = lines.length;
114
+ lines.push(`${pointer}${checkbox} ${name}${pad}${desc}${RESET}`);
115
+ }
116
+ // Footer
117
+ lines.push('');
118
+ if (resetPending) {
119
+ lines.push(` ${YELLOW}Press r again to reset all patches to defaults${RESET}`);
120
+ }
121
+ else {
122
+ let footer = ` ${DIM}↑↓${RESET} navigate ${DIM}space${RESET} toggle ${DIM}r${RESET} reset ${DIM}enter${RESET} save ${DIM}esc${RESET} cancel`;
123
+ if (dirty) {
124
+ footer += ` ${YELLOW}● unsaved${RESET}`;
125
+ }
126
+ lines.push(footer);
127
+ }
128
+ const prefix = CLEAR + HIDE_CURSOR;
129
+ // Everything fits — render as-is
130
+ if (lines.length <= rows) {
131
+ process.stdout.write(prefix + lines.join('\n') + '\n');
132
+ return;
133
+ }
134
+ // Scrolling — reserve 2 lines for indicators
135
+ const usable = Math.max(1, rows - 2);
136
+ const target = patchLineIndex[cursor];
137
+ let scrollTop = Math.max(0, target - Math.floor(usable / 2));
138
+ scrollTop = Math.min(scrollTop, lines.length - usable);
139
+ const visible = lines.slice(scrollTop, scrollTop + usable);
140
+ const top = scrollTop > 0 ? ` ${DIM}↑ more${RESET}` : '';
141
+ const bottom = scrollTop + usable < lines.length ? ` ${DIM}↓ more${RESET}` : '';
142
+ process.stdout.write(prefix + top + '\n' + visible.join('\n') + '\n' + bottom + '\n');
143
+ }
144
+ // ── Input handling ────────────────────────────────────────────────────────
145
+ function cleanup() {
146
+ process.stdout.write(SHOW_CURSOR + CLEAR);
147
+ process.stdout.removeListener('resize', render);
148
+ process.stdin.setRawMode(false);
149
+ process.stdin.pause();
150
+ }
151
+ export default function setup(opts) {
152
+ const isFirstRun = opts?.firstRun ?? false;
153
+ firstRunMode = isFirstRun;
154
+ if (!process.stdin.isTTY) {
155
+ console.error('cx setup requires an interactive terminal.');
156
+ process.exit(1);
157
+ }
158
+ return new Promise((resolveSetup) => {
159
+ process.stdin.setRawMode(true);
160
+ process.stdin.resume();
161
+ process.stdin.setEncoding('utf8');
162
+ process.stdout.on('resize', render);
163
+ render();
164
+ const onKey = (key) => {
165
+ // Ctrl+C
166
+ if (key === '\x03') {
167
+ cleanup();
168
+ if (isFirstRun) {
169
+ // Save defaults and continue
170
+ const patches = {};
171
+ for (let i = 0; i < allPatchList.length; i++) {
172
+ patches[allPatchList[i].id] = states[i];
173
+ }
174
+ saveConfig(patches);
175
+ done();
176
+ return;
177
+ }
178
+ process.exit(0);
179
+ }
180
+ // ESC
181
+ if (key === '\x1b' || key === 'q') {
182
+ cleanup();
183
+ if (isFirstRun) {
184
+ // Save defaults and continue
185
+ const patches = {};
186
+ for (let i = 0; i < allPatchList.length; i++) {
187
+ patches[allPatchList[i].id] = states[i];
188
+ }
189
+ saveConfig(patches);
190
+ console.log(` ${DIM}Using default patches.${RESET}\n`);
191
+ done();
192
+ return;
193
+ }
194
+ console.log(' Cancelled — no changes saved.\n');
195
+ process.exit(0);
196
+ }
197
+ // Reset to defaults (two-press confirmation)
198
+ if (key === 'r') {
199
+ if (resetPending) {
200
+ // Second press — perform the reset
201
+ for (let i = 0; i < allPatchList.length; i++) {
202
+ states[i] = allPatchList[i].defaultEnabled !== false;
203
+ }
204
+ dirty = true;
205
+ resetPending = false;
206
+ }
207
+ else {
208
+ // First press — enter pending state
209
+ resetPending = true;
210
+ }
211
+ render();
212
+ return;
213
+ }
214
+ // Any other key cancels a pending reset
215
+ if (resetPending) {
216
+ resetPending = false;
217
+ }
218
+ // Arrow up / k
219
+ if (key === '\x1b[A' || key === 'k') {
220
+ cursor = Math.max(0, cursor - 1);
221
+ }
222
+ // Arrow down / j
223
+ if (key === '\x1b[B' || key === 'j') {
224
+ cursor = Math.min(allPatchList.length - 1, cursor + 1);
225
+ }
226
+ // Space — toggle
227
+ if (key === ' ') {
228
+ states[cursor] = !states[cursor];
229
+ dirty = true;
230
+ }
231
+ // Enter — save and exit
232
+ if (key === '\r' || key === '\n') {
233
+ const patches = {};
234
+ for (let i = 0; i < allPatchList.length; i++) {
235
+ patches[allPatchList[i].id] = states[i];
236
+ }
237
+ saveConfig(patches);
238
+ cleanup();
239
+ // Delete cache so next run re-transforms
240
+ try {
241
+ rmSync(resolve(__dirname, '..', '.cache'), { recursive: true, force: true });
242
+ }
243
+ catch { /* ok */ }
244
+ console.log(` ${GREEN}✔${RESET} Config saved to .cx-patches.json\n`);
245
+ const enabled = allPatchList.filter((_, i) => states[i]).map(p => p.id);
246
+ const disabled = allPatchList.filter((_, i) => !states[i]).map(p => p.id);
247
+ if (enabled.length)
248
+ console.log(` ${GREEN}enabled${RESET} ${enabled.join(', ')}`);
249
+ if (disabled.length)
250
+ console.log(` ${DIM}disabled${RESET} ${disabled.join(', ')}`);
251
+ if (isFirstRun) {
252
+ console.log('');
253
+ done();
254
+ return;
255
+ }
256
+ console.log(`\n Run ${BOLD}cx${RESET} to start with these patches.\n`);
257
+ process.exit(0);
258
+ }
259
+ render();
260
+ };
261
+ process.stdin.on('data', onKey);
262
+ function done() {
263
+ process.stdin.removeListener('data', onKey);
264
+ resolveSetup();
265
+ }
266
+ });
267
+ }
268
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Single worker that does all heavy work: parse, index, apply patches.
3
+ * Sends progress messages so the main thread can update the UI.
4
+ *
5
+ * Receives: { source, patchIds, patchesDir }
6
+ * Sends: { type: 'ready' } — parse + index done
7
+ * { type: 'done', id } — one patch applied
8
+ * { type: 'complete', patched } — final result
9
+ */
10
+ export {};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Single worker that does all heavy work: parse, index, apply patches.
3
+ * Sends progress messages so the main thread can update the UI.
4
+ *
5
+ * Receives: { source, patchIds, patchesDir }
6
+ * Sends: { type: 'ready' } — parse + index done
7
+ * { type: 'done', id } — one patch applied
8
+ * { type: 'complete', patched } — final result
9
+ */
10
+ import { workerData, parentPort } from 'worker_threads';
11
+ import * as acorn from 'acorn';
12
+ import { ASTIndex, SourceEditor, buildContext } from './ast.js';
13
+ const { source, patchIds, patchesDir } = workerData;
14
+ try {
15
+ const ast = acorn.parse(source, { ecmaVersion: 'latest', sourceType: 'module', allowHashBang: true });
16
+ const index = new ASTIndex(ast);
17
+ parentPort.postMessage({ type: 'ready' });
18
+ const editor = new SourceEditor();
19
+ const ctx = buildContext(source, index, editor);
20
+ for (const id of patchIds) {
21
+ const mod = await import(`${patchesDir}/${id}.js`);
22
+ try {
23
+ mod.default.apply(ctx);
24
+ }
25
+ catch (err) {
26
+ throw new Error(`Patch "${id}" failed: ${err.message}`);
27
+ }
28
+ parentPort.postMessage({ type: 'done', id });
29
+ }
30
+ parentPort.postMessage({ type: 'complete', patched: editor.apply(source) });
31
+ }
32
+ catch (err) {
33
+ parentPort.postMessage({ type: 'error', error: err.message });
34
+ }
35
+ //# sourceMappingURL=transform-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-worker.js","sourceRoot":"","sources":["../src/transform-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGhE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAwB,CAAC;AAElE,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAuB,CAAC;IAC5H,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAEhD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,UAAU,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC;YACF,GAAG,CAAC,OAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,aAAc,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * AST transform framework for @anthropic-ai/claude-code
3
+ *
4
+ * Parses the minified bundle with acorn and applies modular patches
5
+ * from the patches/ directory. Each patch receives a context object
6
+ * with the AST, source, editor, and query helpers.
7
+ */
8
+ import type { PatchInfo, TransformCallbacks } from './types.js';
9
+ export declare function transform(source: string, only?: string[] | null, exclude?: string[] | null, callbacks?: TransformCallbacks): string;
10
+ export declare function transformAsync(source: string, patchIds: string[], callbacks?: TransformCallbacks): Promise<string>;
11
+ /** List all available patches. */
12
+ export declare function listPatches(): PatchInfo[];
@@ -0,0 +1,83 @@
1
+ /**
2
+ * AST transform framework for @anthropic-ai/claude-code
3
+ *
4
+ * Parses the minified bundle with acorn and applies modular patches
5
+ * from the patches/ directory. Each patch receives a context object
6
+ * with the AST, source, editor, and query helpers.
7
+ */
8
+ import * as acorn from 'acorn';
9
+ import { Worker } from 'worker_threads';
10
+ import { dirname, resolve } from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ import { ASTIndex, SourceEditor, buildContext } from './ast.js';
13
+ import * as allPatches from './patches/index.js';
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ // ═══════════════════════════════════════════════════════════════════════════
16
+ // Patch resolution
17
+ // ═══════════════════════════════════════════════════════════════════════════
18
+ function resolvePatches(only, exclude) {
19
+ const available = Object.values(allPatches);
20
+ if (only) {
21
+ return only.map(id => {
22
+ const p = available.find(p => p.id === id);
23
+ if (!p)
24
+ throw new Error(`Unknown patch: "${id}". Available: ${available.map(p => p.id).join(', ')}`);
25
+ return p;
26
+ });
27
+ }
28
+ return available.filter(p => !exclude?.includes(p.id));
29
+ }
30
+ // ═══════════════════════════════════════════════════════════════════════════
31
+ // Transform (sequential)
32
+ // ═══════════════════════════════════════════════════════════════════════════
33
+ export function transform(source, only = null, exclude = null, callbacks = {}) {
34
+ const ast = acorn.parse(source, { ecmaVersion: 'latest', sourceType: 'module', allowHashBang: true });
35
+ const index = new ASTIndex(ast);
36
+ const editor = new SourceEditor();
37
+ const ctx = buildContext(source, index, editor);
38
+ const toApply = resolvePatches(only, exclude);
39
+ callbacks.onReady?.();
40
+ for (const patch of toApply) {
41
+ try {
42
+ patch.apply(ctx);
43
+ }
44
+ catch (err) {
45
+ throw new Error(`Patch "${patch.id}" failed: ${err.message}`);
46
+ }
47
+ callbacks.onDone?.(patch.id);
48
+ }
49
+ return editor.apply(source);
50
+ }
51
+ // ═══════════════════════════════════════════════════════════════════════════
52
+ // Transform (async — single worker thread for non-blocking UI)
53
+ // ═══════════════════════════════════════════════════════════════════════════
54
+ export function transformAsync(source, patchIds, callbacks = {}) {
55
+ const workerPath = resolve(__dirname, 'transform-worker.js');
56
+ const patchesDir = resolve(__dirname, 'patches');
57
+ return new Promise((res, rej) => {
58
+ const worker = new Worker(workerPath, {
59
+ workerData: { source, patchIds, patchesDir },
60
+ });
61
+ worker.on('message', (msg) => {
62
+ if (msg.type === 'ready')
63
+ callbacks.onReady?.();
64
+ else if (msg.type === 'done')
65
+ callbacks.onDone?.(msg.id);
66
+ else if (msg.type === 'complete')
67
+ res(msg.patched);
68
+ else if (msg.type === 'error')
69
+ rej(new Error(msg.error));
70
+ });
71
+ worker.on('error', rej);
72
+ });
73
+ }
74
+ /** List all available patches. */
75
+ export function listPatches() {
76
+ return Object.values(allPatches).map(p => ({
77
+ id: p.id,
78
+ name: p.name,
79
+ description: p.description,
80
+ defaultEnabled: p.defaultEnabled,
81
+ }));
82
+ }
83
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}