ironheights 0.1.1 → 0.1.5

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 CHANGED
@@ -60,12 +60,32 @@ Verdict: review
60
60
  Absence of findings is not proof of safety.
61
61
  ```
62
62
 
63
- Exit codes are `0` for no findings, `1` for review, `2` for block, `64` for a usage or config error, and `70` for an internal error. `--fail-on low|medium|high|critical` returns `0` when every finding is below that severity.
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.1" },
128
+ "tool": { "name": "ironheights", "version": "0.1.5" },
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,23 @@ 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
- `TODO(verify)`: bundled skills live inside the OpenClaw install and are not scanned unless you add that directory to `skillDirs`. Plugin skills were observed at `~/.openclaw/plugin-skills` on one machine; the docs name them as a load source without one portable path. `doctor` marks that directory as unverified.
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
+
172
+ A download, install, or fetch instruction is a contact, and so is a paste site or a file-drop host. A schema link, or an official API host mentioned in prose, is not.
173
+
146
174
  ## Integrity
147
175
 
148
176
  `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.