@rmyndharis/aimhooman 0.1.6 → 0.1.8
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +108 -0
- package/README.md +2 -2
- package/bin/aimhooman.mjs +368 -242
- package/docs/design/frictionless-enforcement.md +7 -4
- package/package.json +1 -1
- package/rules/paths.json +65 -16
- package/rules/secrets.json +3 -3
- package/src/githooks.mjs +51 -6
- package/src/gitx.mjs +10 -0
- package/src/hook.mjs +137 -5
- package/src/report.mjs +27 -2
- package/src/scan-session.mjs +77 -1
- package/src/scan-target.mjs +23 -5
- package/src/scan.mjs +40 -7
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,114 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.1.8] - 2026-07-18
|
|
9
|
+
|
|
10
|
+
This release works through the findings of the real-world scenario report
|
|
11
|
+
(191 scenarios across 11 repos, 8 languages). The headline: a read-only
|
|
12
|
+
command copied from `gh`'s own docs no longer gets denied, and editing an
|
|
13
|
+
unrelated line in a file that carries a private-key header elsewhere no
|
|
14
|
+
longer blocks the commit.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Read-only commands with unquoted braces (`gh api repos/{owner}/{repo}/pulls`,
|
|
19
|
+
`ls {owner}`, `cp x.{js,ts}`) are no longer denied as opaque commit-hiding
|
|
20
|
+
pipelines. Brace expansion is argument-level and cannot feed code into a pipe
|
|
21
|
+
sink; brace groups (`{ list; }`) and PowerShell script blocks remain opaque.
|
|
22
|
+
The opaque-deny message also no longer names a pipe when the command has none.
|
|
23
|
+
- Editing an unrelated line in a file that contains a private-key header
|
|
24
|
+
elsewhere (e.g. a PEM fixture inside a Go test string) no longer blocks the
|
|
25
|
+
commit. Content scanning is now narrowed to the changed hunks; a header added
|
|
26
|
+
in the diff still blocks, a header carried outside the diff stays silent.
|
|
27
|
+
Binary blobs keep their whole-blob secret scan.
|
|
28
|
+
- AWS's documented example secret access key (`wJalrXUtnFEMI/...EXAMPLEKEY`)
|
|
29
|
+
no longer blocks commits. Its access-key-ID pair was already excepted; the
|
|
30
|
+
secret-key half now is too. Real keys — including ones containing `EXAMPLEKEY`
|
|
31
|
+
as a substring — still block.
|
|
32
|
+
- `aimhooman <subcommand> --help` now prints usage and exits 0 instead of
|
|
33
|
+
erroring on the unknown `--help` option.
|
|
34
|
+
- The human finding report renders every remediation entry (a rule's second
|
|
35
|
+
line, e.g. "rotate the key if it was ever exposed", was silently dropped), and
|
|
36
|
+
its summary line agrees on number (`1 finding`, not `1 findings`). A scan
|
|
37
|
+
firing many findings (a vendored OpenSSL corpus can produce 99) now caps the
|
|
38
|
+
printed blocks at 20 and collapses the rest into one truncation line; the JSON
|
|
39
|
+
report stays uncapped.
|
|
40
|
+
- The `secret.private-key` message now states the match is by filename, not by
|
|
41
|
+
content, and offers renaming the file when the name is coincidental.
|
|
42
|
+
- A chained hook predecessor that resolves sibling scripts via `$(dirname "$0")`
|
|
43
|
+
— the dominant husky and vanilla `.githooks` pattern — no longer breaks after
|
|
44
|
+
`aimhooman init`. The dispatcher now sources the predecessor in a subshell,
|
|
45
|
+
which preserves the original `$0`. (Bash-only predecessors remain out of
|
|
46
|
+
scope.)
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- **Breaking:** an untracked `core.hooksPath` inside the worktree (a freshly
|
|
51
|
+
created `.husky` before its first commit, a team-local `.team-hooks`) is now
|
|
52
|
+
treated as repository content and refuses to receive a dispatcher — the next
|
|
53
|
+
`git add` would otherwise stage the dispatcher's machine-local absolute CLI,
|
|
54
|
+
Node, and PATH into history. Add the path to `.gitignore` or
|
|
55
|
+
`.git/info/exclude` to keep it local; the refusal message names this and
|
|
56
|
+
points at `aimhooman uninstall`. A `.git/hooks/` path and a tracked `.husky`
|
|
57
|
+
are unaffected.
|
|
58
|
+
- `aimhooman review` advisories now persist per path across edits on the
|
|
59
|
+
`clean` and `compliance` profiles, so editing a reviewed agent-instruction
|
|
60
|
+
file (CLAUDE.md, AGENTS.md, `.github/copilot-instructions.md`) no longer
|
|
61
|
+
re-surfaces the review message on every edit. The `strict` profile keeps the
|
|
62
|
+
exact-blob binding unchanged; reviewed deletions (tombstones) keep it in every
|
|
63
|
+
profile.
|
|
64
|
+
- The `aimhooman init` refusal message names the two remedies (unset
|
|
65
|
+
`core.hooksPath`, or exclude the worktree path) and points at
|
|
66
|
+
`aimhooman uninstall`, so a refused init is no longer a dead end.
|
|
67
|
+
|
|
68
|
+
### Performance
|
|
69
|
+
|
|
70
|
+
- A commit no longer pays a duplicate tree scan in `commit-msg` for the staged
|
|
71
|
+
tree that `pre-commit` just verified. `pre-commit` records the staged tree sha
|
|
72
|
+
after a clean, complete scan; `commit-msg` skips its ~170 ms tree scan when the
|
|
73
|
+
sha matches. The marker is self-invalidating (any index mutation changes the
|
|
74
|
+
sha) and a missing/stale/mismatched marker falls back to the full scan, so
|
|
75
|
+
this is purely an optimization. Net ~150 ms saved per commit.
|
|
76
|
+
|
|
77
|
+
## [0.1.7] - 2026-07-18
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- The final reference guard no longer holds a branch hostage to a file already
|
|
82
|
+
in its history. A commit was scanned against the full tree it inherited, so a
|
|
83
|
+
path allowed in once and then un-allowed blocked every later commit on the
|
|
84
|
+
branch, even one-line edits to an unrelated file — and the only way out was to
|
|
85
|
+
rewrite history. The guard now judges a commit by what it changes: a newly
|
|
86
|
+
staged `.env` still stops the commit, while a file the commit merely carries
|
|
87
|
+
forward from its parent stays silent. A secret already in history is not
|
|
88
|
+
forgotten — `aimhooman check --tracked` still names it — but it no longer
|
|
89
|
+
bricks the branch.
|
|
90
|
+
- Imported history no longer trips the attribution guard. `gh pr checkout` and
|
|
91
|
+
`git fetch` bring in other people's commits, whose messages a local developer
|
|
92
|
+
cannot edit; scanning them for AI co-author trailers blocked the checkout
|
|
93
|
+
whenever a PR commit carried one. The guard now scopes attribution and marker
|
|
94
|
+
rules to commits written in the repository (a plain commit, an `--amend`, a
|
|
95
|
+
local merge), and leaves imported commits' messages alone. A locally authored
|
|
96
|
+
`git commit --no-verify` that smuggles the same trailer is still stopped at the
|
|
97
|
+
final guard.
|
|
98
|
+
- `aimhooman status` no longer advertises a profile the hooks are not applying.
|
|
99
|
+
The enforcing guards resolve the project policy from the index, so a worktree
|
|
100
|
+
`.aimhooman.json` that has not been `git add`ed was invisible to them — yet
|
|
101
|
+
`status` reported its profile as active. `status` now shows the staged profile
|
|
102
|
+
the hooks actually enforce, prints the worktree value alongside when the two
|
|
103
|
+
differ, and names the remedy (`git add .aimhooman.json`).
|
|
104
|
+
- A pipeline into a shell with no commit in it is still refused, but the reason
|
|
105
|
+
no longer tells the developer to retry a commit they never wrote. The deny
|
|
106
|
+
text for `echo x | bash` and similar now names the real shape — a pipeline
|
|
107
|
+
whose sink can run arbitrary commands — instead of reusing the commit-themed
|
|
108
|
+
message.
|
|
109
|
+
- A timing or scheduling prefix no longer reads as a hook bypass. `time`,
|
|
110
|
+
`timeout`, `nice`, and `ionice` run the inner command with the same argv in the
|
|
111
|
+
same place, so `time git commit` is judged like `git commit` instead of being
|
|
112
|
+
refused as opaque shell indirection. The carve-out only applies when nothing
|
|
113
|
+
else injects risk; a `--no-verify` or a hooks-path override wrapped in the
|
|
114
|
+
prefix is still caught.
|
|
115
|
+
|
|
8
116
|
## [0.1.6] - 2026-07-18
|
|
9
117
|
|
|
10
118
|
### Fixed
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
11
|
<img src="https://img.shields.io/github/actions/workflow/status/rmyndharis/aimhooman/test.yml?branch=main&label=CI" alt="CI">
|
|
12
|
-
<img src="https://img.shields.io/badge/version-v0.1.
|
|
12
|
+
<img src="https://img.shields.io/badge/version-v0.1.8-blue" alt="v0.1.8">
|
|
13
13
|
<img src="https://img.shields.io/badge/node-%E2%89%A522.8-339933?logo=node.js&logoColor=white" alt="Node 22.8+">
|
|
14
14
|
<img src="https://img.shields.io/badge/dependencies-0-brightgreen" alt="Zero dependencies">
|
|
15
15
|
<img src="https://img.shields.io/badge/license-MIT-111111" alt="MIT">
|
|
@@ -76,7 +76,7 @@ flowchart TD
|
|
|
76
76
|
DIRECT([Sequencer or direct ref path<br/>cherry-pick · rebase · fetch · worktree · update-ref]) --> REF
|
|
77
77
|
PRE -->|clean: safe repair| MSG["commit-msg snapshots would-be tree,<br/>runs predecessor, then checks<br/>the message and pinned full tree"]
|
|
78
78
|
PRE -->|strict violation, incomplete scan,<br/>or failed repair| BLOCK([Operation stops])
|
|
79
|
-
MSG -->|message and tree accepted| REF["reference-transaction prepared<br/>
|
|
79
|
+
MSG -->|message and tree accepted| REF["reference-transaction prepared<br/>scans what each introduced commit changes<br/>(messages of locally authored commits only)"]
|
|
80
80
|
MSG -->|unsafe or unrepairable| BLOCK
|
|
81
81
|
REF -->|accepted| SHIP([Ref update commits])
|
|
82
82
|
REF -->|violation or incomplete scan| BLOCK
|