codemaxxing 1.0.1 β†’ 1.0.3

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 (3) hide show
  1. package/README.md +12 -8
  2. package/dist/index.js +64 -15
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -140,12 +140,14 @@ Dual-model planning. A "planner" model reasons through the approach, then your e
140
140
  ### 🧠 Skills System (21 Built-In)
141
141
  Downloadable skill packs that teach the agent domain expertise. Ships with 21 built-in skills:
142
142
 
143
- **Frontend:** react-expert, nextjs-app, tailwind-ui, svelte-kit
144
- **Mobile:** react-native, swift-ios, flutter
145
- **Backend:** python-pro, node-backend, go-backend, rust-systems
146
- **Data:** sql-master, supabase
147
- **Practices:** typescript-strict, api-designer, test-engineer, doc-writer, security-audit, devops-toolkit, git-workflow
148
- **Game Dev:** unity-csharp
143
+ | Category | Skills |
144
+ |----------|--------|
145
+ | **Frontend** | react-expert, nextjs-app, tailwind-ui, svelte-kit |
146
+ | **Mobile** | react-native, swift-ios, flutter |
147
+ | **Backend** | python-pro, node-backend, go-backend, rust-systems |
148
+ | **Data** | sql-master, supabase |
149
+ | **Practices** | typescript-strict, api-designer, test-engineer, doc-writer, security-audit, devops-toolkit, git-workflow |
150
+ | **Game Dev** | unity-csharp |
149
151
 
