Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
489ee43
chore(global): add ketchup plan for opt-in initialization
iksinski Apr 8, 2026
aaa8671
chore(global): add changeset
iksinski Apr 8, 2026
6fe15c2
test(hooks): createHookState does not create autoDir
iksinski Apr 8, 2026
6a4086c
chore(global): add changeset
iksinski Apr 8, 2026
7ee52cd
feat(hooks): read returns defaults when autoDir missing, remove first…
iksinski Apr 8, 2026
9199375
chore(global): add changeset
iksinski Apr 8, 2026
c70de21
feat(hooks): write and update are no-ops when autoDir missing
iksinski Apr 8, 2026
47836a2
chore(global): add changeset
iksinski Apr 8, 2026
e33d77f
feat(hooks): loggers are no-ops when autoDir does not exist
iksinski Apr 8, 2026
1c4c426
chore(global): add changeset
iksinski Apr 8, 2026
86fac7f
feat(hooks): opt-in initialization with INIT_HINT_MESSAGE, remove blo…
iksinski Apr 8, 2026
063feaf
chore(global): add changeset
iksinski Apr 8, 2026
62efee8
feat(hooks): pre-tool-use and auto-continue return early when autoDir…
iksinski Apr 8, 2026
e2de02c
chore(global): add changeset
iksinski Apr 8, 2026
43244eb
feat(core): add initClaudeAuto function with gitignore detection
iksinski Apr 8, 2026
9b4045c
chore(global): add changeset
iksinski Apr 8, 2026
844b3f8
feat(core): add formatInitResult for human-readable init output
iksinski Apr 8, 2026
d65fcc9
chore(global): add changeset
iksinski Apr 8, 2026
7526a57
feat(skills): add /claude-auto init skill with entry point and esbuil…
iksinski Apr 8, 2026
f09f840
chore(global): add changeset
iksinski Apr 8, 2026
d665fe2
refactor(hooks): remove dead firstSetupRequired field from HookState …
iksinski Apr 8, 2026
178f4e7
chore(global): add changeset
iksinski Apr 8, 2026
a60624c
chore(global): update ketchup plan with completed bursts
iksinski Apr 8, 2026
5f031cd
chore(global): add changeset
iksinski Apr 8, 2026
d6c9234
fix(hooks): make INIT_HINT_MESSAGE a directive so Claude relays it to…
iksinski Apr 8, 2026
ee127a5
chore(global): add changeset
iksinski Apr 8, 2026
a23acfc
refactor(skills): rename skills to claude-auto-init and claude-auto-c…
iksinski Apr 8, 2026
0ea9dc9
chore(global): add changeset
iksinski Apr 8, 2026
620ff91
docs(docs): update all docs for opt-in model and skill renames
iksinski Apr 8, 2026
7e871b2
chore(global): add changeset
iksinski Apr 8, 2026
2d2124f
feat(core): prompt user to configure after init
iksinski Apr 8, 2026
a9730a1
chore(global): add changeset
iksinski Apr 8, 2026
bb8c4c6
chore(global): plan non-interrupting init message burst
iksinski Apr 13, 2026
463045b
chore(global): add changeset
iksinski Apr 13, 2026
213f93d
feat(core): use emojis and drop interrupt directive in init output
iksinski Apr 13, 2026
1c9d4c6
chore(global): add changeset
iksinski Apr 13, 2026
9e59216
chore(global): plan emoji-decorated init hint burst
iksinski Apr 13, 2026
15f0658
chore(global): add changeset
iksinski Apr 13, 2026
1d787f9
feat(hooks): add emojis to init hint message for visibility
iksinski Apr 13, 2026
f229612
chore(global): add changeset
iksinski Apr 13, 2026
ea9e3a3
chore(global): plan INIT_HINT_MESSAGE simplification burst
iksinski Apr 17, 2026
140973a
chore(global): add changeset
iksinski Apr 17, 2026
8783851
refactor(hooks): simplify INIT_HINT_MESSAGE to plain one-line reminder
iksinski Apr 17, 2026
dfc529b
chore(global): add changeset
iksinski Apr 17, 2026
e1ce477
chore(global): mark burst 7.1 done in ketchup plan
iksinski Apr 17, 2026
b9c18b5
chore(global): add changeset
iksinski Apr 17, 2026
b702e50
chore(global): plan skill-name fix burst
iksinski Apr 17, 2026
11db23d
chore(global): add changeset
iksinski Apr 17, 2026
0832f02
fix(hooks): correct skill name to /claude-auto-init in INIT_HINT_MESSAGE
iksinski Apr 17, 2026
d56112b
chore(global): add changeset
iksinski Apr 17, 2026
53ee549
chore(global): mark burst 7.2 done in ketchup plan
iksinski Apr 17, 2026
009ebf8
chore(global): add changeset
iksinski Apr 17, 2026
7432e84
chore(global): plan directive-wrap burst for INIT_HINT_MESSAGE
iksinski Apr 17, 2026
f4c1e0a
chore(global): add changeset
iksinski Apr 17, 2026
f388145
fix(hooks): wrap INIT_HINT_MESSAGE in directive so Claude surfaces it
iksinski Apr 17, 2026
54ed2fa
chore(global): add changeset
iksinski Apr 17, 2026
676db7c
chore(global): mark burst 7.3 done in ketchup plan
iksinski Apr 17, 2026
dd65517
chore(global): add changeset
iksinski Apr 17, 2026
26c7b4c
chore(global): plan directive-wrap burst for init config tip
iksinski Apr 17, 2026
0f6a987
chore(global): add changeset
iksinski Apr 17, 2026
45f3a8a
fix(core): wrap init config tip in directive so Claude surfaces it
iksinski Apr 17, 2026
5a1791c
chore(global): add changeset
iksinski Apr 17, 2026
db4c099
chore(global): mark burst 7.4 done in ketchup plan
iksinski Apr 17, 2026
1409a21
chore(global): add changeset
iksinski Apr 17, 2026
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
5 changes: 5 additions & 0 deletions .changeset/auto-00d8d1c8b7d4b9d5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Removed unused firstSetupRequired field from hook state, simplifying the configuration interface
5 changes: 5 additions & 0 deletions .changeset/auto-03859f8c212486b9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Planned upcoming work to wrap the init hint message as a directive
5 changes: 5 additions & 0 deletions .changeset/auto-07d0cbbbc5cd960b.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Simplified the initialization hint message to a plain one-line reminder for clearer, less intrusive guidance
5 changes: 5 additions & 0 deletions .changeset/auto-0aeb92648e0f883a.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Planned upcoming fix for skill-name handling
5 changes: 5 additions & 0 deletions .changeset/auto-103b214fd7e5f524.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Fixed init hint message not appearing in sessions by ensuring Claude surfaces it to the user
5 changes: 5 additions & 0 deletions .changeset/auto-114006803163210a.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Updated internal planning documentation to reflect completed work
5 changes: 5 additions & 0 deletions .changeset/auto-13e2896eba0dd5dc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Renamed skills to use consistent `/claude-auto-*` naming pattern (claude-auto-init and claude-auto-config)
6 changes: 6 additions & 0 deletions .changeset/auto-18be352e0fd346e0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"claude-auto": minor
---

