From a25f43ff42061cb4dbe5743e8c9d5781ec68ec93 Mon Sep 17 00:00:00 2001 From: Dominik Jain Date: Sat, 2 May 2026 12:30:05 +0200 Subject: [PATCH] :books: Reorganise memories, introducing an entrypoint memory Add `critical-info` memory as an entrypoint (bootstrap memory) for the LLM, which points to critical tools and memories, allowing the LLM to dynamically build up relevant context --- .serena/memories/critical-info.md | 14 ++++ .../{devenv => frontend}/cljs-repl.md | 10 +++ .../js-api-to-cljs-binding.md} | 20 ----- .serena/project.yml | 82 +++++++------------ 4 files changed, 52 insertions(+), 74 deletions(-) create mode 100644 .serena/memories/critical-info.md rename .serena/memories/{devenv => frontend}/cljs-repl.md (78%) rename .serena/memories/{plugins/js-api-to-clojurescript-binding.md => frontend/js-api-to-cljs-binding.md} (59%) diff --git a/.serena/memories/critical-info.md b/.serena/memories/critical-info.md new file mode 100644 index 0000000000..42d6861913 --- /dev/null +++ b/.serena/memories/critical-info.md @@ -0,0 +1,14 @@ +You are working on the GitHub project penpot/penpot. + +# Working with Penpot Designs + +Before working with Penpot designs, call the `high_level_overview` tool of the Penpot MCP server. +It explains the JavaScript API, which you can use to automate tasks via the `execute_code` tool. + +# Critical Memories + +* Before creating a commit, read `creating-commits`. +* When working on the Penpot frontend ... + - read the file `frontend/AGENTS.md` for an overview + - to understand the connection between the JavaScript API and the ClojureScript code, read memory `frontend/js-api-to-cljs-binding`. + - to understand how to execute ClojureScript code in the Penpot frontend, read memory `frontend/cljs-repl`. diff --git a/.serena/memories/devenv/cljs-repl.md b/.serena/memories/frontend/cljs-repl.md similarity index 78% rename from .serena/memories/devenv/cljs-repl.md rename to .serena/memories/frontend/cljs-repl.md index 73f126088b..fdce760c04 100644 --- a/.serena/memories/devenv/cljs-repl.md +++ b/.serena/memories/frontend/cljs-repl.md @@ -49,6 +49,16 @@ Shape keys use kebab-case keywords (`:fill-color`, `:fill-opacity`, `:parent-id` The shape `:type` is a keyword like `:rect`, `:path`, `:text`, `:ellipse`, `:image`, `:bool`, `:svg-raw`, `:frame`, `:group`. Note `:rect` in CLJS corresponds to "rectangle" in the JS Plugin API, and `:frame` corresponds to "board". +Component instance shapes additionally carry `:component-id` and `:component-file` directly, and `:component-root` flags the root of an instance. To navigate from a shape to its component, use `app.common.types.container/get-head-shape` (nearest head) or `get-instance-root` (outermost root) — these differ when instances are nested. + +### Helper utilities (`app.plugins.utils`) +Despite living under `plugins/`, these are general-purpose lookup helpers usable from any CLJS: +- `locate-shape` — find a shape by file-id, page-id, id +- `locate-objects` — get the object tree for a page +- `locate-component` — resolve the component for a shape (walks to **outermost** instance root, not nearest head — beware when instances are nested) +- `locate-library-component` — direct lookup by file-id and component-id +- `locate-file` — look up a file by id from state + ## Notes - The `:main` build has multiple modules: shared, main, main-workspace, rasterizer, etc. - `app.main.store/state` is a potok store (wrapping an okulary atom) created via `defonce` diff --git a/.serena/memories/plugins/js-api-to-clojurescript-binding.md b/.serena/memories/frontend/js-api-to-cljs-binding.md similarity index 59% rename from .serena/memories/plugins/js-api-to-clojurescript-binding.md rename to .serena/memories/frontend/js-api-to-cljs-binding.md index 6452a5503d..d52d787061 100644 --- a/.serena/memories/plugins/js-api-to-clojurescript-binding.md +++ b/.serena/memories/frontend/js-api-to-cljs-binding.md @@ -19,27 +19,7 @@ - `frontend/src/app/plugins.cljs` patches them at load time: `(set! shape/lib-component-proxy library/lib-component-proxy)`. - Same pattern for `lib-typography-proxy?` and `variant-proxy`. -## Helper Utilities (`frontend/src/app/plugins/utils.cljs`) -- `locate-shape` — finds a shape by file-id, page-id, id -- `locate-objects` — gets the object tree for a page -- `locate-component` — finds the **outermost** instance root and resolves the component (uses `ctn/get-instance-root` + `ctf/resolve-component`). **Beware**: walks to outermost root, not nearest head. -- `locate-library-component` — direct lookup by file-id and component-id from file data -- `locate-file` — looks up a file by id from state - ## Key Domain Namespaces - `app.common.types.component` (aliased `ctk`) — component predicates: `instance-root?`, `instance-head?`, `in-component-copy?`, `is-variant?` - `app.common.types.container` (aliased `ctn`) — container/tree operations: `in-any-component?`, `get-instance-root`, `get-head-shape`, `inside-component-main?` - `app.common.types.file` (aliased `ctf`) — file-level operations: `resolve-component`, `get-ref-shape` - -## Shape Component Data -- Component instance shapes carry `:component-id` and `:component-file` attributes directly on the shape map. -- `:component-root` flag indicates if a shape is the root of a component instance. -- `get-head-shape` finds the nearest component head (the topmost shape of the nearest component instance), while `get-instance-root` finds the outermost root. - -## Pattern for Looking Up a Shape's Own Component -Use `ctn/get-head-shape` to find the nearest head, then read `:component-id` and `:component-file` from it: -```clojure -(let [head (ctn/get-head-shape objects shape)] - (lib-component-proxy plugin-id (:component-file head) (:component-id head))) -``` -Do NOT use `locate-component` / `get-instance-root` if you want the nearest component — those walk to the outermost ancestor. diff --git a/.serena/project.yml b/.serena/project.yml index 2019e8678b..c2d3a13e28 100644 --- a/.serena/project.yml +++ b/.serena/project.yml @@ -3,16 +3,18 @@ project_name: "penpot" # list of languages for which language servers are started; choose from: -# al bash clojure cpp csharp -# csharp_omnisharp dart elixir elm erlang -# fortran fsharp go groovy haskell -# haxe java julia kotlin lua -# markdown -# matlab nix pascal perl php -# php_phpactor powershell python python_jedi r -# rego ruby ruby_solargraph rust scala -# swift terraform toml typescript typescript_vts -# vue yaml zig +# al ansible bash clojure cpp +# cpp_ccls crystal csharp csharp_omnisharp dart +# elixir elm erlang fortran fsharp +# go groovy haskell haxe hlsl +# java json julia kotlin lean4 +# lua luau markdown matlab msl +# nix ocaml pascal perl php +# php_phpactor powershell python python_jedi python_ty +# r rego ruby ruby_solargraph rust +# scala solidity swift systemverilog terraform +# toml typescript typescript_vts vue yaml +# zig # (This list may be outdated. For the current list, see values of Language enum here: # https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py # For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.) @@ -67,54 +69,17 @@ read_only: false # list of tool names to exclude. # This extends the existing exclusions (e.g. from the global configuration) -# -# Below is the complete list of tools for convenience. -# To make sure you have the latest list of tools, and to view their descriptions, -# execute `uv run scripts/print_tool_overview.py`. -# -# * `activate_project`: Activates a project based on the project name or path. -# * `check_onboarding_performed`: Checks whether project onboarding was already performed. -# * `create_text_file`: Creates/overwrites a file in the project directory. -# * `delete_memory`: Delete a memory file. Should only happen if a user asks for it explicitly, -# for example by saying that the information retrieved from a memory file is no longer correct -# or no longer relevant for the project. -# * `edit_memory`: Replaces content matching a regular expression in a memory. -# * `execute_shell_command`: Executes a shell command. -# * `find_file`: Finds files in the given relative paths -# * `find_referencing_symbols`: Finds symbols that reference the given symbol using the language server backend -# * `find_symbol`: Performs a global (or local) search using the language server backend. -# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes. -# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file. -# * `initial_instructions`: Provides instructions Serena usage (i.e. the 'Serena Instructions Manual') -# for clients that do not read the initial instructions when the MCP server is connected. -# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol. -# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol. -# * `list_dir`: Lists files and directories in the given directory (optionally with recursion). -# * `list_memories`: List available memories. Any memory can be read using the `read_memory` tool. -# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building). -# * `read_file`: Reads a file within the project directory. -# * `read_memory`: Read the content of a memory file. This tool should only be used if the information -# is relevant to the current task. You can infer whether the information -# is relevant from the memory file name. -# You should not read the same memory file multiple times in the same conversation. -# * `rename_memory`: Renames or moves a memory. Moving between project and global scope is supported -# (e.g., renaming "global/foo" to "bar" moves it from global to project scope). -# * `rename_symbol`: Renames a symbol throughout the codebase using language server refactoring capabilities. -# For JB, we use a separate tool. -# * `replace_content`: Replaces content in a file (optionally using regular expressions). -# * `replace_symbol_body`: Replaces the full definition of a symbol using the language server backend. -# * `safe_delete_symbol`: -# * `search_for_pattern`: Performs a search for a pattern in the project. -# * `write_memory`: Write some information (utf-8-encoded) about this project that can be useful for future tasks to a memory in md format. -# The memory name should be meaningful. +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html excluded_tools: [] # list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default). # This extends the existing inclusions (e.g. from the global configuration). +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html included_optional_tools: [] # fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools. # This cannot be combined with non-empty excluded_tools or included_optional_tools. +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html fixed_tools: [] # list of mode names to that are always to be included in the set of active modes @@ -125,16 +90,20 @@ fixed_tools: [] # Set this to a list of mode names to always include the respective modes for this project. base_modes: -# list of mode names that are to be activated by default. -# The full set of modes to be activated is base_modes + default_modes. -# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply. +# list of mode names that are to be activated by default, overriding the setting in the global configuration. +# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. +# If the setting is undefined/empty, the default_modes from the global configuration (serena_config.yml) apply. # Otherwise, this overrides the setting from the global configuration (serena_config.yml). +# Therefore, you can set this to [] if you do not want the default modes defined in the global config to apply +# for this project. # This setting can, in turn, be overridden by CLI parameters (--mode). +# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes default_modes: # initial prompt for the project. It will always be given to the LLM upon activating the project # (contrary to the memories, which are loaded on demand). -initial_prompt: "" +initial_prompt: | + CRITICAL: Always read the memory `critical-info` before you do anything else. # time budget (seconds) per tool call for the retrieval of additional symbol information # such as docstrings or parameter information. @@ -153,3 +122,8 @@ read_only_memory_patterns: [] # Extends the list from the global configuration, merging the two lists. # Example: ["_archive/.*", "_episodes/.*"] ignored_memory_patterns: [] + +# list of mode names to be activated additionally for this project, e.g. ["query-projects"] +# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. +# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes +added_modes: