ironcode-ai 1.20.8 → 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 +79 -1
- package/package.json +6 -6
- package/postinstall.mjs +22 -16
package/README.md
CHANGED
|
@@ -127,7 +127,7 @@ Press **`Ctrl+T`** to cycle between variants:
|
|
|
127
127
|
|
|
128
128
|
## Skills
|
|
129
129
|
|
|
130
|
-
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.
|
|
131
131
|
|
|
132
132
|
| Skill | Mode | What it does |
|
|
133
133
|
| ------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -136,6 +136,8 @@ IronCode ships with **13 built-in skill workflows** — opinionated slash comman
|
|
|
136
136
|
| `/tdd` | Developer | RED-GREEN-REFACTOR: write a failing test, minimal code to pass, refactor. No production code without a failing test first. |
|
|
137
137
|
| `/debug` | Debugger | Systematic 4-phase debugging: root cause investigation, pattern analysis, hypothesis testing, implementation. 3-fix rule escalates architectural problems. |
|
|
138
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. |
|
|
139
141
|
| `/verify` | Gatekeeper | Run the command, read the output, then claim the result. Evidence before assertions — no "should work now." |
|
|
140
142
|
| `/code-ship` | Release engineer | Merge, test, typecheck, review, changelog, bisectable commits, push, and PR — one command. |
|
|
141
143
|
| `/browse` | QA engineer | Headless Chromium via Playwright. Navigate, click, fill forms, screenshot, assert states, test responsive layouts. |
|
|
@@ -208,6 +210,82 @@ Streak: 12 consecutive days.
|
|
|
208
210
|
|
|
209
211
|
````
|
|
210
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
|
+
|
|
211
289
|
### Skills requiring Playwright MCP
|
|
212
290
|
|
|
213
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.
|
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-darwin-arm64": "1.20.
|
|
14
|
-
"ironcode-
|
|
15
|
-
"ironcode-
|
|
16
|
-
"ironcode-linux-x64-baseline
|
|
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) {
|