- Added `/claude-auto init` skill that sets up claude-auto in a project with a guided initialization flow
- Included esbuild bundling configuration for the new init skill entry point
5 changes: 5 additions & 0 deletions .changeset/auto-2eda8b072fdf990a.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": minor
---

- Loggers become silent no-ops when the auto directory does not exist, preventing errors in unconfigured environments
9 changes: 9 additions & 0 deletions .changeset/auto-527d22f7c1158c63.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"claude-auto": minor
---

- Switched to plugin-only mode, removing the legacy npx/CLI installation system entirely
- Added plugin marketplace support for easier installation via Claude Code's plugin system
- Added runtime configuration skill for managing validators and reminders with overrides
- Fixed path resolution and commit validation settings when running as a plugin
- Rewrote all documentation for the new plugin-only workflow
6 changes: 6 additions & 0 deletions .changeset/auto-5a4164dedf5b798c.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"claude-auto": minor
---

- Refreshed init output with emojis for better readability
- Removed interrupt directive from init messaging
5 changes: 5 additions & 0 deletions .changeset/auto-5c66880199819e15.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Updated internal ketchup plan to reflect completed burst 7.4
5 changes: 5 additions & 0 deletions .changeset/auto-608cf294b022200a.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Planned simplification of the session-start init hint message
5 changes: 5 additions & 0 deletions .changeset/auto-6cd909f9c1020e67.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Improved hook state initialization to avoid creating unnecessary directories
5 changes: 5 additions & 0 deletions .changeset/auto-72b5e9ed34f04950.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Marked burst 7.1 as complete in the ketchup plan
5 changes: 5 additions & 0 deletions .changeset/auto-76da04a23593ce0e.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Updated internal planning notes to reflect completed work
5 changes: 5 additions & 0 deletions .changeset/auto-7ee4b538ca7b1e61.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Fixed incorrect skill name in initialization hint so users see the correct `/claude-auto-init` command
6 changes: 6 additions & 0 deletions .changeset/auto-8a3650020678282b.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"claude-auto": minor
---

