<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anton Novgorodtsev</title>
    <description>The latest articles on DEV Community by Anton Novgorodtsev (@anton_novgorodtsev_22d629).</description>
    <link>https://dev.to/anton_novgorodtsev_22d629</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3923773%2F46c3c783-0837-476b-9b1d-8dbaebc2d88c.jpg</url>
      <title>DEV Community: Anton Novgorodtsev</title>
      <link>https://dev.to/anton_novgorodtsev_22d629</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anton_novgorodtsev_22d629"/>
    <language>en</language>
    <item>
      <title>Spawn — a framework for developing AIDD methodologies</title>
      <dc:creator>Anton Novgorodtsev</dc:creator>
      <pubDate>Wed, 10 Jun 2026 11:10:51 +0000</pubDate>
      <link>https://dev.to/anton_novgorodtsev_22d629/spawn-a-framework-for-developing-aidd-methodologies-40gg</link>
      <guid>https://dev.to/anton_novgorodtsev_22d629/spawn-a-framework-for-developing-aidd-methodologies-40gg</guid>
      <description>&lt;p&gt;Hi everyone! I built a tool for developing AIDD and named it Spawn. It's a Python utility that helps you coherently use multiple AIDD methodologies in a single repository — without manually syncing rules, skills, and MCP configs between them.&lt;/p&gt;

&lt;p&gt;Below is a short introduction, followed by how Spawn works, how to use it from a client's perspective, how to develop extensions, and a few examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who might be interested
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Development team leads — to develop team rules and processes related to AI-assisted development and beyond.&lt;/li&gt;
&lt;li&gt;Individual developers — to use a ready-made SDD framework or build your own purely "for yourself".&lt;/li&gt;
&lt;li&gt;Potentially — developers of full-cycle AIDD development software.&lt;/li&gt;
&lt;li&gt;DevOps engineers, infrastructure specialists, and technical writers — provided that scripts, configurations, or documents are stored in repositories.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spawn lets you use multiple AIDD methodologies (or rule sets) coherently. It automatically propagates global mandatory rules or process descriptions between the artifacts of installed extensions within a single repository — the agent always has cross-references.&lt;/li&gt;
&lt;li&gt;An extension in Spawn terms is an AIDD methodology that can be installed into a repository. For the utility, it's a set of documents, instructions, scripts, skills, and MCP configurations.&lt;/li&gt;
&lt;li&gt;An extension can also be a set of team rules, project scaffold files, or a set of automations — something that can't yet be called a methodology, but that you already want to reuse.&lt;/li&gt;
&lt;li&gt;Spawn lets you install IDE-specific artifacts (MCP, skills, agent-ignore and git-ignore lists) for the selected supported IDEs, while the extension developer doesn't have to "tailor" each such artifact to a specific IDE — Spawn does it for you. The utility works with universal, IDE-independent configurations that are later "rendered" for the IDEs the team uses.&lt;/li&gt;
&lt;li&gt;It's possible to create cross-platform MCPs; Spawn will launch the right one for the current OS via an MCP proxy on its own — this is important for teams whose members work on different operating systems.&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;spawn init&lt;/code&gt;, a &lt;code&gt;./spawn&lt;/code&gt; directory appears in the repository — it stores the metadata of installed extensions, local configurations, and navigation. This folder &lt;strong&gt;must be committed&lt;/strong&gt; to the repository; don't add it to &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation and quick start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installing the Spawn CLI
&lt;/h3&gt;

