mirror of
https://github.com/penpot/penpot.git
synced 2026-08-01 19:06:18 +00:00
Move all development tools from tools/ to scripts/ for consistency. Rename lint/fmt/check-fmt to lint-clj/fmt-clj/check-fmt-clj to clarify they target Clojure specifically. Remove unused scripts (attach-opencode, start-opencode, start-opencode-server) and the backport-commit skill. Update all internal references across .serena/, AGENTS.md, and CONTRIBUTING.md to point to the new script locations. Simplify CONTRIBUTING.md by delegating module-specific fmt/lint instructions to the respective serena memories. AI-assisted-by: deepseek-v4-flash
56 lines
2.4 KiB
Markdown
56 lines
2.4 KiB
Markdown
# Handling Errors and Debugging
|
|
|
|
## Finding source errors
|
|
|
|
You have access to two tools for finding errors in Clojure source code (which you may introduce yourself through edits):
|
|
|
|
1. cljs_compiler_output
|
|
2. clj_check_parentheses
|
|
|
|
The latter is needed because syntax errors in parentheses give an uninformative compiler error, and the second
|
|
tool can often find the exact location of such errors.
|
|
|
|
When delimiter errors are detected (typically from lint or compiler output),
|
|
fix the affected files with `scripts/paren-repair`. The `clj_check_parentheses`
|
|
MCP tool can also pinpoint the error location when available, but it is not
|
|
required — standard build errors are usually enough.
|
|
See `mem:scripts/paren-repair`.
|
|
|
|
## Runtime patching with `set!`
|
|
|
|
Some frontend vars are deliberately mutable escape hatches for runtime instrumentation or circular-dependency patching.
|
|
From `cljs_repl`, use `set!` for temporary debugging of CLJS vars such as
|
|
`app.main.store/on-event`, `app.main.errors/reload-file`, `app.main.errors/is-plugin-error?`,
|
|
`app.main.errors/last-report`, or `app.main.errors/last-exception`.
|
|
These patches affect only the live browser runtime and disappear on reload or recompilation.
|
|
|
|
```clojure
|
|
;; Log non-noisy Potok events temporarily.
|
|
(set! app.main.store/on-event
|
|
(fn [event]
|
|
(when (potok.v2.core/event? event)
|
|
(.log js/console (potok.v2.core/repr-event event)))))
|
|
```
|
|
|
|
Restore mutable hooks after debugging, or reload the frontend. Use JVM `alter-var-root` only for JVM Clojure;
|
|
it is not the normal way to patch live CLJS browser vars.
|
|
|
|
## Browser-console debug namespace
|
|
|
|
In development, the JS console exposes `debug` helpers from `frontend/src/debug.cljs`:
|
|
|
|
```javascript
|
|
debug.set_logging("namespace", "debug");
|
|
debug.dump_state();
|
|
debug.dump_buffer();
|
|
debug.get_state(":workspace-local :selected");
|
|
debug.dump_objects();
|
|
debug.dump_object("Rect-1");
|
|
debug.dump_selected();
|
|
debug.dump_tree(true, true);
|
|
```
|
|
|
|
Visual workspace debug overlays can be toggled with `debug.toggle_debug("bounding-boxes")`, `"group"`, `"events"`, or `"rotation-handler"`; `debug.debug_all()` and `debug.debug_none()` toggle all visual aids.
|
|
|
|
For temporary source traces, prefer existing logging (`app.common.logging` / `app.util.logging`) or short-lived `prn`, `app.common.pprint/pprint`, `js/console.log`, or `js-debugger` calls. Remove temporary source instrumentation before committing.
|