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.
- package/README.md +12 -8
- package/dist/index.js +64 -15
- 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
|
-
|
|
144
|
-
|
|
145
|
-
**
|
|
146
|
-
**
|
|
147
|
-
**
|
|
148
|
-
**
|
|
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
|
-
### π¨
|
|
228
|
-
`/theme` to browse: cyberpunk-neon, dracula, gruvbox, nord, catppuccin, tokyo-night, one-dark,
|
|
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
|
|
1824
|
+
const content = pasteBuffer;
|
|
1767
1825
|
pasteBuffer = "";
|
|
1768
|
-
|
|
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
|
-
|
|
1833
|
+
rawBurstBuffer += data;
|
|
1834
|
+
scheduleRawBurstFlush();
|
|
1835
|
+
return true;
|
|
1787
1836
|
};
|
|
1788
1837
|
// Disable bracketed paste on exit
|
|
1789
1838
|
process.on("exit", () => {
|