ironcode-ai 1.20.7 → 1.20.9
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 +97 -1
- package/package.json +6 -6
- package/postinstall.mjs +22 -16
package/README.md
CHANGED
|
@@ -39,6 +39,7 @@ IronCode is a **high-performance CLI AI coding agent** — a fork of [OpenCode](
|
|
|
39
39
|
- 📝 **External Editor** — Opens `$EDITOR`/nvim with auto-install if missing
|
|
40
40
|
- 🧩 **Built-in Skills** — 13 opinionated slash commands: plan review, code review, QA (web + API), ship, retro, and more
|
|
41
41
|
- 🛡️ **Security** — Prompt injection detection blocks malicious websites from manipulating the AI
|
|
42
|
+
- 🔄 **Auto-Compact on Overflow** — When context limit is hit, automatically compacts conversation and retries
|
|
42
43
|
- 🏠 **100% Local** — No cloud services, works completely offline
|
|
43
44
|
- ⚡ **Blazing Fast** — Native Rust for all performance-critical operations
|
|
44
45
|
|
|
@@ -126,7 +127,7 @@ Press **`Ctrl+T`** to cycle between variants:
|
|
|
126
127
|
|
|
127
128
|
## Skills
|
|
128
129
|
|
|
129
|
-
IronCode ships with **
|
|
130
|
+
IronCode ships with **15 built-in skill workflows** — opinionated slash commands that switch the agent into a specialist mode. Instead of one generic assistant, you get: founder, tech lead, TDD coach, debugger, paranoid reviewer, release engineer, QA tester, security auditor, technical writer, and engineering manager.
|
|
130
131
|
|
|
131
132
|
| Skill | Mode | What it does |
|
|
132
133
|
| ------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -135,6 +136,8 @@ IronCode ships with **13 built-in skill workflows** — opinionated slash comman
|
|
|
135
136
|
| `/tdd` | Developer | RED-GREEN-REFACTOR: write a failing test, minimal code to pass, refactor. No production code without a failing test first. |
|
|
136
137
|
| `/debug` | Debugger | Systematic 4-phase debugging: root cause investigation, pattern analysis, hypothesis testing, implementation. 3-fix rule escalates architectural problems. |
|
|
137
138
|
| `/code-review` | Staff engineer | Find bugs that pass CI but blow up in production. Two-pass: critical + informational. |
|
|
139
|
+
| `/security-review` | Security engineer | Scan the current branch diff for OWASP Top 10 vulnerabilities before shipping. Two-pass: critical + informational. Integrates Semgrep MCP when available. |
|
|
140
|
+
| `/web-scan` | Penetration tester | Actively probe a live URL for misconfigs, exposed files, SSL issues, CORS, and info disclosure. Uses curl; optionally integrates Nikto and Nuclei. |
|
|
138
141
|
| `/verify` | Gatekeeper | Run the command, read the output, then claim the result. Evidence before assertions — no "should work now." |
|
|
139
142
|
| `/code-ship` | Release engineer | Merge, test, typecheck, review, changelog, bisectable commits, push, and PR — one command. |
|
|
140
143
|
| `/browse` | QA engineer | Headless Chromium via Playwright. Navigate, click, fill forms, screenshot, assert states, test responsive layouts. |
|
|
@@ -207,6 +210,82 @@ Streak: 12 consecutive days.
|
|
|
207
210
|
|
|
208
211
|
````
|
|
209
212
|
|
|
213
|
+
### Security Skills
|
|
214
|
+
|
|
215
|
+
`/security-review` and `/web-scan` work out of the box with no extra setup. Install optional tools below for deeper scanning.
|
|
216
|
+
|
|
217
|
+
#### Optional: Semgrep MCP (static analysis for `/security-review`)
|
|
218
|
+
|
|
219
|
+
[Semgrep](https://semgrep.dev) adds pattern-based static analysis on top of the built-in OWASP checklist — detecting injection, hardcoded secrets, insecure APIs, and supply chain issues across 30+ languages.
|
|
220
|
+
|
|
221
|
+
**1. Add to your ironcode config** (`~/.config/ironcode/ironcode.json` for global, or `ironcode.json` in your project):
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"mcp": {
|
|
226
|
+
"semgrep": {
|
|
227
|
+
"type": "local",
|
|
228
|
+
"command": ["npx", "@modular-intelligence/semgrep"]
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Optional — add `SEMGREP_APP_TOKEN` to unlock Pro rules (free at semgrep.dev):
|
|
235
|
+
|
|
236
|
+
```json
|
|
237
|
+
{
|
|
238
|
+
"mcp": {
|
|
239
|
+
"semgrep": {
|
|
240
|
+
"type": "local",
|
|
241
|
+
"command": ["npx", "@modular-intelligence/semgrep"],
|
|
242
|
+
"environment": {
|
|
243
|
+
"SEMGREP_APP_TOKEN": "your-token-here"
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**2. Install Semgrep CLI** (required by the MCP server):
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
# macOS
|
|
254
|
+
brew install semgrep
|
|
255
|
+
|
|
256
|
+
# pip
|
|
257
|
+
pip install semgrep
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**3. Restart IronCode**, then verify:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
ironcode mcp list
|
|
264
|
+
# semgrep connected
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
When connected, `/security-review` runs three scans automatically — SAST (diff-aware), secrets detection, and supply chain — then merges all findings into the report under `[SEMGREP]`.
|
|
268
|
+
|
|
269
|
+
> `npx` auto-downloads `@modular-intelligence/semgrep` on first run. The Semgrep CLI must be installed separately (step 2 above).
|
|
270
|
+
|
|
271
|
+
#### Optional: Nikto + Nuclei (active scanning for `/web-scan`)
|
|
272
|
+
|
|
273
|
+
`/web-scan` uses `curl` by default. Install Nikto and/or Nuclei for deeper active scanning:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
# macOS
|
|
277
|
+
brew install nikto
|
|
278
|
+
brew install nuclei && nuclei -update-templates
|
|
279
|
+
|
|
280
|
+
# Ubuntu / Debian
|
|
281
|
+
sudo apt install nikto
|
|
282
|
+
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
When installed, `/web-scan` detects them automatically and appends their findings to the report.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
210
289
|
### Skills requiring Playwright MCP
|
|
211
290
|
|
|
212
291
|
The `/browse`, `/qa`, `/qa-only`, and `/qa-browse` skills control a real browser via [Playwright MCP](https://github.com/microsoft/playwright-mcp). Set it up once before using them.
|
|
@@ -384,6 +463,23 @@ Areas to help with: performance optimizations, bug fixes, documentation, new plu
|
|
|
384
463
|
|
|
385
464
|
## Changelog
|
|
386
465
|
|
|
466
|
+
<details>
|
|
467
|
+
<summary><strong>v1.20.6</strong> — Auto-Compact Overflow + UI Fixes</summary>
|
|
468
|
+
|
|
469
|
+
**Auto-compact on context overflow**
|
|
470
|
+
- When model returns a token limit error (e.g. `"prompt token count of 128195 exceeds the limit of 128000"`), IronCode now automatically triggers compaction to summarize the conversation, then retries the request — instead of showing an error
|
|
471
|
+
- Covers Gemini, OpenAI, and generic `context length exceeded` error messages
|
|
472
|
+
|
|
473
|
+
**File Explorer — insert to prompt**
|
|
474
|
+
- Selecting a file in the file explorer (`/explorer`) now inserts its path directly into the prompt and closes the dialog
|
|
475
|
+
- Previously, selecting a file only toggled the preview panel with no action
|
|
476
|
+
|
|
477
|
+
**Fix data: URI file attachments**
|
|
478
|
+
- Files attached as `data:` URIs (screenshots, voice messages, documents sent via Telegram/Discord) no longer fail with `AI_DownloadError: URL scheme must be http or https`
|
|
479
|
+
- The `data:` prefix is stripped before passing to the AI SDK
|
|
480
|
+
|
|
481
|
+
</details>
|
|
482
|
+
|
|
387
483
|
<details>
|
|
388
484
|
<summary><strong>v1.20.5</strong> — Narrow Terminal / Mobile SSH Support</summary>
|
|
389
485
|
|
package/package.json
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
"scripts": {
|
|
7
7
|
"postinstall": "bun ./postinstall.mjs || node ./postinstall.mjs"
|
|
8
8
|
},
|
|
9
|
-
"version": "1.20.
|
|
9
|
+
"version": "1.20.9",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"optionalDependencies": {
|
|
12
|
-
"ironcode-linux-x64-
|
|
13
|
-
"ironcode-
|
|
14
|
-
"ironcode-linux-x64-baseline-musl": "1.20.
|
|
15
|
-
"ironcode-windows-x64-modern": "1.20.
|
|
16
|
-
"ironcode-
|
|
12
|
+
"ironcode-linux-x64-modern": "1.20.9",
|
|
13
|
+
"ironcode-darwin-arm64": "1.20.9",
|
|
14
|
+
"ironcode-linux-x64-baseline-musl": "1.20.9",
|
|
15
|
+
"ironcode-windows-x64-modern": "1.20.9",
|
|
16
|
+
"ironcode-linux-x64-baseline": "1.20.9"
|
|
17
17
|
}
|
|
18
18
|
}
|
package/postinstall.mjs
CHANGED
|
@@ -49,27 +49,33 @@ function detectPlatformAndArch() {
|
|
|
49
49
|
|
|
50
50
|
function findBinary() {
|
|
51
51
|
const { platform, arch } = detectPlatformAndArch()
|
|
52
|
-
// const packageName = `ironcode-${platform}-${arch}`
|
|
53
|
-
let packageName = `ironcode-${platform}-${arch}`
|
|
54
|
-
if (arch === "x64") {
|
|
55
|
-
packageName += "-modern"
|
|
56
|
-
}
|
|
57
52
|
const binaryName = platform === "windows" ? "ironcode.exe" : "ironcode"
|
|
58
53
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
54
|
+
// Build candidate package names in preference order
|
|
55
|
+
const candidates = []
|
|
56
|
+
if (arch === "x64") {
|
|
57
|
+
candidates.push(`ironcode-${platform}-${arch}-modern`)
|
|
58
|
+
}
|
|
59
|
+
candidates.push(`ironcode-${platform}-${arch}`)
|
|
60
|
+
// Fallback: on darwin-x64 try arm64 (runs via Rosetta 2)
|
|
61
|
+
if (platform === "darwin" && arch === "x64") {
|
|
62
|
+
candidates.push("ironcode-darwin-arm64")
|
|
63
|
+
}
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
for (const packageName of candidates) {
|
|
66
|
+
try {
|
|
67
|
+
const packageJsonPath = require.resolve(`${packageName}/package.json`)
|
|
68
|
+
const packageDir = path.dirname(packageJsonPath)
|
|
69
|
+
const binaryPath = path.join(packageDir, "bin", binaryName)
|
|
70
|
+
if (fs.existsSync(binaryPath)) {
|
|
71
|
+
return { binaryPath, binaryName }
|
|
72
|
+
}
|
|
73
|
+
} catch (_) {
|
|
74
|
+
// not installed, try next candidate
|
|
67
75
|
}
|
|
68
|
-
|
|
69
|
-
return { binaryPath, binaryName }
|
|
70
|
-
} catch (error) {
|
|
71
|
-
throw new Error(`Could not find package ${packageName}: ${error.message}`)
|
|
72
76
|
}
|
|
77
|
+
|
|
78
|
+
throw new Error(`Could not find a suitable ironcode binary package for ${platform}-${arch}`)
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
function prepareBinDirectory(binaryName) {
|