@infinitedusky/indusk-mcp 0.7.0 → 0.7.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.
@@ -295,7 +295,7 @@ export async function init(projectRoot, options = {}) {
295
295
  console.info("\n[Hooks]");
296
296
  const hooksSource = join(packageRoot, "hooks");
297
297
  const hooksTarget = join(projectRoot, ".claude/hooks");
298
- const hookFiles = ["check-gates.js", "gate-reminder.js"];
298
+ const hookFiles = ["check-gates.js", "gate-reminder.js", "validate-impl-structure.js"];
299
299
  if (existsSync(hooksSource)) {
300
300
  mkdirSync(hooksTarget, { recursive: true });
301
301
  for (const file of hookFiles) {
@@ -318,7 +318,10 @@ export async function init(projectRoot, options = {}) {
318
318
  PreToolUse: [
319
319
  {
320
320
  matcher: "Edit|Write",
321
- hooks: [{ type: "command", command: "node .claude/hooks/check-gates.js" }],
321
+ hooks: [
322
+ { type: "command", command: "node .claude/hooks/check-gates.js" },
323
+ { type: "command", command: "node .claude/hooks/validate-impl-structure.js" },
324
+ ],
322
325
  },
323
326
  ],
324
327
  PostToolUse: [
@@ -335,11 +338,15 @@ export async function init(projectRoot, options = {}) {
335
338
  for (const [event, entries] of Object.entries(hookConfig)) {
336
339
  const existingEntries = existing.hooks[event] || [];
337
340
  // Check if our hook is already present
338
- const hasOurHook = existingEntries.some((e) => e.hooks?.some((h) => h.command?.includes("check-gates") || h.command?.includes("gate-reminder")));
341
+ const hasOurHook = existingEntries.some((e) => e.hooks?.some((h) => h.command?.includes("check-gates") ||
342
+ h.command?.includes("gate-reminder") ||
343
+ h.command?.includes("validate-impl")));
339
344
  if (!hasOurHook || force) {
340
345
  // Remove old entries if force, then add
341
346
  if (force) {
342
- existing.hooks[event] = existingEntries.filter((e) => !e.hooks?.some((h) => h.command?.includes("check-gates") || h.command?.includes("gate-reminder")));
347
+ existing.hooks[event] = existingEntries.filter((e) => !e.hooks?.some((h) => h.command?.includes("check-gates") ||
348
+ h.command?.includes("gate-reminder") ||
349
+ h.command?.includes("validate-impl")));
343
350
  }
344
351
  existing.hooks[event] = [...(existing.hooks[event] || []), ...entries];
345
352
  hooksUpdated = true;
@@ -114,7 +114,7 @@ export async function update(projectRoot) {
114
114
  let hooksUpdated = 0;
115
115
  let hooksCurrent = 0;
116
116
  if (existsSync(hooksSource) && existsSync(hooksTarget)) {
117
- const hookFiles = ["check-gates.js", "gate-reminder.js"];
117
+ const hookFiles = ["check-gates.js", "gate-reminder.js", "validate-impl-structure.js"];
118
118
  for (const file of hookFiles) {
119
119
  const sourceFile = join(hooksSource, file);
120
120
  const targetFile = join(hooksTarget, file);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infinitedusky/indusk-mcp",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "InDusk development system — skills, MCP tools, and CLI for structured AI-assisted development",
5
5
  "type": "module",
6
6
  "files": [
@@ -70,9 +70,9 @@ The `decisions/` and `lessons/` directories are **not** populated during normal
70
70
 
71
71
  - **One concept per diagram.** Don't cram the entire system into one chart. Break complex systems into focused diagrams.
72
72
  - **Meaningful labels.** Use full words, not abbreviations. `Plan Skill` not `PS`.
73
- - **Use `classDef` for visual grouping.** Color-code related nodes to show categories at a glance.
74
- - **Dark-mode friendly.** Avoid hardcoded light colors (white, light gray). Use the mermaid `dark` theme (already configured in VitePress). If you must customize colors, use high-contrast pairs.
73
+ - **Do not use custom `style`, `classDef`, or `themeVariables` in diagrams.** The docs site supports both light and dark mode. The vitepress-plugin-mermaid auto-switches between Mermaid's `default` (light) and `dark` themes. Hardcoded colors (fills, text colors, borders) that work in one mode will be unreadable in the other. Let the built-in theme handle all colors. If you need visual grouping, use `subgraph` blocks instead of color-coding.
75
74
  - **Keep diagrams small enough to read inline** but detailed enough to be useful when expanded.
75
+ - **Mermaid `securityLevel` must be `"strict"`.** Using `"loose"` causes Mermaid to scan the entire page DOM for diagram content, which produces "Syntax error in text" errors in the footer of every page. Always use `"strict"` in the VitePress mermaid config.
76
76
 
77
77
  ### Always Use FullscreenDiagram
78
78
 
@@ -16,6 +16,9 @@ You are working with a VitePress documentation site. Follow these patterns.
16
16
  - Keep diagrams focused — one concept per diagram
17
17
  - Use `flowchart TD` for top-down flows, `flowchart LR` for left-right
18
18
  - Use `classDiagram` for type relationships, `sequenceDiagram` for interactions
19
+ - **Set `securityLevel: "strict"` in the mermaid config.** Using `"loose"` causes Mermaid v10+ to scan the entire page DOM, producing "Syntax error in text" errors on every page.
20
+ - **Do not use `style`, `classDef`, or `themeVariables` with hardcoded colors.** The `vitepress-plugin-mermaid` auto-switches between `default` (light) and `dark` themes. Hardcoded colors break in the opposite mode. Use `subgraph` for visual grouping instead.
21
+ - **Set `theme: "default"` in the mermaid config.** The plugin overrides to `"dark"` automatically when VitePress dark mode is active. Do not set `theme: "dark"` or `theme: "base"` — they interfere with the auto-switching.
19
22
 
20
23
  ## Sidebar & Navigation
21
24