&lt;p&gt;Python 3.10+ is required. The recommended way is via &lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;spawn-cli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; spawn &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initializing a repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding an IDE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn ide add cursor
&lt;span class="c"&gt;# you can add several at once:&lt;/span&gt;
spawn ide add cursor codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see all supported IDEs and what each of them can render:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn ide list-supported-ides
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the time of publication, the following are supported: &lt;code&gt;cursor&lt;/code&gt;, &lt;code&gt;codex&lt;/code&gt;, &lt;code&gt;claude-code&lt;/code&gt;, &lt;code&gt;windsurf&lt;/code&gt;, &lt;code&gt;github-copilot&lt;/code&gt;, &lt;code&gt;gemini-cli&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing your first extension
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension add https://github.com/noant/spawn-ext-spectask.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Terminology
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Extension&lt;/strong&gt; — the content of a specific AIDD methodology, containing an extension config file, a set of IDE-independent skill and MCP files, instruction files, scripts, etc. An extension can be installed from a Git repository, a zip archive, or a local folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IDE agent entry point&lt;/strong&gt; — a file that the IDE reads before executing any command. For example, in Cursor this is &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hint&lt;/strong&gt; — a short reminder string that is inserted directly into skills and the agent entry point. The agent sees it immediately in the context — without reading an additional file. For example: the response language (RU/EN), tone, project specifics. A hint can be global (it lands in all skills of all extensions and in the managed block of the agent entry point — e.g. &lt;code&gt;AGENTS.md&lt;/code&gt;) or local (only in the skills of the current extension).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instruction file&lt;/strong&gt; — an AI-readable file describing a process, rule, or convention. Unlike a hint, the agent reads it deliberately — after seeing a reference in the navigation or a skill. There are two read modes: &lt;em&gt;required-read&lt;/em&gt; — the reference is always present in skills and the agent entry point, and the agent must read it on every invocation; &lt;em&gt;contextual-read&lt;/em&gt; — the reference is present in navigation, but the agent reads it as needed, only when the task is relevant to its content. The scope is set via &lt;code&gt;globalRead&lt;/code&gt;/&lt;code&gt;localRead&lt;/code&gt;: a global file lands in all skills of all extensions, a local one — only in the skills of its own extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global navigation file&lt;/strong&gt; — a file containing all references to the needed instruction files (not skills) with a short description, scope, and an indication of whether reading is required or contextual (situational). The global navigation file also contains hints and references to local rule files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local rules&lt;/strong&gt; — instruction files and hints that can be added to a repository without installing an extension. This can be useful when you understand that the rules won't become universal. If needed, such rules can always be packaged into an extension and reused in other projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extension file mode&lt;/strong&gt; — defines the file's behavior when the extension is updated. &lt;em&gt;Static&lt;/em&gt; — the file is overwritten from the source on every update; used for instructions that should always match the latest version of the extension. &lt;em&gt;Artifact&lt;/em&gt; — the file is created once on installation and after that belongs to the project; it is not overwritten on updates; used for configurations and data that the project adapts for itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with extensions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Managing installed extensions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# in the examples below, spectask is the name of an installed extension&lt;/span&gt;
spawn extension list                    &lt;span class="c"&gt;# list installed extensions&lt;/span&gt;
spawn extension update spectask         &lt;span class="c"&gt;# update the extension from its source&lt;/span&gt;
spawn extension reinstall spectask      &lt;span class="c"&gt;# full reinstall (in case of corruption)&lt;/span&gt;
spawn extension remove spectask         &lt;span class="c"&gt;# remove the extension&lt;/span&gt;
spawn extension healthcheck spectask    &lt;span class="c"&gt;# check the extension's state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extension builds
&lt;/h3&gt;

&lt;p&gt;Installing several extensions (so-called "extension builds"):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn build &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/org/team-methodology.git &lt;span class="nt"&gt;--branch&lt;/span&gt; main
&lt;span class="c"&gt;# or from a local directory that has extensions.yaml in its root:&lt;/span&gt;
spawn build &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Local rules and refresh
&lt;/h3&gt;

