@infinitedusky/indusk-mcp 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,7 +23,10 @@ const GITIGNORE_ENTRIES = [
23
23
  { comment: "# Session-specific handoff (not project knowledge)", pattern: ".claude/handoff.md" },
24
24
  { comment: "# Semantic graph event log (large, local-only)", pattern: ".indusk/graph/" },
25
25
  { comment: "# Eval results (local-only)", pattern: ".indusk/eval/" },
26
- { comment: "# Extension manifests are package-owned; env files contain secrets", pattern: ".indusk/extensions/" },
26
+ {
27
+ comment: "# Extension manifests are package-owned; env files contain secrets",
28
+ pattern: ".indusk/extensions/",
29
+ },
27
30
  ];
28
31
  const GITIGNORE_MARKER = "# InDusk managed";
29
32
  export function ensureGitignore(projectRoot) {
@@ -36,12 +39,7 @@ export function ensureGitignore(projectRoot) {
36
39
  return;
37
40
  }
38
41
  // Build the block to append
39
- const block = [
40
- "",
41
- GITIGNORE_MARKER,
42
- ...missing.flatMap((e) => [e.comment, e.pattern]),
43
- "",
44
- ].join("\n");
42
+ const block = ["", GITIGNORE_MARKER, ...missing.flatMap((e) => [e.comment, e.pattern]), ""].join("\n");
45
43
  writeFileSync(gitignorePath, `${content.trimEnd()}${block}`);
46
44
  const verb = content.length > 0 ? "updated" : "created";
47
45
  console.info(` ${verb}: .gitignore (added ${missing.map((e) => e.pattern).join(", ")})`);
@@ -634,6 +632,10 @@ export async function init(projectRoot, options = {}) {
634
632
  matcher: "Edit|Write",
635
633
  hooks: [{ type: "command", command: "node .claude/hooks/gate-reminder.js" }],
636
634
  },
635
+ {
636
+ matcher: "Bash",
637
+ hooks: [{ type: "command", command: "node .claude/hooks/eval-trigger.js" }],
638
+ },
637
639
  ],
638
640
  };
639
641
  if (existsSync(claudeSettingsPath)) {
@@ -191,6 +191,7 @@ export async function update(projectRoot) {
191
191
  "gate-reminder.js",
192
192
  "validate-impl-structure.js",
193
193
  "check-catchup.js",
194
+ "eval-trigger.js",
194
195
  ];
195
196
  for (const file of hookFiles) {
196
197
  const sourceFile = join(hooksSource, file);
@@ -210,6 +211,32 @@ export async function update(projectRoot) {
210
211
  }
211
212
  }
212
213
  console.info(`\n ${hooksUpdated} updated, ${hooksCurrent} current.`);
214
+ // Ensure eval hook is registered in settings.json
215
+ const settingsPath = join(projectRoot, ".claude/settings.json");
216
+ if (existsSync(settingsPath)) {
217
+ try {
218
+ const settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
219
+ const postHooks = settings.hooks?.PostToolUse ?? [];
220
+ const hasBashEvalHook = postHooks.some((entry) => entry.matcher === "Bash" &&
221
+ entry.hooks?.some((h) => h.command?.includes("eval-trigger")));
222
+ if (!hasBashEvalHook) {
223
+ if (!settings.hooks)
224
+ settings.hooks = {};
225
+ if (!settings.hooks.PostToolUse)
226
+ settings.hooks.PostToolUse = [];
227
+ settings.hooks.PostToolUse.push({
228
+ matcher: "Bash",
229
+ hooks: [{ type: "command", command: "node .claude/hooks/eval-trigger.js" }],
230
+ });
231
+ const { writeFileSync } = await import("node:fs");
232
+ writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
233
+ console.info(" registered eval-trigger hook in settings.json");
234
+ }
235
+ }
236
+ catch {
237
+ console.info(" could not register eval hook in settings.json");
238
+ }
239
+ }
213
240
  }
214
241
  else {
215
242
  console.info(" not installed (run init to install)");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infinitedusky/indusk-mcp",
3
- "version": "1.11.1",
3
+ "version": "1.11.2",
4
4
  "description": "InDusk development system — skills, MCP tools, and CLI for structured AI-assisted development",
5
5
  "type": "module",
6
6
  "files": [