- Added `initClaudeAuto` function that sets up the `.claude-auto` directory with default configuration
- Automatically detects and updates `.gitignore` to exclude generated files
5 changes: 5 additions & 0 deletions .changeset/auto-8abcc38b44c748f9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Changed the initialization hint message to be a directive, so Claude now actively mentions the hint to the user in its first response instead of silently absorbing it
5 changes: 5 additions & 0 deletions .changeset/auto-8d572fc9287f961a.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": minor
---

- Pre-tool-use and auto-continue hooks now return early when the auto directory is missing, avoiding errors in unconfigured projects
8 changes: 8 additions & 0 deletions .changeset/auto-9f0c051f2b2f0c71.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"claude-auto": patch
---

- Updated all documentation to reflect the new opt-in activation model and renamed skills
- Renamed `/claude-auto:config` to `/claude-auto-config` across all docs
- Added references to `/claude-auto-init` for opt-in repository activation
- Updated installation and getting-started guides to reflect the new plugin workflow
5 changes: 5 additions & 0 deletions .changeset/auto-a276c3aa9bb22e96.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Planned upcoming improvement to wrap the init configuration tip in a directive for better visibility
5 changes: 5 additions & 0 deletions .changeset/auto-a569e12b1fcfbf53.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Fixed init config tip so Claude reliably surfaces it to users
5 changes: 5 additions & 0 deletions .changeset/auto-b5b2b91dae49881e.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Updated ketchup plan to reflect completed bursts
6 changes: 6 additions & 0 deletions .changeset/auto-c36b4f31bff1dd98.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"claude-auto": minor
---

- Simplified initial setup by removing the first-setup-required flag
- Hook state now returns sensible defaults when the auto directory doesn't exist yet, preventing errors on fresh installations
5 changes: 5 additions & 0 deletions .changeset/auto-cc43d2e6e4f7dee7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Planned non-interrupting init message burst
5 changes: 5 additions & 0 deletions .changeset/auto-d2443bac99df8c22.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": patch
---

- Planned emoji-decorated styling for the initialization hint message
5 changes: 5 additions & 0 deletions .changeset/auto-da5d347ee9523406.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": minor
---

- Added a prompt after initialization that asks users if they want to review or customize their configuration
5 changes: 5 additions & 0 deletions .changeset/auto-de781e018e6b3e35.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": minor
---

