From 404212b7f7d757a8267a1d446fbab0aa7d0b0b40 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:18:09 +0200 Subject: [PATCH 01/14] chore(global): plan to unblock user-defined validators Co-Authored-By: Claude Opus 4.7 (1M context) --- ketchup-plan.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ketchup-plan.md b/ketchup-plan.md index 13d23d6..630709c 100644 --- a/ketchup-plan.md +++ b/ketchup-plan.md @@ -1,8 +1,8 @@ -# Ketchup Plan: Fix release workflow after marketplace.json removal +# Ketchup Plan: Allow user-defined validators ## TODO -## DONE +- [ ] Burst 1: resolvePathsFromEnv returns protectedValidatorsDirs field [depends: none] +- [ ] Burst 2: handlePreToolUse uses protectedValidatorsDirs for immutability checks [depends: 1] -- [x] Burst 2: Remove legacy npm publish from release workflow, rewire tag/release/marketplace gates (a21da44) -- [x] Burst 1: Remove `marketplace.json` from version-bump loop in ci.yml (2e153e9) +## DONE From 77eca0875052019037452d384b74c2d0cef1efaa Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:18:09 +0200 Subject: [PATCH 02/14] chore(global): add changeset --- .changeset/auto-f5fb70c4c93d181a.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/auto-f5fb70c4c93d181a.md diff --git a/.changeset/auto-f5fb70c4c93d181a.md b/.changeset/auto-f5fb70c4c93d181a.md new file mode 100644 index 0000000..76d8568 --- /dev/null +++ b/.changeset/auto-f5fb70c4c93d181a.md @@ -0,0 +1,9 @@ +--- +"claude-auto": minor +--- + +- Migrated to plugin-only mode with native Claude Code plugin support via the BeOnAuto/auto-plugins marketplace, removing the legacy npx CLI installation +- Added a new config skill with runtime overrides for validators and reminders, plus first-setup guidance on initial plugin use +- Added support for user-defined custom validators and reminders with documentation in the README +- Fixed commit validation to respect the validateCommit.mode off setting, and resolved plugin path handling when only CLAUDE_PLUGIN_ROOT is set +- Updated all documentation and install instructions for plugin-only mode From 5e9d98fb0b315f8d754495359a6a94d3e52dd36e Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:24:19 +0200 Subject: [PATCH 03/14] feat(hooks): add protectedValidatorsDirs to ResolvedPaths Only the plugin's bundled validators dir is protected. Project-local .claude-auto/validators/ is intentionally excluded so users can author their own validators. Co-Authored-By: Claude Opus 4.7 (1M context) --- dist/bundle/scripts/auto-continue.js | 4 +++- dist/bundle/scripts/config.js | 4 +++- dist/bundle/scripts/pre-tool-use.js | 4 +++- dist/bundle/scripts/session-start.js | 4 +++- dist/bundle/scripts/user-prompt-submit.js | 4 +++- src/config-manager.test.ts | 1 + src/hooks/pre-tool-use.test.ts | 1 + src/hooks/session-start.test.ts | 1 + src/hooks/user-prompt-submit.test.ts | 1 + src/path-resolver.test.ts | 18 ++++++++++++++++++ src/path-resolver.ts | 6 +++++- src/plugin-debug.test.ts | 6 ++++++ 12 files changed, 48 insertions(+), 6 deletions(-) diff --git a/dist/bundle/scripts/auto-continue.js b/dist/bundle/scripts/auto-continue.js index 2e780bd..2c1664a 100755 --- a/dist/bundle/scripts/auto-continue.js +++ b/dist/bundle/scripts/auto-continue.js @@ -261,12 +261,14 @@ async function resolvePathsFromEnv(explicitPluginRoot) { const projectRoot = process.cwd(); const claudeDir = path4.join(projectRoot, ".claude"); const autoDir = path4.join(projectRoot, AUTO_DIR); + const pluginValidatorsDir = path4.join(pluginRoot, "validators"); return { projectRoot, claudeDir, autoDir, remindersDirs: [path4.join(pluginRoot, "reminders"), path4.join(autoDir, "reminders")], - validatorsDirs: [path4.join(pluginRoot, "validators"), path4.join(autoDir, "validators")] + validatorsDirs: [pluginValidatorsDir, path4.join(autoDir, "validators")], + protectedValidatorsDirs: [pluginValidatorsDir] }; } diff --git a/dist/bundle/scripts/config.js b/dist/bundle/scripts/config.js index 764a50e..9685a30 100755 --- a/dist/bundle/scripts/config.js +++ b/dist/bundle/scripts/config.js @@ -3815,12 +3815,14 @@ async function resolvePathsFromEnv(explicitPluginRoot) { const projectRoot = process.cwd(); const claudeDir = path3.join(projectRoot, ".claude"); const autoDir = path3.join(projectRoot, AUTO_DIR); + const pluginValidatorsDir = path3.join(pluginRoot, "validators"); return { projectRoot, claudeDir, autoDir, remindersDirs: [path3.join(pluginRoot, "reminders"), path3.join(autoDir, "reminders")], - validatorsDirs: [path3.join(pluginRoot, "validators"), path3.join(autoDir, "validators")] + validatorsDirs: [pluginValidatorsDir, path3.join(autoDir, "validators")], + protectedValidatorsDirs: [pluginValidatorsDir] }; } diff --git a/dist/bundle/scripts/pre-tool-use.js b/dist/bundle/scripts/pre-tool-use.js index 9022054..f706e15 100755 --- a/dist/bundle/scripts/pre-tool-use.js +++ b/dist/bundle/scripts/pre-tool-use.js @@ -6952,12 +6952,14 @@ async function resolvePathsFromEnv(explicitPluginRoot) { const projectRoot = process.cwd(); const claudeDir = path8.join(projectRoot, ".claude"); const autoDir = path8.join(projectRoot, AUTO_DIR); + const pluginValidatorsDir = path8.join(pluginRoot, "validators"); return { projectRoot, claudeDir, autoDir, remindersDirs: [path8.join(pluginRoot, "reminders"), path8.join(autoDir, "reminders")], - validatorsDirs: [path8.join(pluginRoot, "validators"), path8.join(autoDir, "validators")] + validatorsDirs: [pluginValidatorsDir, path8.join(autoDir, "validators")], + protectedValidatorsDirs: [pluginValidatorsDir] }; } diff --git a/dist/bundle/scripts/session-start.js b/dist/bundle/scripts/session-start.js index c8351ea..a532c08 100755 --- a/dist/bundle/scripts/session-start.js +++ b/dist/bundle/scripts/session-start.js @@ -3863,12 +3863,14 @@ async function resolvePathsFromEnv(explicitPluginRoot) { const projectRoot = process.cwd(); const claudeDir = path6.join(projectRoot, ".claude"); const autoDir = path6.join(projectRoot, AUTO_DIR); + const pluginValidatorsDir = path6.join(pluginRoot, "validators"); return { projectRoot, claudeDir, autoDir, remindersDirs: [path6.join(pluginRoot, "reminders"), path6.join(autoDir, "reminders")], - validatorsDirs: [path6.join(pluginRoot, "validators"), path6.join(autoDir, "validators")] + validatorsDirs: [pluginValidatorsDir, path6.join(autoDir, "validators")], + protectedValidatorsDirs: [pluginValidatorsDir] }; } diff --git a/dist/bundle/scripts/user-prompt-submit.js b/dist/bundle/scripts/user-prompt-submit.js index 2d8b2ad..bb5d6a3 100755 --- a/dist/bundle/scripts/user-prompt-submit.js +++ b/dist/bundle/scripts/user-prompt-submit.js @@ -3879,12 +3879,14 @@ async function resolvePathsFromEnv(explicitPluginRoot) { const projectRoot = process.cwd(); const claudeDir = path6.join(projectRoot, ".claude"); const autoDir = path6.join(projectRoot, AUTO_DIR); + const pluginValidatorsDir = path6.join(pluginRoot, "validators"); return { projectRoot, claudeDir, autoDir, remindersDirs: [path6.join(pluginRoot, "reminders"), path6.join(autoDir, "reminders")], - validatorsDirs: [path6.join(pluginRoot, "validators"), path6.join(autoDir, "validators")] + validatorsDirs: [pluginValidatorsDir, path6.join(autoDir, "validators")], + protectedValidatorsDirs: [pluginValidatorsDir] }; } diff --git a/src/config-manager.test.ts b/src/config-manager.test.ts index e24fd66..fea9197 100644 --- a/src/config-manager.test.ts +++ b/src/config-manager.test.ts @@ -42,6 +42,7 @@ describe('config-manager', () => { autoDir, validatorsDirs: [validatorsDir], remindersDirs: [remindersDir, projectRemindersDir], + protectedValidatorsDirs: [], }; fs.writeFileSync( diff --git a/src/hooks/pre-tool-use.test.ts b/src/hooks/pre-tool-use.test.ts index e7a5a4e..ffc4710 100644 --- a/src/hooks/pre-tool-use.test.ts +++ b/src/hooks/pre-tool-use.test.ts @@ -26,6 +26,7 @@ describe('pre-tool-use hook', () => { autoDir, remindersDirs: [path.join(autoDir, 'reminders')], validatorsDirs: [path.join(autoDir, 'validators')], + protectedValidatorsDirs: [], }; fs.mkdirSync(claudeDir, { recursive: true }); fs.mkdirSync(autoDir, { recursive: true }); diff --git a/src/hooks/session-start.test.ts b/src/hooks/session-start.test.ts index d66b882..6180d1d 100644 --- a/src/hooks/session-start.test.ts +++ b/src/hooks/session-start.test.ts @@ -29,6 +29,7 @@ describe('session-start hook', () => { autoDir, remindersDirs: [path.join(autoDir, 'reminders')], validatorsDirs: [path.join(autoDir, 'validators')], + protectedValidatorsDirs: [], }; fs.mkdirSync(claudeDir, { recursive: true }); fs.mkdirSync(autoDir, { recursive: true }); diff --git a/src/hooks/user-prompt-submit.test.ts b/src/hooks/user-prompt-submit.test.ts index 6b68487..5e12bf0 100644 --- a/src/hooks/user-prompt-submit.test.ts +++ b/src/hooks/user-prompt-submit.test.ts @@ -27,6 +27,7 @@ describe('user-prompt-submit hook', () => { autoDir, remindersDirs: [path.join(autoDir, 'reminders')], validatorsDirs: [path.join(autoDir, 'validators')], + protectedValidatorsDirs: [], }; fs.mkdirSync(claudeDir, { recursive: true }); fs.mkdirSync(autoDir, { recursive: true }); diff --git a/src/path-resolver.test.ts b/src/path-resolver.test.ts index 5acb61b..8ef5646 100644 --- a/src/path-resolver.test.ts +++ b/src/path-resolver.test.ts @@ -26,6 +26,7 @@ describe('resolvePathsFromEnv', () => { autoDir: path.join(process.cwd(), '.claude-auto'), validatorsDirs: ['/plugins/claude-auto/validators', path.join(process.cwd(), '.claude-auto', 'validators')], remindersDirs: ['/plugins/claude-auto/reminders', path.join(process.cwd(), '.claude-auto', 'reminders')], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], }); }); @@ -50,6 +51,7 @@ describe('resolvePathsFromEnv', () => { autoDir: path.join(process.cwd(), '.claude-auto'), validatorsDirs: ['/explicit/plugin-root/validators', path.join(process.cwd(), '.claude-auto', 'validators')], remindersDirs: ['/explicit/plugin-root/reminders', path.join(process.cwd(), '.claude-auto', 'reminders')], + protectedValidatorsDirs: ['/explicit/plugin-root/validators'], }); }); @@ -65,6 +67,7 @@ describe('resolvePathsFromEnv', () => { autoDir: path.join(process.cwd(), '.claude-auto'), validatorsDirs: ['/plugins/claude-auto/validators', path.join(process.cwd(), '.claude-auto', 'validators')], remindersDirs: ['/plugins/claude-auto/reminders', path.join(process.cwd(), '.claude-auto', 'reminders')], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], }); }); @@ -79,4 +82,19 @@ describe('resolvePathsFromEnv', () => { expect(result.validatorsDirs[0]).toBe('/plugins/claude-auto/validators'); expect(result.remindersDirs[0]).toBe('/plugins/claude-auto/reminders'); }); + + it('exposes protectedValidatorsDirs containing only the plugin validators dir', async () => { + vi.stubEnv('CLAUDE_PLUGIN_ROOT', '/plugins/claude-auto'); + + const result = await resolvePathsFromEnv(); + + expect(result).toEqual({ + projectRoot: process.cwd(), + claudeDir: path.join(process.cwd(), '.claude'), + autoDir: path.join(process.cwd(), '.claude-auto'), + validatorsDirs: ['/plugins/claude-auto/validators', path.join(process.cwd(), '.claude-auto', 'validators')], + remindersDirs: ['/plugins/claude-auto/reminders', path.join(process.cwd(), '.claude-auto', 'reminders')], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], + }); + }); }); diff --git a/src/path-resolver.ts b/src/path-resolver.ts index f40a9ab..8b274e1 100644 --- a/src/path-resolver.ts +++ b/src/path-resolver.ts @@ -8,6 +8,7 @@ export interface ResolvedPaths { autoDir: string; remindersDirs: string[]; validatorsDirs: string[]; + protectedValidatorsDirs: string[]; } export async function resolvePathsFromEnv(explicitPluginRoot?: string): Promise { @@ -21,11 +22,14 @@ export async function resolvePathsFromEnv(explicitPluginRoot?: string): Promise< const claudeDir = path.join(projectRoot, '.claude'); const autoDir = path.join(projectRoot, AUTO_DIR); + const pluginValidatorsDir = path.join(pluginRoot, 'validators'); + return { projectRoot, claudeDir, autoDir, remindersDirs: [path.join(pluginRoot, 'reminders'), path.join(autoDir, 'reminders')], - validatorsDirs: [path.join(pluginRoot, 'validators'), path.join(autoDir, 'validators')], + validatorsDirs: [pluginValidatorsDir, path.join(autoDir, 'validators')], + protectedValidatorsDirs: [pluginValidatorsDir], }; } diff --git a/src/plugin-debug.test.ts b/src/plugin-debug.test.ts index 38414e4..49755c4 100644 --- a/src/plugin-debug.test.ts +++ b/src/plugin-debug.test.ts @@ -28,6 +28,7 @@ describe('logPluginDiagnostics', () => { autoDir: nonExistentDir, validatorsDirs: ['/plugins/claude-auto/validators'], remindersDirs: ['/plugins/claude-auto/reminders'], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], }); expect(fs.existsSync(nonExistentDir)).toBe(false); @@ -44,6 +45,7 @@ describe('logPluginDiagnostics', () => { autoDir: tempDir, validatorsDirs: ['/plugins/claude-auto/validators'], remindersDirs: ['/plugins/claude-auto/reminders'], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], }); const logFile = path.join(tempDir, 'logs', 'plugin-debug.log'); @@ -64,6 +66,7 @@ describe('logPluginDiagnostics', () => { autoDir: tempDir, validatorsDirs: ['/project/.claude-auto/validators'], remindersDirs: ['/project/.claude-auto/reminders'], + protectedValidatorsDirs: [], }); const logFile = path.join(tempDir, 'logs', 'plugin-debug.log'); @@ -83,6 +86,7 @@ describe('logPluginDiagnostics', () => { autoDir: tempDir, validatorsDirs: ['/plugins/claude-auto/validators'], remindersDirs: ['/plugins/claude-auto/reminders'], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], }); expect(spy).toHaveBeenCalledOnce(); @@ -101,6 +105,7 @@ describe('logPluginDiagnostics', () => { autoDir: tempDir, validatorsDirs: ['/plugins/claude-auto/validators'], remindersDirs: ['/plugins/claude-auto/reminders'], + protectedValidatorsDirs: ['/plugins/claude-auto/validators'], }); expect(spy).not.toHaveBeenCalled(); @@ -119,6 +124,7 @@ describe('logPluginDiagnostics', () => { autoDir: tempDir, validatorsDirs: ['/project/.claude-auto/validators'], remindersDirs: ['/project/.claude-auto/reminders'], + protectedValidatorsDirs: [], }); expect(spy).not.toHaveBeenCalled(); From d09b61732fb37096582cabdb618ae35c3d6297e5 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:24:19 +0200 Subject: [PATCH 04/14] chore(global): add changeset --- .changeset/auto-0857fcdcbf3d9bd7.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/auto-0857fcdcbf3d9bd7.md diff --git a/.changeset/auto-0857fcdcbf3d9bd7.md b/.changeset/auto-0857fcdcbf3d9bd7.md new file mode 100644 index 0000000..2b9128c --- /dev/null +++ b/.changeset/auto-0857fcdcbf3d9bd7.md @@ -0,0 +1,5 @@ +--- +"claude-auto": minor +--- + +- Allowed users to author their own validators in project-local `.claude-auto/validators/` while keeping the plugin's bundled validators protected from modification From 4ac31ff9aa8e32931ea8388a4baf8d5e1bcab078 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:26:54 +0200 Subject: [PATCH 05/14] fix(hooks): scope validator protection to plugin dir only handlePreToolUse now checks protectedValidatorsDirs (plugin-only) instead of validatorsDirs, so users can freely create, edit, and delete their own validators in .claude-auto/validators/. The plugin's bundled validators remain immutable. Co-Authored-By: Claude Opus 4.7 (1M context) --- dist/bundle/scripts/pre-tool-use.js | 4 ++-- src/hooks/pre-tool-use.test.ts | 29 +++++++++++++++++++++++------ src/hooks/pre-tool-use.ts | 4 ++-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/dist/bundle/scripts/pre-tool-use.js b/dist/bundle/scripts/pre-tool-use.js index f706e15..7512801 100755 --- a/dist/bundle/scripts/pre-tool-use.js +++ b/dist/bundle/scripts/pre-tool-use.js @@ -6828,7 +6828,7 @@ async function handlePreToolUse(paths, sessionId, toolInput, options2 = {}) { return handleCommitValidation(paths, sessionId, command, options2, gitCwd); } if (command) { - const targetedPath = commandTargetsProtectedPath(command, paths.validatorsDirs); + const targetedPath = commandTargetsProtectedPath(command, paths.protectedValidatorsDirs); if (targetedPath) { activityLog(paths.autoDir, sessionId, "pre-tool-use", `blocked protected: ${targetedPath}`); debugLog(paths.autoDir, "pre-tool-use", `${targetedPath} blocked (immutable validator)`); @@ -6842,7 +6842,7 @@ async function handlePreToolUse(paths, sessionId, toolInput, options2 = {}) { } } const filePath = toolInput.file_path; - if (filePath && isProtectedPath(filePath, paths.validatorsDirs)) { + if (filePath && isProtectedPath(filePath, paths.protectedValidatorsDirs)) { activityLog(paths.autoDir, sessionId, "pre-tool-use", `blocked protected: ${filePath}`); debugLog(paths.autoDir, "pre-tool-use", `${filePath} blocked (immutable validator)`); return { diff --git a/src/hooks/pre-tool-use.test.ts b/src/hooks/pre-tool-use.test.ts index ffc4710..d751f2f 100644 --- a/src/hooks/pre-tool-use.test.ts +++ b/src/hooks/pre-tool-use.test.ts @@ -337,11 +337,13 @@ Validate this commit`, } }); - it('denies Bash command targeting validator files', async () => { - const validatorPath = path.join(autoDir, 'validators', 'burst-atomicity.md'); + it('denies Bash command targeting protected (plugin) validator files', async () => { + const pluginValidatorsDir = '/plugins/claude-auto/validators'; + const paths = { ...resolvedPaths, protectedValidatorsDirs: [pluginValidatorsDir] }; + const validatorPath = path.join(pluginValidatorsDir, 'burst-atomicity.md'); const toolInput = { command: `rm ${validatorPath}` }; - const result = await handlePreToolUse(resolvedPaths, 'session-bash-protect', toolInput); + const result = await handlePreToolUse(paths, 'session-bash-protect', toolInput); expect(result).toEqual({ hookSpecificOutput: { @@ -352,10 +354,12 @@ Validate this commit`, }); }); - it('denies Edit/Write to validator files', async () => { - const toolInput = { file_path: path.join(autoDir, 'validators', 'burst-atomicity.md') }; + it('denies Edit/Write to protected (plugin) validator files', async () => { + const pluginValidatorsDir = '/plugins/claude-auto/validators'; + const paths = { ...resolvedPaths, protectedValidatorsDirs: [pluginValidatorsDir] }; + const toolInput = { file_path: path.join(pluginValidatorsDir, 'burst-atomicity.md') }; - const result = await handlePreToolUse(resolvedPaths, 'session-protect', toolInput); + const result = await handlePreToolUse(paths, 'session-protect', toolInput); expect(result).toEqual({ hookSpecificOutput: { @@ -366,6 +370,19 @@ Validate this commit`, }); }); + it('allows Edit/Write to project-local validator files (not in protectedValidatorsDirs)', async () => { + const toolInput = { file_path: path.join(autoDir, 'validators', 'my-custom.md') }; + + const result = await handlePreToolUse(resolvedPaths, 'session-user-validator', toolInput); + + expect(result).toEqual({ + hookSpecificOutput: { + hookEventName: 'PreToolUse', + permissionDecision: 'allow', + }, + }); + }); + describe('isProtectedPath', () => { it('returns true for file inside a validatorsDirs path', () => { const validatorsDirs = ['/plugin/validators', '/project/.claude-auto/validators']; diff --git a/src/hooks/pre-tool-use.ts b/src/hooks/pre-tool-use.ts index 7434b68..af0b53e 100644 --- a/src/hooks/pre-tool-use.ts +++ b/src/hooks/pre-tool-use.ts @@ -71,7 +71,7 @@ export async function handlePreToolUse( } if (command) { - const targetedPath = commandTargetsProtectedPath(command, paths.validatorsDirs); + const targetedPath = commandTargetsProtectedPath(command, paths.protectedValidatorsDirs); if (targetedPath) { activityLog(paths.autoDir, sessionId, 'pre-tool-use', `blocked protected: ${targetedPath}`); debugLog(paths.autoDir, 'pre-tool-use', `${targetedPath} blocked (immutable validator)`); @@ -87,7 +87,7 @@ export async function handlePreToolUse( const filePath = toolInput.file_path as string; - if (filePath && isProtectedPath(filePath, paths.validatorsDirs)) { + if (filePath && isProtectedPath(filePath, paths.protectedValidatorsDirs)) { activityLog(paths.autoDir, sessionId, 'pre-tool-use', `blocked protected: ${filePath}`); debugLog(paths.autoDir, 'pre-tool-use', `${filePath} blocked (immutable validator)`); return { From fc427692edbac53a473c1e323b85184cb81f0774 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:26:54 +0200 Subject: [PATCH 06/14] chore(global): add changeset --- .changeset/auto-75b2174d24fca1c8.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/auto-75b2174d24fca1c8.md diff --git a/.changeset/auto-75b2174d24fca1c8.md b/.changeset/auto-75b2174d24fca1c8.md new file mode 100644 index 0000000..f3da33b --- /dev/null +++ b/.changeset/auto-75b2174d24fca1c8.md @@ -0,0 +1,6 @@ +--- +"claude-auto": patch +--- + +- Users can now freely create, edit, and delete their own validators in .claude-auto/validators/ +- Plugin's bundled validators remain protected from modification From 4da60df9b325088f54fa28437289a9189bda3e5d Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:29:04 +0200 Subject: [PATCH 07/14] chore(global): mark bursts 1 and 2 done in ketchup plan --- ketchup-plan.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ketchup-plan.md b/ketchup-plan.md index 630709c..480db81 100644 --- a/ketchup-plan.md +++ b/ketchup-plan.md @@ -2,7 +2,7 @@ ## TODO -- [ ] Burst 1: resolvePathsFromEnv returns protectedValidatorsDirs field [depends: none] -- [ ] Burst 2: handlePreToolUse uses protectedValidatorsDirs for immutability checks [depends: 1] - ## DONE + +- [x] Burst 1: resolvePathsFromEnv returns protectedValidatorsDirs field (5e9d98f) +- [x] Burst 2: handlePreToolUse uses protectedValidatorsDirs for immutability checks (4ac31ff) From 660ed280fa1e811b33141895a3b3afd5cd0c89ed Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:29:04 +0200 Subject: [PATCH 08/14] chore(global): add changeset --- .changeset/auto-c751f6f39b792521.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/auto-c751f6f39b792521.md diff --git a/.changeset/auto-c751f6f39b792521.md b/.changeset/auto-c751f6f39b792521.md new file mode 100644 index 0000000..56f43a0 --- /dev/null +++ b/.changeset/auto-c751f6f39b792521.md @@ -0,0 +1,5 @@ +--- +"claude-auto": patch +--- + +- Updated ketchup plan to reflect progress on completed bursts From 3bdc2330cb984dde6069b34ec4791898e988bdde Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:43:23 +0200 Subject: [PATCH 09/14] chore(global): plan docs fix for plugin-bundled validator path --- ketchup-plan.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ketchup-plan.md b/ketchup-plan.md index 480db81..d2d6bb2 100644 --- a/ketchup-plan.md +++ b/ketchup-plan.md @@ -2,6 +2,8 @@ ## TODO +- [ ] Burst 3: Fix configuration.md to show plugin-bundled validators and reminders live at $CLAUDE_PLUGIN_ROOT, not in .claude-auto/ [depends: none] + ## DONE - [x] Burst 1: resolvePathsFromEnv returns protectedValidatorsDirs field (5e9d98f) From 661473ce6bf44e02eea22232339f9c27bb15113f Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:43:23 +0200 Subject: [PATCH 10/14] chore(global): add changeset --- .changeset/auto-b542adb04892b93f.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/auto-b542adb04892b93f.md diff --git a/.changeset/auto-b542adb04892b93f.md b/.changeset/auto-b542adb04892b93f.md new file mode 100644 index 0000000..e0805b1 --- /dev/null +++ b/.changeset/auto-b542adb04892b93f.md @@ -0,0 +1,5 @@ +--- +"claude-auto": patch +--- + +- Planned documentation fix for plugin-bundled validator path From 050bcb9fd771e1c969fb97da6ef9072a5d2d30cd Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:44:36 +0200 Subject: [PATCH 11/14] docs(global): clarify plugin-bundled validators and reminders live at CLAUDE_PLUGIN_ROOT --- docs/configuration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 208b47c..a90f991 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -275,7 +275,7 @@ Reminders are Markdown files with YAML frontmatter that inject context into Clau ### Location -- Default reminders: `.claude-auto/reminders/` (provided by plugin) +- Default reminders: `$CLAUDE_PLUGIN_ROOT/reminders/` (bundled with the plugin, immutable) - Custom reminders: `.claude-auto/reminders/` (add your own `.md` files) ### Frontmatter Schema @@ -303,7 +303,7 @@ Validators are Markdown files with YAML frontmatter. ### Location -- Default validators: `.claude-auto/validators/` (provided by plugin) +- Default validators: `$CLAUDE_PLUGIN_ROOT/validators/` (bundled with the plugin, immutable) - Custom validators: `.claude-auto/validators/` (add your own `.md` files) ### Frontmatter Schema From 5c9ccfcf0b83621785729b4a8c3e3d937217cdf6 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:44:36 +0200 Subject: [PATCH 12/14] chore(global): add changeset --- .changeset/auto-5e224abf2b4cfe6a.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/auto-5e224abf2b4cfe6a.md diff --git a/.changeset/auto-5e224abf2b4cfe6a.md b/.changeset/auto-5e224abf2b4cfe6a.md new file mode 100644 index 0000000..28f7819 --- /dev/null +++ b/.changeset/auto-5e224abf2b4cfe6a.md @@ -0,0 +1,5 @@ +--- +"claude-auto": patch +--- + +- Clarified that plugin-bundled validators and reminders are loaded from the plugin root directory From 2e087824c1f590821f0badeef22db84292792526 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:45:40 +0200 Subject: [PATCH 13/14] chore(global): mark burst 3 done in ketchup plan --- ketchup-plan.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ketchup-plan.md b/ketchup-plan.md index d2d6bb2..10a2926 100644 --- a/ketchup-plan.md +++ b/ketchup-plan.md @@ -2,9 +2,8 @@ ## TODO -- [ ] Burst 3: Fix configuration.md to show plugin-bundled validators and reminders live at $CLAUDE_PLUGIN_ROOT, not in .claude-auto/ [depends: none] - ## DONE - [x] Burst 1: resolvePathsFromEnv returns protectedValidatorsDirs field (5e9d98f) - [x] Burst 2: handlePreToolUse uses protectedValidatorsDirs for immutability checks (4ac31ff) +- [x] Burst 3: Fix configuration.md to show plugin-bundled validators and reminders live at $CLAUDE_PLUGIN_ROOT, not in .claude-auto/ (050bcb9) From 223ea89dd1ca9bef3badf54922e3c753091c3379 Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 21 Apr 2026 10:45:40 +0200 Subject: [PATCH 14/14] chore(global): add changeset --- .changeset/auto-c7a8d52cb82473d2.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/auto-c7a8d52cb82473d2.md diff --git a/.changeset/auto-c7a8d52cb82473d2.md b/.changeset/auto-c7a8d52cb82473d2.md new file mode 100644 index 0000000..a8dbb1c --- /dev/null +++ b/.changeset/auto-c7a8d52cb82473d2.md @@ -0,0 +1,5 @@ +--- +"claude-auto": patch +--- + +- Updated internal ketchup plan to mark burst 3 as complete