150
152
  ```
151
153
  /skills # Browse & install from registry
@@ -224,8 +226,8 @@ Switch models mid-session with an interactive picker:
224
226
  - `/model gpt-5` β€” switch directly by name
225
227
  - Native Anthropic API support (not just OpenAI-compatible)
226
228
 
227
- ### 🎨 14 Themes
228
- `/theme` to browse: cyberpunk-neon, dracula, gruvbox, nord, catppuccin, tokyo-night, one-dark, rosΓ©-pine, synthwave, blood-moon, mono, solarized, hacker, acid
229
+ ### 🎨 15 Themes
230
+ `/theme` to browse: cyberpunk-neon, dracula, gruvbox, nord, catppuccin, tokyo-night, one-dark, rose-pine, synthwave, blood-moon, mono, solarized, hacker, hot-dog, acid
229
231
 
230
232
  ### πŸ” Authentication
231
233
  One command to connect any LLM provider. OpenRouter OAuth, Anthropic subscription linking, Codex/Qwen CLI import, GitHub Copilot device flow, or manual API keys.
@@ -330,6 +332,7 @@ Built-in tools:
330
332
 
331
333
  - **read_file** β€” Read file contents (safe)
332
334
  - **write_file** β€” Write/create files (requires approval, shows diff)
335
+ - **edit_file** β€” Apply surgical patches to files (preferred for targeted changes)
333
336
  - **list_files** β€” List directory contents (safe)
334
337
  - **search_files** β€” Search for patterns across files (safe)
335
338
  - **run_command** β€” Execute shell commands (requires approval)
@@ -348,6 +351,7 @@ Drop a `CODEMAXXING.md` file in your project root to give the model extra contex
348
351
  - **MCP:** [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk)
349
352
  - **Sessions:** [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)
350
353
  - **Local LLM:** Ollama integration (auto-install, pull, manage)
354
+ - **Tests:** Vitest β€” 26 tests across 8 test files covering commands, tools, config, and agent behavior
351
355
  - **Zero cloud dependencies** β€” everything runs locally
352
356
 
353
357
  ## Inspired By
package/dist/index.js CHANGED
@@ -1748,13 +1748,71 @@ process.stdout.write("\x1b[?2004h");
1748
1748
  // Bracketed paste: \x1b[200~ ... \x1b[201~
1749
1749
  let pasteBuffer = "";
1750
1750
  let inPaste = false;
1751
+ let rawBurstBuffer = "";
1752
+ let rawBurstTimer = null;
1753
+ const RAW_PASTE_WINDOW_MS = 35;
1754
+ function emitPasteChunk(content) {
1755
+ const normalized = content.replace(/\r\n/g, "\n").trim();
1756
+ if (!normalized)
1757
+ return true;
1758
+ const lineCount = normalized.split("\n").length;
1759
+ if (lineCount > 2) {
1760
+ pasteEvents.emit("paste", { content: normalized, lines: lineCount });
1761
+ return true;
1762
+ }
1763
+ const sanitized = normalized.replace(/\n/g, " ");
1764
+ if (sanitized) {
1765
+ origPush(sanitized, "utf-8");
1766
+ }
1767
+ return true;
1768
+ }
1769
+ function looksLikeRawMultilinePaste(data) {
1770
+ const normalized = data.replace(/\x1b\[20[01]~/g, "");
1771
+ const newlineMatches = normalized.match(/\r?\n/g) ?? [];
1772
+ const newlineCount = newlineMatches.length;
1773
+ const contentLength = normalized.replace(/[\r\n]/g, "").trim().length;
1774
+ // Catch real multiline pastes while avoiding normal Enter presses.
1775
+ return newlineCount >= 2 || (newlineCount >= 1 && contentLength >= 40);
1776
+ }
1777
+ function flushRawBurstBuffer() {
1778
+ if (!rawBurstBuffer)
1779
+ return;
1780
+ const buffered = rawBurstBuffer;
1781
+ rawBurstBuffer = "";
1782
+ if (looksLikeRawMultilinePaste(buffered)) {
1783
+ emitPasteChunk(buffered);
1784
+ return;
1785
+ }
1786
+ origPush(Buffer.from(buffered), undefined);
1787
+ }
1788
+ function scheduleRawBurstFlush() {
1789
+ if (rawBurstTimer)
1790
+ clearTimeout(rawBurstTimer);
1791
+ rawBurstTimer = setTimeout(() => {
1792
+ rawBurstTimer = null;
1793
+ flushRawBurstBuffer();
1794
+ }, RAW_PASTE_WINDOW_MS);
1795
+ }
1751
1796
  const origPush = process.stdin.push.bind(process.stdin);
1752
1797
  process.stdin.push = function (chunk, encoding) {
1753
- if (chunk === null)
1798
+ if (chunk === null) {
1799
+ if (rawBurstTimer) {
1800
+ clearTimeout(rawBurstTimer);
1801
+ rawBurstTimer = null;
1802
+ }
1803
+ flushRawBurstBuffer();
1754
1804
  return origPush(chunk, encoding);
1805
+ }
1755
1806
  let data = typeof chunk === "string" ? chunk : Buffer.isBuffer(chunk) ? chunk.toString("utf-8") : String(chunk);
1756
1807
  const hasStart = data.includes("\x1b[200~");
1757
1808
  const hasEnd = data.includes("\x1b[201~");
1809
+ if (hasStart || hasEnd || inPaste) {
1810
+ if (rawBurstTimer) {
1811
+ clearTimeout(rawBurstTimer);
1812
+ rawBurstTimer = null;
1813
+ }
1814
+ flushRawBurstBuffer();
1815
+ }
1758
1816
  if (hasStart) {
1759
1817
  inPaste = true;
1760
1818
  data = data.replace(/\x1b\[200~/g, "");
@@ -1763,27 +1821,18 @@ process.stdin.push = function (chunk, encoding) {
1763
1821
  data = data.replace(/\x1b\[201~/g, "");
1764
1822
  pasteBuffer += data;
1765
1823
  inPaste = false;
1766
- const content = pasteBuffer.trim();
1824
+ const content = pasteBuffer;
1767
1825
  pasteBuffer = "";
1768
- const lineCount = content.split("\n").length;
1769
- if (lineCount > 2) {
1770
- // Multi-line paste β†’ store as chunk, don't send to input
1771
- pasteEvents.emit("paste", { content, lines: lineCount });
1772
- return true;
1773
- }
1774
- // Short paste (1-2 lines) β€” send as normal input
1775
- const sanitized = content.replace(/\r?\n/g, " ");
1776
- if (sanitized) {
1777
- return origPush(sanitized, "utf-8");
1778
- }
1779
- return true;
1826
+ return emitPasteChunk(content);
1780
1827
  }
1781
1828
  if (inPaste) {
1782
1829
  pasteBuffer += data;
1783
1830
  return true;
1784
1831
  }
1785
1832
  data = data.replace(/\x1b\[20[01]~/g, "");
1786
- return origPush(typeof chunk === "string" ? data : Buffer.from(data), encoding);
1833
+ rawBurstBuffer += data;
1834
+ scheduleRawBurstFlush();
1835
+ return true;
1787
1836
  };
1788
1837
  // Disable bracketed paste on exit
1789
1838
  process.on("exit", () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codemaxxing",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Open-source terminal coding agent. Connect any LLM. Max your code.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {