@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.
@@ -9,7 +9,7 @@
9
9
  "name": "aimhooman",
10
10
  "source": "./",
11
11
  "description": "Keeps AI session files, secrets, and unwanted attribution out at the agent and Git boundary.",
12
- "version": "0.1.6",
12
+ "version": "0.1.8",
13
13
  "license": "MIT",
14
14
  "keywords": [
15
15
  "git",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aimhooman",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "AI works. Hoomans ship. Keeps AI session files, secrets, and unwanted attribution out at the agent and Git boundary.",
5
5
  "author": {
6
6
  "name": "aimhooman"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aimhooman",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "AI works. Hoomans ship. Keeps AI session files, secrets, and unwanted attribution out at the agent and Git boundary.",
5
5
  "author": {
6
6
  "name": "aimhooman maintainers",
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.6-blue" alt="v0.1.6">
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/>full-scans every introduced commit"]
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