&lt;p&gt;Adding rules without installing extensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create a rules file in spawn/rules/ and run refresh:&lt;/span&gt;
spawn refresh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After editing files in &lt;code&gt;spawn/rules/&lt;/code&gt; or hints in &lt;code&gt;spawn/navigation.yaml&lt;/code&gt;, you need to run refresh so that skills and IDE entry points are updated. There are two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;spawn refresh&lt;/code&gt; — a full recompute: updates &lt;code&gt;navigation.yaml&lt;/code&gt;, regenerates skills and agent entry points. Use it after any changes. It runs automatically when an extension is installed or an IDE is added.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spawn rules refresh&lt;/code&gt; — only syncs files from &lt;code&gt;spawn/rules/&lt;/code&gt; into &lt;code&gt;navigation.yaml&lt;/code&gt;, without regenerating skills and entry points. Suitable when you need to quickly update navigation without touching IDE artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Spawn only edits files that it installed itself. It doesn't touch third-party skills and rules outside those paths during &lt;code&gt;refresh&lt;/code&gt; or extension updates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What happens during &lt;code&gt;spawn extension add&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;When you run &lt;code&gt;spawn extension add &amp;lt;url&amp;gt;&lt;/code&gt;, Spawn:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clones&lt;/strong&gt; the extension's source repository (or unpacks a ZIP / copies from a local folder) into a temporary directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reads the extension's &lt;code&gt;extsrc/config.yaml&lt;/code&gt;&lt;/strong&gt; — identifies the stable &lt;code&gt;name&lt;/code&gt;, version, and the list of files, skills, MCP servers, and ignore rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copies files&lt;/strong&gt; from &lt;code&gt;extsrc/files/&lt;/code&gt; into the target repository according to the declared paths. Files with &lt;code&gt;static&lt;/code&gt; mode will be overwritten on updates; files with &lt;code&gt;artifact&lt;/code&gt; mode are created once and then belong to the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registers skills&lt;/strong&gt;: sources from &lt;code&gt;extsrc/skills/&lt;/code&gt; are rendered with the active IDEs in mind — references to mandatory instruction files, hints, and the global navigation are embedded into each skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connects MCP servers&lt;/strong&gt; from &lt;code&gt;extsrc/mcp/{windows,linux,macos}.json&lt;/code&gt;: for each registered IDE an IDE-specific config is generated, while cross-platform servers are automatically wrapped in an MCP proxy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs lifecycle scripts&lt;/strong&gt; from &lt;code&gt;setup/&lt;/code&gt; (e.g. &lt;code&gt;after-install&lt;/code&gt;) — installing dependencies, initializing artifacts, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates &lt;code&gt;spawn/navigation.yaml&lt;/code&gt;&lt;/strong&gt;: adds the extension's &lt;code&gt;ext:&lt;/code&gt; block with its mandatory and contextual reads, global hints, and references to instruction files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates IDE agent entry points&lt;/strong&gt; (e.g. &lt;code&gt;AGENTS.md&lt;/code&gt; for Cursor): merges the navigation of all installed extensions and local rules into a single coherent file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates &lt;code&gt;.gitignore&lt;/code&gt; and agent-ignore&lt;/strong&gt; according to the patterns declared in the extension's &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Metadata about the installed extension is saved in &lt;code&gt;spawn/.extend/&amp;lt;name&amp;gt;/&lt;/code&gt; — this allows &lt;code&gt;spawn extension update&lt;/code&gt; / &lt;code&gt;reinstall&lt;/code&gt; / &lt;code&gt;remove&lt;/code&gt; to work correctly, and &lt;code&gt;spawn extension healthcheck&lt;/code&gt; to diagnose discrepancies between what's declared in &lt;code&gt;config.yaml&lt;/code&gt; and what's actually present in the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples of ready-made extensions
&lt;/h2&gt;

&lt;p&gt;Below are two extensions I use myself: the Spectask SDD methodology and the integration with the local semantic memory MemPalace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spectask — an SDD extension
&lt;/h3&gt;

