Clojure Development Skill
Tool Preference
When clojure-mcp tools are available (e.g., clojure_eval, clojure_edit), always use them
instead of shell commands like ./bin/mage -repl. The MCP tools provide:
- Direct REPL integration without shell escaping issues
- Better error messages and feedback
- Structural Clojure editing that prevents syntax errors
Only fall back to ./bin/mage commands when clojure-mcp is not available.
@./../_shared/development-workflow.md
@./../_shared/clojure-style-guide.md
@./../_shared/clojure-commands.md
REPL-Driven Development Workflow
- Start with small, fundamental functions:
- Identify the core features or functionalities required for your task.
- Break each feature down into the smallest, most basic functions that can be developed and tested independently.
- Write and test in the REPL:
- Write the code for each small function directly in the REPL (Read-Eval-Print Loop).
- Test it thoroughly with a variety of inputs, including typical use cases and relevant edge cases, to ensure it
behaves as expected.
- Integrate into source code:
- Once a function works correctly in the REPL, move it from the REPL environment into your source code files (e.g.,
within appropriate namespaces).
- Gradually increase complexity:
- Build upon tested, basic functions to create more complex functions or components.
- Compose smaller functions together, testing each new composition in the REPL to verify correctness step by step.
- Ensure dependency testing:
- Make sure every function is fully tested in the REPL before it is depended upon by other functions.
- This ensures that each layer of your application is reliable before you build on it.
- Use the REPL fully:
- Use the REPL as your primary tool to experiment with different approaches, iterate quickly, and get immediate
feedback on your code.
- Follow functional programming principles:
- Keep functions small, focused, and composable.
- Use Clojure's functional programming features—like immutability, higher-order functions, and the standard
library—to write concise, effective code.
How to Evaluate Code
Bottom-up Dev Loop
- Write code into a file.
- Evaluate the file's namespace and make sure it loads correctly with:
./bin/mage -repl --namespace metabase.app-db.connection
- Call functions in the namespace with test inputs, and observe that the outputs are correct
Feel free to copy these REPL session trials into actual test cases using
deftest and is.
- Once you know these functions are good, return to 1, and compose them into the task that you need to build.
Critical Rules for Editing
- Be careful with parentheses counts when editing Clojure code
- After EVERY change to Clojure code, verify readability with
-check-readable
- End all files with a newline
- When editing tabular code, where the columns line up, try to keep them aligned
- Spaces on a line with nothing after it is not allowed
1---2name: clojure-write3description: Guide Clojure and ClojureScript development using REPL-driven workflow, coding conventions, and best practices. Use when writing, developing, or refactoring Clojure/ClojureScript code.4---5
6# Clojure Development Skill
7
8## Tool Preference
9
10When `clojure-mcp` tools are available (e.g., `clojure_eval`, `clojure_edit`), **always use them**
11instead of shell commands like `./bin/mage -repl`. The MCP tools provide:
12- Direct REPL integration without shell escaping issues
13- Better error messages and feedback
14- Structural Clojure editing that prevents syntax errors
15
16Only fall back to `./bin/mage` commands when clojure-mcp is not available.
17
18@./../_shared/development-workflow.md
19@./../_shared/clojure-style-guide.md
20@./../_shared/clojure-commands.md
21
22## REPL-Driven Development Workflow
23
24- Start with small, fundamental functions:
25- Identify the core features or functionalities required for your task.
26- Break each feature down into the smallest, most basic functions that can be developed and tested independently.
27- Write and test in the REPL:
28 - Write the code for each small function directly in the REPL (Read-Eval-Print Loop).
29 - Test it thoroughly with a variety of inputs, including typical use cases and relevant edge cases, to ensure it
30 behaves as expected.
31- Integrate into source code:
32 - Once a function works correctly in the REPL, move it from the REPL environment into your source code files (e.g.,
33 within appropriate namespaces).
34- Gradually increase complexity:
35 - Build upon tested, basic functions to create more complex functions or components.
36 - Compose smaller functions together, testing each new composition in the REPL to verify correctness step by step.
37- Ensure dependency testing:
38 - Make sure every function is fully tested in the REPL before it is depended upon by other functions.
39 - This ensures that each layer of your application is reliable before you build on it.
40- Use the REPL fully:
41 - Use the REPL as your primary tool to experiment with different approaches, iterate quickly, and get immediate
42 feedback on your code.
43- Follow functional programming principles:
44 - Keep functions small, focused, and composable.
45 - Use Clojure's functional programming features—like immutability, higher-order functions, and the standard
46 library—to write concise, effective code.
47
48## How to Evaluate Code
49
50### Bottom-up Dev Loop
51
521. Write code into a file.
532. Evaluate the file's namespace and make sure it loads correctly with:
54
55```
56./bin/mage -repl --namespace metabase.app-db.connection
57```
58
593. Call functions in the namespace with test inputs, and observe that the outputs are correct
60 Feel free to copy these REPL session trials into actual test cases using `deftest` and `is`.
614. Once you know these functions are good, return to 1, and compose them into the task that you need to build.
62
63## Critical Rules for Editing
64
65- Be careful with parentheses counts when editing Clojure code
66- After EVERY change to Clojure code, verify readability with `-check-readable`
67- End all files with a newline
68- When editing tabular code, where the columns line up, try to keep them aligned
69- Spaces on a line with nothing after it is not allowed