Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Changelog

All notable changes to this project are documented in this file.

## v1.2.1 (2026-02-19)

- Added `CHANGELOG.md` documenting all releases from v1.0.2 through v1.2.0.
- Updated `CLAUDE.md` with changelog maintenance instructions.

## v1.2.0 (2026-02-19)

- **OpenCode support** (PR #24): Plugin now works with both Claude Code and OpenCode. OpenCode users can install `opencode-block` from npm. The TypeScript plugin reuses the same `protect_directories.py` logic via `tool.execute.before` hook, intercepting edit, write, bash, and patch tools.
- Automated npm publishing via GitHub Actions with OIDC trusted publishing (no npm tokens needed).

## v1.1.14 (2026-02-18)

- **Parent directory protection** (PR #23): Running commands like `rm -rf parent/` no longer bypasses protection when a child directory (e.g. `parent/child/.block`) has a `.block` file. The hook now scans descendant directories for `.block` files when the target is a directory.

## v1.1.13 (2026-02-11)

- **Fix**: Restored execute permissions on `run-hook.cmd` that were lost during a prior commit. Without execute permissions, the hook silently failed on Linux and macOS (Unix/POSIX systems) where file permission bits are enforced.

## v1.1.12 (2026-02-11)

- **Fix**: Added execute permissions to `run-hook.cmd`. Same issue as v1.1.13 - the polyglot script needs the executable bit set on Unix/POSIX systems (Linux, macOS). Windows is unaffected as it doesn't use Unix permission bits.
Comment on lines +23 to +25

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Forward reference in v1.1.12 entry reads backwards.

Line 25 says "Same issue as v1.1.13", but v1.1.12 predates v1.1.13 — the issue occurred first in v1.1.12 and recurred in v1.1.13. The cross-reference direction should be reversed: v1.1.13's entry should say "Same issue as v1.1.12", not the other way around.

📝 Suggested rewording
 ## v1.1.13 (2026-02-11)
 
-- **Fix**: Restored execute permissions on `run-hook.cmd` that were lost during a prior commit. Without execute permissions, the hook silently failed on Linux and macOS (Unix/POSIX systems) where file permission bits are enforced.
+- **Fix**: Restored execute permissions on `run-hook.cmd` that were lost during a prior commit (same issue as v1.1.12). Without execute permissions, the hook silently failed on Linux and macOS (Unix/POSIX systems) where file permission bits are enforced.
 
 ## v1.1.12 (2026-02-11)
 
-- **Fix**: Added execute permissions to `run-hook.cmd`. Same issue as v1.1.13 - the polyglot script needs the executable bit set on Unix/POSIX systems (Linux, macOS). Windows is unaffected as it doesn't use Unix permission bits.
+- **Fix**: Added execute permissions to `run-hook.cmd`. The polyglot script needs the executable bit set on Unix/POSIX systems (Linux, macOS). Windows is unaffected as it doesn't use Unix permission bits.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` around lines 23 - 25, Update the forward reference in the
CHANGELOG entry for v1.1.12: replace "Same issue as v1.1.13" with wording that
points backwards (e.g., remove the forward reference or change it so v1.1.13's
entry references v1.1.12). Specifically edit the v1.1.12 paragraph that mentions
`run-hook.cmd` and the version strings "v1.1.12" / "v1.1.13" so the
cross-reference correctly indicates that v1.1.13 repeated the issue originally
introduced in v1.1.12.


## v1.1.11 (2026-01-21)

- **Hierarchical blocked pattern inheritance** (PR #22): Child `.block` files now inherit `blocked` patterns from all parent directories. For example, if `project/.block` blocks `*.log` and `project/src/.block` blocks `generated/**`, then files in `src/` are blocked if they match either pattern. Allowed patterns still override (no inheritance). Child guide messages take precedence over parent ones.

## v1.1.10 (2026-01-21)

- **Internal**: Removed unused `_extract_paths_from_tokens` function. Fixed pyproject.toml license format and package discovery (PR #20).
- **Testing**: Added tests verifying protection works based on the target file's actual path, not the current working directory (PR #19).

## v1.1.9 (2026-01-21)

- **Fix**: Removed buggy quick-check optimization from `run-hook.cmd` (PR #18). The quick check used the current working directory to look for `.block` files, but Claude Code's working directory is the project root, not the target file's directory. This caused the hook to miss `.block` files in subdirectories, allowing edits that should have been blocked.

## v1.1.8 (2026-01-21)

- **Cross-platform polyglot hook** (PR #17): Replaced separate `.sh` and `.cmd` wrapper scripts with a single `run-hook.cmd` polyglot script that works on both Windows (as a batch file) and Linux/macOS (as a shell script). Removed jq references from documentation. Moved hook tests from BATS shell framework to pytest.

## v1.1.7 (2026-01-21)

- **Migrated from Bash/jq to Python 3** (PR #16): Replaced `protect-directories.sh` with `protect_directories.py`. **jq is no longer required** - only Python 3.8+ is needed. Migrated all tests from BATS to pytest. Removed the experimental agent-specific permissions feature. Removed the `check-jq.sh` SessionStart hook (no longer needed).

## v1.1.6 (2026-01-20)

- **Fix**: Improved jq dependency handling (PR #15). Better error messages when jq is missing or broken. Fixed macOS compatibility issue where path extraction regex didn't work with macOS's grep.

## v1.1.5 (2026-01-20)

- **Fix**: Fixed `protect-directories.sh` to verify jq actually works, not just that the binary exists. Previously, a corrupted or incompatible jq installation would cause silent failures.

## v1.1.4 (2026-01-20)

- **Fix**: Fixed jq verification to test actual functionality (PR #13, #14). Fixed Windows compatibility in jq tests. Added E2E pipeline for testing hooks with Claude Code directly.

## v1.1.3 (2026-01-19)

- **Fix**: Synced changes from plugin cache (PR #12). Removed debug logging and unused `fix_windows_json_paths`. Fixed `check-jq.sh` to always return valid JSON (was producing empty output when jq was installed).

## v1.1.2 (2026-01-19)

- **Fix**: Fixed hooks failing silently on Windows (PR #11). When Claude Code runs from `cmd.exe`, the PATH is minimal (`npm;nodejs` only) and doesn't include Git/bash. Shell scripts failed silently with "Hook output does not start with {" errors. Added `.cmd` wrapper scripts that call `bash.exe` with full path and `-l` flag for login shell. Changed hook output from stderr to stdout JSON format.

## v1.1.1 (2026-01-19)

- **Migrated from Skill to Command format** (PR #10): `/block:create` is now a command instead of a skill for better discoverability in Claude Code.

## v1.1.0 (2026-01-19)

- Updated GitHub username from `iirorahkonen` to `kodroi` (PR #9). Updated all repository references and documentation.

## v1.0.4 (2026-01-19)

- **Fix**: Fixed Windows path handling in JSON input (PR #8). Windows backslash paths (e.g. `C:\Users\...`) weren't properly JSON-escaped, causing the protection check to fail. Now handles both unescaped and already-escaped paths.

## v1.0.3 (2026-01-19)

- **Fix**: Fixed `/block:create` skill not showing up in Claude Code (PR #7). Renamed skill directory and updated frontmatter to make it discoverable as `/block:create`.

## v1.0.2 (2026-01-19) - Initial Release

- File and directory protection using `.block` configuration files
- Allowed/blocked pattern lists with glob wildcards
- Custom guide messages explaining why files are protected
- `.block.local` support for personal/machine-specific rules (not committed to git) (PR #2)
- `/block:create` command for interactive `.block` file creation
- Intercepts Edit, Write, NotebookEdit, and Bash tool operations
- Bash command detection: rm, mv, cp, touch, mkdir, rmdir, tee, and redirects
- CI pipeline with tests on Linux, macOS, and Windows (PR #3)
- Comprehensive test suite (PR #4)
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,7 @@ When creating git worktrees, use the `.worktree` folder in the project root:
```
git worktree add .worktree/<worktree-name> <branch-name>
```

## Changelog

When making user-facing changes, update `CHANGELOG.md` in the project root. Add entries under an `## Unreleased` section at the top, following the existing format: brief description of what changed and why it matters to users, with PR references where applicable.
Comment on lines +58 to +60

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

## Unreleased section is missing from CHANGELOG.md.

The guidance here tells contributors to add entries under ## Unreleased, but CHANGELOG.md itself has no such section and no example of it. A contributor following this instruction would need to know to create the section from scratch. Consider adding an empty ## Unreleased placeholder at the top of CHANGELOG.md so the format is self-evident.

📝 Suggested addition to CHANGELOG.md
 # Changelog
 
 All notable changes to this project are documented in this file.
 
+## Unreleased
+
 ## v1.2.1 (2026-02-19)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLAUDE.md` around lines 58 - 60, Add a top-level "## Unreleased" heading to
CHANGELOG.md as a placeholder so contributors have an example section to add
entries; insert the "## Unreleased" header at the very top (above existing
entries) and include one example bullet showing the expected format (brief
description + PR reference) or a short note telling contributors to add entries
there, following the existing changelog style.