- Added emojis to the initialization hint message for better visibility
5 changes: 5 additions & 0 deletions .changeset/auto-ecd9b8349c13aa41.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": minor
---

- Added human-readable formatting for init command output
6 changes: 6 additions & 0 deletions .changeset/auto-ed0bb5e5f8ebb378.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"claude-auto": minor
---

- Replaced blocking first-setup flow with a non-blocking hint message shown on session start when the project is not yet initialized
- Hooks now silently return early in uninitialized repos instead of interrupting the user
5 changes: 5 additions & 0 deletions .changeset/auto-f0f2f04512b4ac0b.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"claude-auto": minor
---

- Write and update operations now silently skip when the auto directory is missing, preventing errors in unconfigured projects
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ Both are markdown files with YAML frontmatter. Validators gate commits (ACK/NACK

### Installation Model

Claude Auto runs as a Claude Code plugin. Install via `/plugin marketplace add BeOnAuto/auto-plugins` or `claude --plugin-dir /path/to/claude-auto`. The plugin provides validators, reminders, and hook scripts. Projects can add local overrides in `.claude-auto/`.
Claude Auto runs as a Claude Code plugin. Install via `/plugin marketplace add BeOnAuto/auto-plugins` or `claude --plugin-dir /path/to/claude-auto`. The plugin is opt-in per repository: hooks are inactive until the user runs `/claude-auto-init`, which creates `.claude-auto/` with default config. Without initialization, session-start shows a non-blocking hint. The plugin provides validators, reminders, and hook scripts. Projects can add local overrides in `.claude-auto/`.

## Coding Patterns

Expand Down
20 changes: 11 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Inside any Claude Code session:
claude --plugin-dir /path/to/claude-auto
```

Claude Code sets `CLAUDE_PLUGIN_ROOT` and `CLAUDE_PLUGIN_DATA` automatically. Validators and reminders load from the plugin package, with optional project-local overrides from `.claude-auto/`. State and logs go to the project's `.claude-auto/` directory.
Claude Code sets `CLAUDE_PLUGIN_ROOT` and `CLAUDE_PLUGIN_DATA` automatically. Run `/claude-auto-init` inside a session to activate per-project configuration, validators, and logging.

## Quick Start

Expand All @@ -53,11 +53,13 @@ Claude Code sets `CLAUDE_PLUGIN_ROOT` and `CLAUDE_PLUGIN_DATA` automatically. Va
claude --plugin-dir /path/to/claude-auto
```

After installation, Claude Auto automatically:
After installation, Claude will mention that claude-auto is available. To activate it in a project:

- Injects hooks that validate every commit against your criteria
- Creates reminders that inject your guidelines into prompts
- Sets up file protection via deny-lists
```
/claude-auto-init
```

This creates `.claude-auto/` with default configuration. You can add it to `.gitignore` for personal use, or commit it for the whole team.

**Next steps:**

Expand Down Expand Up @@ -121,10 +123,10 @@ Higher `priority` = appears first. Project-local files are loaded alongside plug
Toggle validators and reminders without editing files:

```bash
/claude-auto:config show
/claude-auto:config validators disable no-comments
/claude-auto:config reminders priority my-reminder 200
/claude-auto:config reminders add my-rule --hook UserPromptSubmit --priority 50 --content "Always use early returns"
/claude-auto-config show
/claude-auto-config validators disable no-comments
/claude-auto-config reminders priority my-reminder 200
/claude-auto-config reminders add my-rule --hook UserPromptSubmit --priority 50 --content "Always use early returns"
```

---
Expand Down
36 changes: 27 additions & 9 deletions dist/bundle/scripts/auto-continue.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ function matchesFilter(hookName, message) {
return includes.some((pattern) => searchText.includes(pattern));
}
function activityLog(autoDir, sessionId, hookName, message) {
if (!import_node_fs.default.existsSync(autoDir)) {
return;
}
if (!matchesFilter(hookName, message)) {
return;
}
Expand Down Expand Up @@ -76,6 +79,9 @@ function sanitizeForFilename(hookName) {
return hookName.replace(/[^a-zA-Z0-9-]/g, "-").toLowerCase();
}
function writeHookLog(autoDir, entry) {
if (!fs2.existsSync(autoDir)) {
return;
}
const logsDir = path2.join(autoDir, "logs", "hooks");
if (!fs2.existsSync(logsDir)) {
fs2.mkdirSync(logsDir, { recursive: true });
Expand Down Expand Up @@ -125,6 +131,9 @@ function writeHookLog(autoDir, entry) {
`);
}

// src/hooks/auto-continue.ts
var import_node_fs2 = require("node:fs");

// src/hook-state.ts
var fs3 = __toESM(require("node:fs"));
var path3 = __toESM(require("node:path"));
Expand Down Expand Up @@ -156,22 +165,20 @@ var DEFAULT_HOOK_STATE = {
}
};
function createHookState(autoDir) {
if (!fs3.existsSync(autoDir)) {
fs3.mkdirSync(autoDir, { recursive: true });
}
const stateFile = path3.join(autoDir, ".claude.hooks.json");
function read() {
if (!fs3.existsSync(autoDir)) {
return { ...DEFAULT_HOOK_STATE };
}
if (!fs3.existsSync(stateFile)) {
const isPluginMode = !!process.env.CLAUDE_PLUGIN_ROOT;
const initialState = isPluginMode ? { ...DEFAULT_HOOK_STATE, firstSetupRequired: true } : { ...DEFAULT_HOOK_STATE };
const initialState = { ...DEFAULT_HOOK_STATE };
fs3.writeFileSync(stateFile, `${JSON.stringify(initialState, null, 2)}
`);
return JSON.parse(JSON.stringify(initialState));
}
const content = fs3.readFileSync(stateFile, "utf-8");
const partial = JSON.parse(content);
return {
...partial.firstSetupRequired !== void 0 ? { firstSetupRequired: partial.firstSetupRequired } : {},
autoContinue: { ...DEFAULT_HOOK_STATE.autoContinue, ...partial.autoContinue },
validateCommit: { ...DEFAULT_HOOK_STATE.validateCommit, ...partial.validateCommit },
denyList: { ...DEFAULT_HOOK_STATE.denyList, ...partial.denyList },
Expand All @@ -184,10 +191,16 @@ function createHookState(autoDir) {
};
}
function write(state) {
if (!fs3.existsSync(autoDir)) {
return;
}
fs3.writeFileSync(stateFile, `${JSON.stringify(state, null, 2)}
`);
}
function update(updates) {
if (!fs3.existsSync(autoDir)) {
return { ...DEFAULT_HOOK_STATE };
}
const current = read();
const newState = {
...current,
Expand Down Expand Up @@ -218,6 +231,9 @@ function createHookState(autoDir) {

// src/hooks/auto-continue.ts
function handleStop(autoDir, input2) {
if (!(0, import_node_fs2.existsSync)(autoDir)) {
return { decision: "allow", reason: "auto-continue disabled" };
}
const stateManager = createHookState(autoDir);
const state = stateManager.read();
const { mode, skipModes } = state.autoContinue;
Expand Down Expand Up @@ -279,9 +295,11 @@ function logPluginDiagnostics(hookName, paths) {
if (isDebug) {
console.error(message);
}
const logsDir = path5.join(paths.autoDir, "logs");
fs4.mkdirSync(logsDir, { recursive: true });
fs4.appendFileSync(path5.join(logsDir, "plugin-debug.log"), message);
if (fs4.existsSync(paths.autoDir)) {
const logsDir = path5.join(paths.autoDir, "logs");
fs4.mkdirSync(logsDir, { recursive: true });
fs4.appendFileSync(path5.join(logsDir, "plugin-debug.log"), message);
}
}

// scripts/auto-continue.ts
Expand Down
Loading
Loading