&lt;p&gt;This extension lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep task specifications in the repository&lt;/li&gt;
&lt;li&gt;Decompose tasks&lt;/li&gt;
&lt;li&gt;Independently build a parallelization scheme for executing subtasks&lt;/li&gt;
&lt;li&gt;Execute subtasks with different subagents&lt;/li&gt;
&lt;li&gt;Create tasks from Jira tickets&lt;/li&gt;
&lt;li&gt;Keep architecture files up to date.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installing the extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension add https://github.com/noant/spawn-ext-spectask.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to create a task from a Jira ticket (invoking a skill, example for Cursor):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/spectask-from-jira import PROJ-123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to create a task without a Jira ticket (invoking a skill, example for Cursor):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/spectask-create add authorization via OAuth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The task goes through the process flow with the following steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1] spec created → [2] self spec review → [3] spec review (user) → [4] code implemented → [5] self code review → [6] code review (user) → [7] design documents updated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Steps 1, 2, 4, 5, 7 are performed by the agent; steps 3 and 6 — by the user (confirmation). Step 4 launches a separate subagent for each subtask.&lt;/p&gt;

&lt;p&gt;All skills with descriptions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a task specification — Steps 1–2 (without implementation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-spec-review-passed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Step 3: confirm the specification and move on to implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-execute&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Steps 4–5: implement the task and perform a self code review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-code-review-passed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Step 6: confirm the code, trigger the architecture documents update (Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-design&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Register architecture files in &lt;code&gt;spec/design.yaml&lt;/code&gt; or create &lt;code&gt;spec/design/*.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-seed-create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture a rough idea as &lt;code&gt;spec/seeds/{X}-{slug}.md&lt;/code&gt; without creating a full task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spectask-from-jira&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Import a Jira ticket into the task folder via MCP or CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Seeds
&lt;/h4&gt;

&lt;p&gt;Before creating a full-fledged task, you can quickly capture an idea as a seed file in &lt;code&gt;spec/seeds/&lt;/code&gt;. This is an informal note without the full flow — useful when you have an idea but implementation is still far off. When ready, a seed is easily promoted into a full-fledged task via &lt;code&gt;spectask-create&lt;/code&gt;, and after the task is closed the seed is renamed with the &lt;code&gt;_DONE_&lt;/code&gt; prefix.&lt;/p&gt;

&lt;h4&gt;
  
  
  Jira integration
&lt;/h4&gt;

&lt;p&gt;The extension ships with an MCP server &lt;code&gt;spectask-mcp&lt;/code&gt;, which is installed automatically when the extension is installed. It lets the &lt;code&gt;spectask-from-jira&lt;/code&gt; skill fetch data directly from Jira by the ticket key.&lt;/p&gt;

&lt;p&gt;Configuration is done through an interactive setup during extension installation (it runs automatically if stdin is a TTY). If needed, it can be invoked again manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spectask-mcp interactive &lt;span class="nt"&gt;--setup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration (URL, token, optional SOCKS5 proxy) is saved in &lt;code&gt;spec/.config/config.yaml&lt;/code&gt; — this file is automatically added to &lt;code&gt;.gitignore&lt;/code&gt; and &lt;code&gt;agent-ignore&lt;/code&gt; so that secrets don't end up in the repository.&lt;/p&gt;

&lt;p&gt;The methodology is described in the extension repository's main file &lt;code&gt;main.md&lt;/code&gt; — that's also where the full process and rules live. The Spawn CLI was developed using this methodology.&lt;/p&gt;

&lt;p&gt;Extension repository: &lt;a href="https://github.com/noant/spawn-ext-spectask" rel="noopener noreferrer"&gt;github.com/noant/spawn-ext-spectask&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  MemPalace
&lt;/h3&gt;

&lt;p&gt;This extension lets you install MemPalace (a local semantic memory — a "memory palace") from the original package into the current repository, and also provides on top of it a cross-platform MCP (required for MemPalace to function), a set of skills, and scripts for configuring mempalace. For more about MemPalace itself, see the &lt;a href="https://mempalaceofficial.com" rel="noopener noreferrer"&gt;project's official site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Installing the extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension add https://github.com/noant/spawn-ext-mempalace.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuring the memory palace (invoking a skill):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mempalace-configure-palace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(example for Cursor)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After installation, the extension automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installs the &lt;code&gt;mempalace&lt;/code&gt; package via &lt;code&gt;pip&lt;/code&gt; (or, if it's missing, via &lt;code&gt;uv pip&lt;/code&gt;), unless &lt;code&gt;MEMPALACE_EXTENSION_SKIP_PIP&lt;/code&gt; is set&lt;/li&gt;
&lt;li&gt;initializes a palace in &lt;code&gt;&amp;lt;repo&amp;gt;/.mempalace/palace&lt;/code&gt; (via &lt;code&gt;mempalace init .&lt;/code&gt;); overridden by the &lt;code&gt;MEMPALACE_EXTENSION_GLOBAL_PALACE&lt;/code&gt; flag or the &lt;code&gt;MEMPALACE_PALACE_PATH&lt;/code&gt; variable&lt;/li&gt;
&lt;li&gt;connects two MCP servers: &lt;code&gt;mempalace-mcp&lt;/code&gt; (the official MemPalace tools) and &lt;code&gt;mempalace-mine-mcp&lt;/code&gt; (a bridge for indexing and updating the wake-up context)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  How it works
&lt;/h4&gt;

&lt;p&gt;The semantic memory is stored in &lt;code&gt;.mempalace/palace&lt;/code&gt; (ChromaDB by default; the backend is pluggable). After substantial edits in the repository, the agent calls &lt;code&gt;mempalace_mine&lt;/code&gt; — this reindexes files and updates &lt;code&gt;.mempalace/wakeup.md&lt;/code&gt;. This file is declared as required-read in &lt;code&gt;spawn/navigation.yaml&lt;/code&gt;, so the agent loads the current context from the palace at the start of each session — without re-explaining the project structure.&lt;/p&gt;

&lt;p&gt;Skills:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mempalace-configure-palace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Configure the palace: global config, &lt;code&gt;mempalace.yaml&lt;/code&gt;, &lt;code&gt;palace_path&lt;/code&gt;, identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mempalace-search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semantic search via the MemPalace MCP or CLI with a fallback to workspace search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mempalace-diagnose-palace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Diagnose the installation, palace path alignment, MCP, and the wake-up context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After that, on any substantial change to the project, the agent will itself suggest reindexing the files in the palace.&lt;/p&gt;

&lt;p&gt;Extension repository: &lt;a href="https://github.com/noant/spawn-ext-mempalace" rel="noopener noreferrer"&gt;github.com/noant/spawn-ext-mempalace&lt;/a&gt;.&lt;br&gt;
Original MemPalace repository: &lt;a href="https://github.com/MemPalace/mempalace" rel="noopener noreferrer"&gt;github.com/MemPalace/mempalace&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to create your own extension
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Two paths: CLI scaffold and spawn-ext-creator
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quick start via CLI&lt;/strong&gt; — creates a minimal scaffold (&lt;code&gt;extsrc/&lt;/code&gt; with &lt;code&gt;config.yaml&lt;/code&gt;, empty &lt;code&gt;skills/&lt;/code&gt;, &lt;code&gt;files/&lt;/code&gt;, &lt;code&gt;setup/&lt;/code&gt;) without any additional extensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension init &lt;span class="nt"&gt;--name&lt;/span&gt; my-extension
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A full-fledged scaffold via spawn-ext-creator&lt;/strong&gt; — an extension that adds skills for the agent: it will walk you through declaring &lt;code&gt;config.yaml&lt;/code&gt;, skills, and MCP, through verification, and other steps. Suitable when the extension is expected to be non-trivial.&lt;/p&gt;

&lt;p&gt;Installing the &lt;em&gt;spawn-ext-creator&lt;/em&gt; extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension add https://github.com/noant/spawn-ext-creator.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  spawn-ext-creator skills
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-methodology-shape&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Design the methodology: namespaces in &lt;code&gt;extsrc/files/&lt;/code&gt;, static vs artifact, global vs local reads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-bootstrap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start from scratch: &lt;code&gt;spawn extension init&lt;/code&gt;, stable &lt;code&gt;name&lt;/code&gt;/&lt;code&gt;version&lt;/code&gt;, safe path prefixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maintain &lt;code&gt;config.yaml&lt;/code&gt;: declare all files, folders, read flags, ignores, &lt;code&gt;setup&lt;/code&gt;, &lt;code&gt;mode&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-hints&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Declare &lt;code&gt;hints.global&lt;/code&gt;/&lt;code&gt;hints.local&lt;/code&gt; (sections in &lt;code&gt;config.yaml&lt;/code&gt; for global and local hint strings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-skill-sources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Write &lt;code&gt;extsrc/skills/*.md&lt;/code&gt;, register them under &lt;code&gt;skills:&lt;/code&gt;, wire up &lt;code&gt;required-read&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create &lt;code&gt;extsrc/mcp/*.json&lt;/code&gt; for the three OSes: servers, transport, env placeholders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-verify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;spawn extension check . --strict&lt;/code&gt; and a smoke test &lt;code&gt;spawn extension add&lt;/code&gt; in a test repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn-ext-increment-version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bump &lt;code&gt;version&lt;/code&gt; in &lt;code&gt;extsrc/config.yaml&lt;/code&gt; before a release, keeping &lt;code&gt;name&lt;/code&gt; stable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The recommended order when creating a new extension: &lt;code&gt;spawn-methodology-shape&lt;/code&gt; → &lt;code&gt;spawn-ext-bootstrap&lt;/code&gt; → &lt;code&gt;spawn-ext-config&lt;/code&gt; → &lt;code&gt;spawn-ext-skill-sources&lt;/code&gt; → &lt;code&gt;spawn-ext-mcp&lt;/code&gt; (optional) → &lt;code&gt;spawn-ext-verify&lt;/code&gt;. Before each release: &lt;code&gt;spawn-ext-increment-version&lt;/code&gt; → &lt;code&gt;spawn-ext-verify&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Recommendation: for extensions more complex than the minimal one, use spawn-ext-creator — it's faster and more reliable than assembling the structure by hand.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;extsrc/&lt;/code&gt; structure
&lt;/h3&gt;

&lt;p&gt;The central file of an extension is &lt;code&gt;config.yaml&lt;/code&gt;. The extension's file structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-extension/
└── extsrc/
    ├── config.yaml       # required: schema, version, name, declaration of files and skills
    ├── files/            # files that will be copied into the target repository
    ├── skills/           # skill sources (IDE-independent)
    ├── mcp/              # (optional) MCP server declarations: windows.json, linux.json, macos.json
    ├── agent-ignore      # (optional) patterns for agent-ignore
    └── setup/            # (optional) scripts run on install/update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only required file is &lt;code&gt;extsrc/config.yaml&lt;/code&gt;. Everything else is optional depending on what the extension does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reference: an example &lt;code&gt;config.yaml&lt;/code&gt; with all fields
&lt;/h3&gt;

&lt;p&gt;Below is an example with a description of all fields and how they work after the extension is installed into a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Config schema version — always 1&lt;/span&gt;
&lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="c1"&gt;# Stable extension identifier (used as the folder name spawn/.extend/&amp;lt;name&amp;gt;/)&lt;/span&gt;
&lt;span class="c1"&gt;# Don't change after the first publication&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-extension&lt;/span&gt;
&lt;span class="c1"&gt;# Extension version (semver)&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0.0"&lt;/span&gt;

&lt;span class="c1"&gt;# Folders that belong to the project (artifact — not overwritten on extension updates)&lt;/span&gt;
&lt;span class="na"&gt;folders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my-extension/data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;artifact&lt;/span&gt;

&lt;span class="c1"&gt;# Patterns for agent-ignore (the agent won't read these files)&lt;/span&gt;
&lt;span class="na"&gt;agent-ignore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;my-extension/data/secrets/**&lt;/span&gt;

&lt;span class="c1"&gt;# Patterns for git-ignore&lt;/span&gt;
&lt;span class="na"&gt;git-ignore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;my-extension/data/secrets/**&lt;/span&gt;

&lt;span class="c1"&gt;# Scripts run on install/update&lt;/span&gt;
&lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Path from the extsrc/ root — extsrc/setup/install.py will live here&lt;/span&gt;
  &lt;span class="na"&gt;after-install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup/install.py&lt;/span&gt;

&lt;span class="c1"&gt;# Extension files&lt;/span&gt;
&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Static file — overwritten on extension update&lt;/span&gt;
  &lt;span class="na"&gt;my-extension/process.md&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Description&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;development&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;process."&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static&lt;/span&gt;
    &lt;span class="c1"&gt;# globalRead: required — the reference lands in all skills of all extensions&lt;/span&gt;
    &lt;span class="c1"&gt;# globalRead: auto — only if the agent deems the file globally relevant&lt;/span&gt;
    &lt;span class="c1"&gt;# globalRead: no — doesn't land in the global navigation&lt;/span&gt;
    &lt;span class="na"&gt;globalRead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;
    &lt;span class="c1"&gt;# localRead: required — always read when using this extension's skills&lt;/span&gt;
    &lt;span class="c1"&gt;# localRead: auto — read as needed&lt;/span&gt;
    &lt;span class="na"&gt;localRead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required&lt;/span&gt;

  &lt;span class="c1"&gt;# Artifact file — created on installation, then belongs to the project&lt;/span&gt;
  &lt;span class="na"&gt;my-extension/config.yaml&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;extension's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;configuration&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;project."&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;artifact&lt;/span&gt;
    &lt;span class="na"&gt;globalRead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
    &lt;span class="na"&gt;localRead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;

&lt;span class="c1"&gt;# Extension skills (sources live in extsrc/skills/)&lt;/span&gt;
&lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my-skill.md&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-skill&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Skill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;what&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;agent&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;does&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;invoked."&lt;/span&gt;
    &lt;span class="c1"&gt;# Files the agent must read before executing the skill&lt;/span&gt;
    &lt;span class="na"&gt;required-read&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;my-extension/process.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validation and publication
&lt;/h3&gt;

&lt;p&gt;Validating an extension before publication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension check ./my-extension
spawn extension check ./my-extension &lt;span class="nt"&gt;--strict&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installing a ready extension into a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension add https://github.com/your-org/your-extension.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A complete description of the extension model (all &lt;code&gt;config.yaml&lt;/code&gt; fields, static vs artifact content, lifecycle scripts, etc.) is in the &lt;a href="https://github.com/noant/spawn-cli/blob/main/spec/design/extension-author-guide.md" rel="noopener noreferrer"&gt;extension-author-guide&lt;/a&gt; in the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Packaging local rules into an extension
&lt;/h3&gt;

&lt;p&gt;If you already have local rules in &lt;code&gt;spawn/rules/&lt;/code&gt; and want to package them into an extension (e.g. to reuse in other projects):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spawn extension from-rules ./repo-with-spawn-rules &lt;span class="nt"&gt;--name&lt;/span&gt; my-ext &lt;span class="nt"&gt;--output&lt;/span&gt; ./out
&lt;span class="c"&gt;# or from a remote repository:&lt;/span&gt;
spawn extension from-rules https://github.com/org/my-repo.git &lt;span class="nt"&gt;--name&lt;/span&gt; my-ext &lt;span class="nt"&gt;--output&lt;/span&gt; ./out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contact the author
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spawn CLI source code:&lt;/strong&gt; &lt;a href="https://github.com/noant/spawn-cli" rel="noopener noreferrer"&gt;github.com/noant/spawn-cli&lt;/a&gt; — issues are welcome, let's discuss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct contact:&lt;/strong&gt; &lt;a href="mailto:anton.novgorodcev@gmail.com"&gt;anton.novgorodcev@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks, everyone!&lt;/p&gt;

&lt;p&gt;P.S. Below is a diagram that might help you understand how Spawn works.&lt;br&gt;
&lt;a href="https://github.com/noant/spawn-cli/blob/main/logo/Scheme.png?raw=true" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffqsjrixgf9g0plckly3s.png" alt="Scheme" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>development</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
