ironheights 0.1.1 → 0.1.4
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 +33 -7
- package/dist/cli/index.js +446 -150
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/skill/ironheights/SKILL.md +2 -1
package/README.md
CHANGED
|
@@ -60,12 +60,32 @@ Verdict: review
|
|
|
60
60
|
Absence of findings is not proof of safety.
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
Exit
|
|
63
|
+
| Exit | Meaning |
|
|
64
|
+
| ---- | ---------------------------------------------------------------------------------------------- |
|
|
65
|
+
| 0 | No findings |
|
|
66
|
+
| 1 | Review |
|
|
67
|
+
| 2 | Block |
|
|
68
|
+
| 3 | Incomplete. A file was skipped, and the files that were scanned did not reach review or block. |
|
|
69
|
+
| 64 | Usage or config error |
|
|
70
|
+
| 70 | Internal error |
|
|
71
|
+
|
|
72
|
+
`--fail-on low|medium|high|critical` returns `0` when every finding is below that severity and no file was skipped. A skipped file still returns `3` unless you pass `--allow-skipped`. That flag keeps the skipped-file warning and returns the finding verdict (`0`, `1`, or `2`) instead.
|
|
73
|
+
|
|
74
|
+
A scan that skipped a file looks like this:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
padded
|
|
78
|
+
warning: skipped payload.md (file exceeds 1048576 bytes)
|
|
79
|
+
Scan incomplete: 1 file was not scanned.
|
|
80
|
+
|
|
81
|
+
Verdict: incomplete
|
|
82
|
+
Absence of findings is not proof of safety.
|
|
83
|
+
```
|
|
64
84
|
|
|
65
85
|
## Commands
|
|
66
86
|
|
|
67
87
|
```text
|
|
68
|
-
ironheights scan <path> [--all] [--json] [--sarif <file>] [--md <file>] [--fail-on <severity>] [--config <file>] [--no-color] [--quiet]
|
|
88
|
+
ironheights scan <path> [--all] [--json] [--sarif <file>] [--md <file>] [--fail-on <severity>] [--config <file>] [--allow-skipped] [--no-color] [--quiet]
|
|
69
89
|
ironheights baseline create|update|show
|
|
70
90
|
ironheights verify
|
|
71
91
|
ironheights quarantine <skill>
|
|
@@ -96,7 +116,7 @@ Ironheights reads `ironheights.config.json` from the current directory, then `~/
|
|
|
96
116
|
}
|
|
97
117
|
```
|
|
98
118
|
|
|
99
|
-
An allowlist entry matches that host and its subdomains. The built-in list includes `example.com`, `example.org`, `example.net`, `localhost`, GitHub, npm, PyPI, and `openclaw.ai`.
|
|
119
|
+
An allowlist entry matches that host and its subdomains. The built-in list includes `example.com`, `example.org`, `example.net`, `localhost`, the loopback addresses `127.0.0.1` and `::1`, GitHub, npm, PyPI, and `openclaw.ai`.
|
|
100
120
|
|
|
101
121
|
## JSON output
|
|
102
122
|
|
|
@@ -105,16 +125,17 @@ An allowlist entry matches that host and its subdomains. The built-in list inclu
|
|
|
105
125
|
```json
|
|
106
126
|
{
|
|
107
127
|
"schemaVersion": 1,
|
|
108
|
-
"tool": { "name": "ironheights", "version": "0.1.
|
|
128
|
+
"tool": { "name": "ironheights", "version": "0.1.4" },
|
|
109
129
|
"scannedAt": "2026-10-09T00:00:00.000Z",
|
|
110
130
|
"verdict": "no-findings",
|
|
131
|
+
"skippedFileCount": 0,
|
|
111
132
|
"skills": []
|
|
112
133
|
}
|
|
113
134
|
```
|
|
114
135
|
|
|
115
|
-
Each skill has `skillName`, `root`, `filesScanned`, `filesSkipped`, `findings`, `score`, and `verdict`. A finding has `ruleId`, `severity`, `confidence`, `file`, optional `line` and `column`, `evidence`, `message`, and `remediation`. `--sarif` writes SARIF 2.1.0.
|
|
136
|
+
Each skill has `skillName`, `root`, `filesScanned`, `filesSkipped`, `skippedFileCount`, `findings`, `score`, and `verdict`. `skippedFileCount` is the number of files the scan did not read. `filesSkipped` lists each path and the reason. A finding has `ruleId`, `severity`, `confidence`, `file`, optional `line` and `column`, `evidence`, `message`, and `remediation`. `--sarif` writes SARIF 2.1.0. The run `properties.skippedFileCount` is the same total, and `tool.driver.informationUri` is `https://github.com/Frank-Masciopinto/ironheights`.
|
|
116
137
|
|
|
117
|
-
Scoring is critical 100, high 40, medium 15, low 5, info 0. The verdict is `block` when any finding is critical or the score is at least 80. It is `review` when any finding is high or medium, or the score is at least 15. Otherwise it is `no-findings`.
|
|
138
|
+
Scoring is critical 100, high 40, medium 15, low 5, info 0. The verdict is `block` when any finding is critical or the score is at least 80. It is `review` when any finding is high or medium, or the score is at least 15. It is `incomplete` when files were skipped and the score would otherwise be `no-findings`. Otherwise it is `no-findings`.
|
|
118
139
|
|
|
119
140
|
## Rules
|
|
120
141
|
|
|
@@ -133,16 +154,21 @@ Verified against the OpenClaw docs for the 2026.9.3 line:
|
|
|
133
154
|
| Personal agent skills | `~/.agents/skills` |
|
|
134
155
|
| Managed skills | `~/.openclaw/skills` |
|
|
135
156
|
| Workshop skills | `~/.openclaw/agents/<agent>/agent/workshop-skills` |
|
|
157
|
+
| Bundled skills | `<openclaw package>/skills` |
|
|
158
|
+
| Custodian skills | `<openclaw package>/custodian-skills` |
|
|
159
|
+
| Plugin skills | real paths linked from `~/.openclaw/plugin-skills` |
|
|
136
160
|
| Extra directories | `skills.load.extraDirs` in `~/.openclaw/openclaw.json` |
|
|
137
161
|
|
|
138
162
|
The default workspace is `~/.openclaw/workspace`. Config is `$OPENCLAW_CONFIG_PATH` or `~/.openclaw/openclaw.json`. State moves when `OPENCLAW_STATE_DIR` is set.
|
|
139
163
|
|
|
140
164
|
Watched agent files default to `AGENTS.md`, `SOUL.md`, `IDENTITY.md`, `USER.md`, `TOOLS.md`, `BOOTSTRAP.md`, `MEMORY.md`, the `memory/` directory, `openclaw.json`, `credentials/`, and `.env` under the OpenClaw state directory. Change the list with `agentFiles`.
|
|
141
165
|
|
|
142
|
-
|
|
166
|
+
Bundled skills are the `skills/` directory in the OpenClaw package. Ironheights finds that package from `OPENCLAW_BUNDLED_SKILLS_DIR`, from the `~/.openclaw/bin/openclaw` wrapper, from `~/.openclaw/tools/node-v*/lib/node_modules/openclaw`, or from the usual global `node_modules/openclaw` locations. Custodian skills are the sibling `custodian-skills/` directory. Plugin skills are the directories linked from `~/.openclaw/plugin-skills`. `doctor` says when the bundled directory was not found.
|
|
143
167
|
|
|
144
168
|
`SKILL.md` needs YAML frontmatter with `name` and `description`. Optional fields include `metadata.openclaw`, `homepage`, `user-invocable`, `disable-model-invocation`, and the `command-dispatch` keys.
|
|
145
169
|
|
|
170
|
+
`metadata.ironheights.allowDomains` is a list of hosts that this skill is allowed to contact. `IH-NET-001` skips those hosts and their subdomains for that skill only. Another skill that calls the same host still reports. The bundled OpenClaw skills do not declare their hosts, so `scan --all` on a stock install still reports their API hosts.
|
|
171
|
+
|
|
146
172
|
## Integrity
|
|
147
173
|
|
|
148
174
|
`baseline create` writes `~/.ironheights/baseline.json` with mode `0600`. The file stores a sha256, size, and mode for each path, plus a `treeHash` of the sorted content hashes. `verify` reports added, modified, removed, and mode-changed files.
|