diff --git a/modules/programs/claude-code.nix b/modules/programs/claude-code.nix index 16387e67..49d2940a 100644 --- a/modules/programs/claude-code.nix +++ b/modules/programs/claude-code.nix @@ -293,6 +293,29 @@ in example = lib.literalExpression "./hooks"; }; + outputStyles = lib.mkOption { + type = lib.types.attrsOf (lib.types.either lib.types.lines lib.types.path); + default = { }; + description = '' + Custom output styles for Claude Code. + The attribute name becomes the base of the output style filename. + The value is either: + - Inline content as a string + - A path to a file + In both cases, the contents will be written to .claude/output-styles/.md + ''; + example = lib.literalExpression '' + { + concise = ./output-styles/concise.md; + detailed = ''' + # Detailed Output Style + + Contents will be used verbatim for the detailed output format. + '''; + } + ''; + }; + skills = lib.mkOption { type = lib.types.attrsOf (lib.types.either lib.types.lines lib.types.path); default = { }; @@ -520,7 +543,13 @@ in lib.nameValuePair ".claude/skills/${name}/SKILL.md" ( if lib.isPath content then { source = content; } else { text = content; } ) - ) cfg.skills; + ) cfg.skills + // lib.mapAttrs' ( + name: content: + lib.nameValuePair ".claude/output-styles/${name}.md" ( + if lib.isPath content then { source = content; } else { text = content; } + ) + ) cfg.outputStyles; }; }; } diff --git a/tests/modules/programs/claude-code/default.nix b/tests/modules/programs/claude-code/default.nix index a93d6f93..7f2828d2 100644 --- a/tests/modules/programs/claude-code/default.nix +++ b/tests/modules/programs/claude-code/default.nix @@ -17,4 +17,6 @@ claude-code-commands-path = ./commands-path.nix; claude-code-skills-path = ./skills-path.nix; claude-code-mixed-content = ./mixed-content.nix; + claude-code-output-styles = ./output-styles.nix; + claude-code-output-styles-not-set = ./output-styles-not-set.nix; } diff --git a/tests/modules/programs/claude-code/output-styles-not-set.nix b/tests/modules/programs/claude-code/output-styles-not-set.nix new file mode 100644 index 00000000..4d3199eb --- /dev/null +++ b/tests/modules/programs/claude-code/output-styles-not-set.nix @@ -0,0 +1,12 @@ +{ + programs.claude-code = { + enable = true; + settings = { + theme = "dark"; + }; + }; + + nmt.script = '' + assertPathNotExists home-files/.claude/output-styles + ''; +} diff --git a/tests/modules/programs/claude-code/output-styles.nix b/tests/modules/programs/claude-code/output-styles.nix new file mode 100644 index 00000000..7aa5f9aa --- /dev/null +++ b/tests/modules/programs/claude-code/output-styles.nix @@ -0,0 +1,25 @@ +{ + programs.claude-code = { + enable = true; + outputStyles = { + inline-style = '' + # Inline Output Style + + This is an inline output style for testing. + It should be written to .claude/output-styles/inline-style.md + ''; + path-style = ./test-output-style.md; + }; + }; + + nmt.script = '' + assertFileExists home-files/.claude/output-styles/inline-style.md + assertFileExists home-files/.claude/output-styles/path-style.md + + assertFileContent home-files/.claude/output-styles/path-style.md \ + ${./test-output-style.md} + + assertFileRegex home-files/.claude/output-styles/inline-style.md \ + 'This is an inline output style for testing' + ''; +} diff --git a/tests/modules/programs/claude-code/test-output-style.md b/tests/modules/programs/claude-code/test-output-style.md new file mode 100644 index 00000000..fd20050d --- /dev/null +++ b/tests/modules/programs/claude-code/test-output-style.md @@ -0,0 +1,4 @@ +# Test Output Style + +This is a test output style loaded from a file path. +Used to verify path support functionality for output styles.