Sync marketplace Claude hook repair

Keep the committed marketplace repair script aligned with Claude Code's supported Edit and Write tools, and strengthen regression coverage after automated review.\n\nThis change was prepared with AI assistance under maintainer authorization.
This commit is contained in:
Paul Bakaus
2026-08-19 10:04:14 -07:00
parent 7d5c60d291
commit 611147a333
4 changed files with 13 additions and 3 deletions
+1 -1
View File
@@ -44,7 +44,7 @@ The first argument is the action. Defaults to `status`.
```
3. If `<action>` is `off`, follow up with a one-line note: "Done. New edits will not trigger the design hook in this project until you run `/impeccable hooks on`."
4. If `<action>` is `on`, follow up with: "Done. The design hook will fire after the next Edit/Write/MultiEdit on a UI file."
4. If `<action>` is `on`, follow up with: "Done. The design hook will fire after the next Edit/Write on a UI file."
5. If `<action>` is `ignore-value`, `ignore-file`, or `ignore-rule`, just print the script output. The default scope is shared `.impeccable/config.json`; add `--local` only when the user explicitly asks for a private exception.
6. If `<action>` is `status`, just print the script output. Do not add commentary unless the user asked a follow-up question.
@@ -75,11 +75,11 @@ const HOOK_MANIFEST_TARGETS = [
destRel: '.claude/settings.local.json',
sharedDestRel: '.claude/settings.json',
manifest: () => ({
description: 'Impeccable design detector: immediate-tier checks after Edit/Write/MultiEdit on UI files, full-rule deep pass on Stop.',
description: 'Impeccable design detector: immediate-tier checks after Edit/Write on UI files, full-rule deep pass on Stop.',
hooks: {
PostToolUse: [
{
matcher: 'Edit|Write|MultiEdit',
matcher: 'Edit|Write',
hooks: [
{
type: 'command',
+9
View File
@@ -376,6 +376,15 @@ describe('generated hook artifacts in repo', () => {
assert.ok(fs.existsSync(path.join(REPO_ROOT, 'plugin/skills/impeccable/scripts/hook-lib.mjs')));
});
it('keeps the marketplace hook repair matcher aligned with Claude Code', () => {
const hookAdmin = fs.readFileSync(
path.join(REPO_ROOT, 'plugin/skills/impeccable/scripts/hook-admin.mjs'),
'utf8',
);
assert.match(hookAdmin, /matcher: 'Edit\|Write'/);
assert.doesNotMatch(hookAdmin, /matcher: 'Edit\|Write\|MultiEdit'/);
});
it('generated hook runtime can import the bundled detector', async () => {
for (const scriptDir of [
'.claude/skills/impeccable/scripts',
+1
View File
@@ -950,6 +950,7 @@ describe('hook-admin.mjs', () => {
const claudeManifest = JSON.parse(claude);
const impeccableGroup = claudeManifest.hooks.PostToolUse.find((group) =>
group.hooks?.some((hook) => hook.command?.includes('skills/impeccable/scripts/hook.mjs')));
assert.ok(impeccableGroup, 'repaired Claude settings should contain the Impeccable PostToolUse group');
assert.equal(impeccableGroup.matcher, 'Edit|Write');
const codex = fs.readFileSync(path.join(cwd, '.codex', 'hooks.json'), 'utf-8');