Repository navigation
Highlights
- Now a proper Claude Code plugin. No more
install.sh/hooks-settings.json/~/.claudefile copying. Install, update, and uninstall go through Claude Code's plugin system. - All 9 Write|Edit hooks now actually fire. Previous release referenced
$CLAUDE_HOOK_FILE_PATH— an env var Claude Code does not set — so every Write|Edit hook was a silent no-op. Now parses tool input from stdin JSON and checks pending content correctly.
Install
/plugin marketplace add j-morgan6/ios-from-web-guide
/plugin install ios-from-web-guide@ios-from-web-guide
/reload-plugins
Already installed? Just run:
/plugin update ios-from-web-guide@ios-from-web-guide
/reload-plugins
What changed
Packaging
- Added
.claude-plugin/plugin.json+.claude-plugin/marketplace.jsonmanifests. - Moved hooks to plugin-native
hooks/hooks.json, referencing${CLAUDE_PLUGIN_ROOT}so scripts resolve inside the plugin cache. - Deleted
install.sh,hooks-settings.json,INSTALL-HOOKS.md,VERSION, and thetests/directory (all installer-era scaffolding). - Updated README with
/plugininstall path.
Hook fix
- New
scripts/hook-lint.shdispatcher: parsestool_input.file_path+tool_input.content/.new_stringfrom stdin JSON viapython3, runs the named check against pending content, exits with the right code. - All 8
PreToolUse Write|Edithooks + the 1PostToolUse Write|Edithook now delegate to the dispatcher. PreToolUse Bashhooks rewritten to extracttool_input.commandcleanly (previously worked incidentally by grepping the raw JSON payload — could false-positive on unrelated JSON keys).
Verified working
Block hooks (exit 2) tested live through Claude Code's hook runtime:
- Storing auth tokens in
UserDefaults→ blocked NavigationLink(value:)wrapping a Button with.buttonStyle(.plain)→ blocked- Force-pushing to
main/masterbranches → blocked
Remaining warn / hint hooks verified via the dispatcher script against fixture payloads. SessionStart (project detection) and SubagentStart (rules injection) are unchanged and continue to work.