mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-18 10:52:24 +02:00
fix(settings): include command in add-event dedup key (#2382)
Fixes #2382. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
2be9bd0660
commit
1dbed2c01f
@@ -171,8 +171,9 @@ case "$ACTION" in
|
|||||||
|
|
||||||
const matchesEntry = (entry) => {
|
const matchesEntry = (entry) => {
|
||||||
const sameMatcher = (entry.matcher || "") === matcher;
|
const sameMatcher = (entry.matcher || "") === matcher;
|
||||||
|
const sameCommand = entry.hooks && entry.hooks[0] && entry.hooks[0].command === cmd;
|
||||||
const sameSource = entry._gstack_source === source;
|
const sameSource = entry._gstack_source === source;
|
||||||
return sameMatcher && sameSource;
|
return sameMatcher && (sameSource || sameCommand);
|
||||||
};
|
};
|
||||||
|
|
||||||
let existing = settings.hooks[event].find(matchesEntry);
|
let existing = settings.hooks[event].find(matchesEntry);
|
||||||
@@ -184,6 +185,7 @@ case "$ACTION" in
|
|||||||
|
|
||||||
if (existing) {
|
if (existing) {
|
||||||
existing.hooks = [hookEntry];
|
existing.hooks = [hookEntry];
|
||||||
|
existing._gstack_source = source;
|
||||||
} else {
|
} else {
|
||||||
const newEntry = { _gstack_source: source, hooks: [hookEntry] };
|
const newEntry = { _gstack_source: source, hooks: [hookEntry] };
|
||||||
if (matcher) newEntry.matcher = matcher;
|
if (matcher) newEntry.matcher = matcher;
|
||||||
|
|||||||
@@ -111,6 +111,55 @@ describe('add-event', () => {
|
|||||||
expect(s.hooks.PreToolUse[0].hooks[0].command).toBe('/v2');
|
expect(s.hooks.PreToolUse[0].hooks[0].command).toBe('/v2');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('dedup includes command: same (event, matcher, command) with different source updates in place', () => {
|
||||||
|
run([
|
||||||
|
'add-event',
|
||||||
|
'--event', 'PostToolUse',
|
||||||
|
'--matcher', '(AskUserQuestion|mcp__.*__AskUserQuestion)',
|
||||||
|
'--command', '/abs/path/to/question-log-hook',
|
||||||
|
'--source', 'source-A',
|
||||||
|
'--timeout', '5',
|
||||||
|
]);
|
||||||
|
run([
|
||||||
|
'add-event',
|
||||||
|
'--event', 'PostToolUse',
|
||||||
|
'--matcher', '(AskUserQuestion|mcp__.*__AskUserQuestion)',
|
||||||
|
'--command', '/abs/path/to/question-log-hook',
|
||||||
|
'--source', 'source-B',
|
||||||
|
'--timeout', '5',
|
||||||
|
]);
|
||||||
|
const s = settings();
|
||||||
|
expect(s.hooks.PostToolUse).toHaveLength(1);
|
||||||
|
expect(s.hooks.PostToolUse[0]._gstack_source).toBe('source-B');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('dedup includes command: untagged entry with same command is updated not duplicated', () => {
|
||||||
|
fs.writeFileSync(
|
||||||
|
settingsFile,
|
||||||
|
JSON.stringify({
|
||||||
|
hooks: {
|
||||||
|
PostToolUse: [
|
||||||
|
{
|
||||||
|
matcher: '(AskUserQuestion|mcp__.*__AskUserQuestion)',
|
||||||
|
hooks: [{ type: 'command', command: '/abs/path/to/question-log-hook', timeout: 5 }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}, null, 2),
|
||||||
|
);
|
||||||
|
run([
|
||||||
|
'add-event',
|
||||||
|
'--event', 'PostToolUse',
|
||||||
|
'--matcher', '(AskUserQuestion|mcp__.*__AskUserQuestion)',
|
||||||
|
'--command', '/abs/path/to/question-log-hook',
|
||||||
|
'--source', 'plan-tune-cathedral',
|
||||||
|
'--timeout', '5',
|
||||||
|
]);
|
||||||
|
const s = settings();
|
||||||
|
expect(s.hooks.PostToolUse).toHaveLength(1);
|
||||||
|
expect(s.hooks.PostToolUse[0]._gstack_source).toBe('plan-tune-cathedral');
|
||||||
|
});
|
||||||
|
|
||||||
test('preserves unrelated existing hooks', () => {
|
test('preserves unrelated existing hooks', () => {
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
settingsFile,
|
settingsFile,
|
||||||
|
|||||||
Reference in New Issue
Block a user