<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Иван Дачев</title>
        <description>Пътуването на Иван Дачев през пътя на неговата сегашна инкарнация.</description>
        <link>https://ivandachev.com/</link>
        <atom:link href="https://ivandachev.com/bg/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Tue, 03 Nov 2026 16:19:42 +0000</pubDate>
        <lastBuildDate>Tue, 03 Nov 2026 16:19:42 +0000</lastBuildDate>
        <generator>Jekyll v4.3.4</generator>
        
            <item>
                <title>AI Workshop за адвокатски кантори</title>
                <description>&lt;p&gt;Провеждам практически workshop за адвокатски кантори, които искат да ползват AI в ежедневната си
работа: прегледи на договори, хронологии по дела, справки и писма до клиенти. Работим с
&lt;strong&gt;Claude Cowork в Claude Desktop&lt;/strong&gt; и с &lt;strong&gt;Gemini Notebook (бивш NotebookLM)&lt;/strong&gt;. AI прави черновата,
а адвокатът проверява и подписва.&lt;/p&gt;

&lt;p&gt;Принципите са същите като в моя &lt;a href=&quot;/bg/blog/ai-coding-workshop&quot;&gt;AI Coding Workshop&lt;/a&gt; за софтуерни
екипи: кратки инструкции за AI, малък проверен набор от инструменти, задание преди работа,
проверка от човек и учене от всяка сесия. Тук няма код. Работим с папка с документи по дело.&lt;/p&gt;

&lt;p&gt;Claude Cowork е режимът, в който Claude работи с файловете в папка, която сте избрали. От
16.09.2026 той е част от обикновения разговор в Claude и не се избира отделно
(&lt;a href=&quot;https://claude.com/blog/cowork-is-now-claude&quot;&gt;Anthropic&lt;/a&gt;). Gemini Notebook е инструментът на
Google за работа по документите, които сте качили. Google преименува NotebookLM на Gemini Notebook
на 16.07.2026 (&lt;a href=&quot;https://blog.google/innovation-and-ai/products/gemini-notebook/notebooklm-gemini-notebook/&quot;&gt;Google&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;защо-сега&quot;&gt;Защо сега&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;AI грамотност по член 4 от EU AI Act.&lt;/strong&gt; Задължението важи от 2.02.2025, а надзорът – от
2.08.2026. То засяга и организациите, които ползват AI системи в работата си, и се отнася до
хората, които ги ползват от тяхно име. Според Европейската комисия сертификат не е нужен, не се
изисква определено ниво, а организацията може да пази вътрешен запис за обученията. Измененията от
Digital Omnibus са в сила от средата на юли 2026
(&lt;a href=&quot;https://digital-strategy.ec.europa.eu/en/faqs/ai-literacy-questions-answers&quot;&gt;Европейска комисия, Q&amp;amp;A за AI грамотността&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Насоки на CCBE за адвокати (2 октомври 2025).&lt;/strong&gt; Без лични, поверителни или други данни на
клиента в AI инструмента, освен ако има подходящи гаранции. Проверка на резултата, преди да се
ползва. Прозрачност към клиента, когато може да се очаква, че информиран клиент би възразил,
би поставил условия или би имал резерви към използването на AI
(&lt;a href=&quot;https://www.ccbe.eu/fileadmin/speciality_distribution/public/documents/IT_LAW/ITL_Guides_recommendations/EN_ITL_20251002_CCBE-guide-on-the-use-of-the-use-of-generative-AI-for-lawyers.pdf&quot;&gt;CCBE guide on the use of generative AI by lawyers&lt;/a&gt;).
Това са насоки на професионална организация, а не задължителни правила в България.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Насоки на UIA (Международния съюз на адвокатите), публикувани в превод на сайта на Висшия
адвокатски съвет.&lt;/strong&gt; Прочетете условията на AI системата. Когато е възможно, изберете система,
която не пази въведената информация. Ако това не е възможно, анонимизирайте данните
(&lt;a href=&quot;https://vas.bg/p/n/a/nasoki-uia-13638.pdf&quot;&gt;Насоки на UIA&lt;/a&gt;). И това са насоки на професионална
организация. Публикуването им на сайта на ВАдвС не значи, че съветът ги е приел като правила.
Claude и Gemini Notebook пазят въведеното, затова в workshop-а прилагаме втората част:
анонимизирани документи и одобрение от кантората.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Реален пример за риска.&lt;/strong&gt; В делото Al-Haroun, решено заедно с Ayinde от английски съд на
6.06.2025, 18 от 45-те цитирани съдебни решения не съществуват
(&lt;a href=&quot;https://caselaw.nationalarchives.gov.uk/ewhc/admin/2025/1383&quot;&gt;Ayinde v Haringey, [2025] EWHC 1383 (Admin)&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Инструментите вече са тук.&lt;/strong&gt; На 12.05.2026 Anthropic пусна 12 правни plugins, налични в Claude
Cowork (&lt;a href=&quot;https://claude.com/blog/claude-for-the-legal-industry&quot;&gt;Anthropic&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;за-кого-е&quot;&gt;За кого е&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Съдружници и управляващи адвокати, които искат общи правила за AI в кантората.&lt;/li&gt;
  &lt;li&gt;Адвокати и младши адвокати, които работят с много документи.&lt;/li&gt;
  &lt;li&gt;Помощници и офис мениджъри, които подготвят справки и кореспонденция.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;формат-и-продължителност&quot;&gt;Формат и продължителност&lt;/h2&gt;

&lt;p&gt;Workshop-ът може да бъде &lt;strong&gt;на място&lt;/strong&gt; във вашата кантора или &lt;strong&gt;online&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Форматът е &lt;strong&gt;2 сесии по 2 часа&lt;/strong&gt;. Настройката на акаунтите става преди първата сесия, за да остане
времето за практика. Програмата и темпото се адаптират за всяка кантора. Броят на участниците и
езикът на workshop-а уточняваме при първия разговор.&lt;/p&gt;

&lt;h2 id=&quot;програмата&quot;&gt;Програмата&lt;/h2&gt;

&lt;p&gt;Workshop-ът следва един цикъл от десет стъпки. Последната стъпка захранва първата, така че
правилата на кантората стават по-добри след всеки цикъл.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;theme-light-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-29-ai-workshop-law-firms-cycle-bg.jpg&quot; alt=&quot;Десет стъпки, един цикъл: от поверителност до политика за AI&quot; /&gt;
&lt;img class=&quot;theme-dark-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-29-ai-workshop-law-firms-cycle-bg-dark.jpg&quot; alt=&quot;Десет стъпки, един цикъл: от поверителност до политика за AI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Основата на упражненията е едно измислено дело: две версии на договор, кореспонденция, решение
на първа инстанция, бележки от среща с клиента и NDA.&lt;/p&gt;

&lt;h3 id=&quot;сесия-1--безопасна-основа&quot;&gt;Сесия 1 – безопасна основа&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Поверителност и настройка на акаунта.&lt;/strong&gt; Разделяме четири въпроса. Ползват ли се данните за
обучение на модели? Къде върви работата – в облака или на вашия компютър? Къде моделът обработва
документите? Къде се съхраняват данните? Определяме и какво никога не влиза в AI.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Инструкции за Claude.&lt;/strong&gt; Кратки общи инструкции за кантората и инструкции за папката на делото:
кои сте, какъв стил и език ползвате и какво Claude никога не прави. Първата версия пишем с Claude,
после я съкращаваме на ръка.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-29-ai-workshop-law-firms-001.jpg&quot; alt=&quot;Илюстрация: Claude записва инструкции за папката на измисленото дело&quot; /&gt;
&lt;em&gt;Илюстрация на работата в Claude Cowork с измисленото дело. Не е екран от реалния продукт.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Проект за всяко дело.&lt;/strong&gt; Проектът в Cowork има свои файлове, инструкции и памет. Работим върху
копия, не върху оригинали. Отделният проект сам по себе си не изолира делата: паметта на проекта
се споделя с разговорите извън проекти, докато не я изключите
(&lt;a href=&quot;https://support.claude.com/en/articles/14116274-organize-your-tasks-with-projects-in-claude-cowork&quot;&gt;Anthropic&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Правни plugins.&lt;/strong&gt; Показваме малък проверен набор. Например Legal plugin има команди за преглед
на договор и за първичен преглед на NDA. Самата Anthropic пише, че резултатите трябва да се
проверят от правоспособен адвокат (&lt;a href=&quot;https://claude.com/marketplace/plugins/legal&quot;&gt;Legal plugin&lt;/a&gt;). Проверяваме
дали plugin-ът пасва на българското право и го адаптираме.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Gemini Notebook – отговори, основани на вашите източници.&lt;/strong&gt; Качваме закони, съдебна практика и
документите по делото. Google описва отговорите в чата като отговори с цитати към източниците и
сам пише, че инструментът може да греши
(&lt;a href=&quot;https://support.google.com/notebooklm/answer/16164461&quot;&gt;Google&lt;/a&gt;). Затова отговор без цитат не
приемаме, а при всеки цитат проверяваме пасажа и дали източникът е в сила. Audio Overview на
български дава бърз преглед на делото.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-29-ai-workshop-law-firms-004.jpg&quot; alt=&quot;Gemini Notebook отговаря на български с номерирани цитати към двете версии на измисления договор&quot; /&gt;
&lt;em&gt;Gemini Notebook с измисленото дело: отговор с номерирани цитати към източниците. Вдясно е
двуминутен Audio Overview на български за клаузите във вреда на клиента.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;сесия-2--чернова-проверка-процес&quot;&gt;Сесия 2 – чернова, проверка, процес&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Задание преди работа.&lt;/strong&gt; Шаблон с цел, какво не влиза, източници и как изглежда добрият
резултат. Claude първо предлага план, а вие го одобрявате.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Cowork прави черновата.&lt;/strong&gt; Основното упражнение: сравнение на две версии на договор и
хронология по делото от кореспонденцията. Claude иска изрично разрешение, преди да изтрие
окончателно файл. Участникът одобрява всяко изтриване и всичко, което излиза навън.&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-29-ai-workshop-law-firms-002.jpg&quot; alt=&quot;Илюстрация: таблица с променените клаузи между двете версии на договора&quot; /&gt;&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-29-ai-workshop-law-firms-003.jpg&quot; alt=&quot;Илюстрация: хронология по делото с дата, час, събитие и източник&quot; /&gt;
&lt;em&gt;Илюстрации на работата в Claude Cowork с измисленото дело. Не са екрани от реалния продукт.
Бележките „Да провери адвокатът“ показват места за човешка проверка. Проверяваме и останалия
резултат.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Проверка.&lt;/strong&gt; Не само цитатите. Проверяваме дали фактите са верни и пълни и дали резултатът
изпълнява заданието. Всяка препратка се сверява с оригинала. Втори преглед правим в нова сесия.
Последната дума е на адвоката, който подписва.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Учене и споделяне.&lt;/strong&gt; Кратка ретроспекция след всяка задача: какво поправих повече от веднъж?
Повтарящите се поправки стават правила или skills – запазени инструкции за повтаряща се задача,
които Claude ползва отново. Всеки общ skill има собственик и версия и се
проверява, преди да стане достъпен за цялата кантора.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Политика за AI и запис за обучението.&lt;/strong&gt; Чернова на политика за AI на една страница и списък
на участниците. Те са подкрепящ запис за мерките по член 4, а не гаранция за съответствие.
Политиката захранва стъпка 1 при следващия цикъл.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;вашите-документи&quot;&gt;Вашите документи&lt;/h2&gt;

&lt;p&gt;Упражненията вървят с измисленото дело. Документи на кантората ползваме само ако кантората го
одобри и при тези условия. Тогава те заменят измисления договор във втората половина на стъпка 7 и
в стъпка 8.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Подходящи акаунти.&lt;/strong&gt; Claude на Team или Enterprise план и Google Workspace акаунт за Gemini
Notebook. На търговските планове на Anthropic входът и изходът не се ползват за обучение по
подразбиране. Изключение е обратната връзка (палец нагоре или надолу), която собственикът
(owner) на акаунта може да изключи (&lt;a href=&quot;https://privacy.claude.com/en/articles/7996868-is-my-data-used-for-model-training&quot;&gt;Anthropic&lt;/a&gt;).
При Workspace акаунт Google не ползва данните в Gemini Notebook за обучение и хора не ги
преглеждат (&lt;a href=&quot;https://support.google.com/gemininotebook/answer/17004255&quot;&gt;Google&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Преглед преди качване.&lt;/strong&gt; За предпочитане са шаблони и вътрешни образци без данни на клиенти.
Всичко останало се анонимизира и се одобрява от кантората.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Изключени памет и обратна връзка.&lt;/strong&gt; Паметта се изключва за проекта. Обратната връзка
собственикът изключва за цялата организация („Rate chats“ в Organization settings &amp;gt; Data and
Privacy). И двете стават, преди да влязат документи на кантората.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Без пароли и търговски тайни&lt;/strong&gt;, в никакъв случай.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Лицензи.&lt;/strong&gt; Текстове от платени правни бази данни влизат само ако лицензът изрично позволява
качване и обработка в друга услуга. Иначе ползваме официални публични източници.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Важно е да е ясно какво значи „локално“. В Cowork работата върви или в облака, на сървърите на
Anthropic, или локално, на вашия компютър. „Локално“ значи само, че файловете и самата работа
остават на компютъра. За да прочете документа, моделът пак получава съдържанието му на сървърите на
Anthropic. Затова „локално“ не значи, че данните не излизат от компютъра.&lt;/p&gt;

&lt;p&gt;От 6.10.2026 новите задачи на Pro и Max планове вървят в облака
(&lt;a href=&quot;https://support.claude.com/en/articles/15520349-use-claude-cowork-on-web-desktop-and-mobile&quot;&gt;Anthropic&lt;/a&gt;).
На Team план собственикът може да изключи облачните сесии. При локални сесии историята на разговорите
остава на компютрите на потребителите
(&lt;a href=&quot;https://support.claude.com/en/articles/13455879-use-claude-cowork-on-team-and-enterprise-plans&quot;&gt;Anthropic&lt;/a&gt;).
Anthropic посочва, че данните на търговските продукти се съхраняват в САЩ
(&lt;a href=&quot;https://privacy.claude.com/en/articles/7996890-where-are-your-servers-located-do-you-host-your-models-on-eu-servers&quot;&gt;Anthropic&lt;/a&gt;).
Преценката по GDPR – договорът за обработка с доставчика и основанието за трансфер извън ЕС – е на
кантората. В стъпка 1 я поставяме като въпрос, но workshop-ът не я замества.&lt;/p&gt;

&lt;p&gt;Тези мерки намаляват риска, но не са гаранция за поверителност: план, на който данните не се
ползват за обучение, изключени обратна връзка и памет, анонимизирани документи и одобрение от
кантората. Кантората преценява дали са достатъчни за конкретните документи и за професионалните ѝ
задължения.&lt;/p&gt;

&lt;h2 id=&quot;какво-да-очаквате&quot;&gt;Какво да очаквате&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Практика върху измислено дело.&lt;/strong&gt; Всеки участник минава целия цикъл с реални инструменти, без
риск за тайната на клиент.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Настройка, която остава в кантората.&lt;/strong&gt; Инструкции за Claude, шаблон за задание и първите общи
skills.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Навик за проверка.&lt;/strong&gt; Всеки цитат и всеки факт се проверява в оригинала.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Чернова на политика за AI&lt;/strong&gt; и списък на участниците като подкрепящ запис по член 4.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Време за въпроси.&lt;/strong&gt; Всяка сесия има време за вашите въпроси и типични ситуации, без данни на
клиенти.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;какво-трябва-на-участниците&quot;&gt;Какво трябва на участниците&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Лаптоп с инсталиран Claude Desktop.&lt;/li&gt;
  &lt;li&gt;Платен Claude план. За документи на кантората – Team или Enterprise.&lt;/li&gt;
  &lt;li&gt;Google акаунт. За документи на кантората – Google Workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;връзка-с-мен&quot;&gt;Връзка с мен&lt;/h2&gt;

&lt;p&gt;Програмата, темпото и примерите се адаптират за всяка кантора. За дати, формат и цена
&lt;a href=&quot;/contact/&quot;&gt;изпратете ми съобщение&lt;/a&gt; или ми пишете в
&lt;a href=&quot;https://www.linkedin.com/in/ivan-dachev-a506041a&quot;&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Информацията за продуктите и правилата е към 29.10.2026.&lt;/em&gt;&lt;/p&gt;
</description>
                <pubDate>Thu, 29 Oct 2026 05:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/ai-workshop-law-firms</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/ai-workshop-law-firms</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>AI Coding Workshop</title>
                <description>&lt;p&gt;Провеждам практически workshop за софтуерни екипи, които искат да минат от хаотично
експериментиране с prompts към ясен и повторяем работен процес с AI coding agents. Показвам го
основно с Claude Code, а същият процес работи и за екипи с GitHub Copilot.&lt;/p&gt;

&lt;p&gt;Досега съм го провел в над 7 компании, сред които:&lt;/p&gt;

&lt;div class=&quot;logo-strip&quot;&gt;
  &lt;a href=&quot;https://www.invendagroup.com/&quot; title=&quot;Invenda Group&quot;&gt;&lt;img class=&quot;theme-light-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-invenda.svg&quot; alt=&quot;Invenda Group&quot; /&gt;&lt;img class=&quot;theme-dark-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-invenda-dark.svg&quot; alt=&quot;Invenda Group&quot; /&gt;&lt;/a&gt;
  &lt;a href=&quot;https://www.bosch.bg/our-company/bosch-in-bulgaria/bosch-digital/&quot; title=&quot;Bosch Digital&quot;&gt;&lt;img class=&quot;theme-light-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-bosch.svg&quot; alt=&quot;Bosch Digital&quot; /&gt;&lt;img class=&quot;theme-dark-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-bosch-dark.svg&quot; alt=&quot;Bosch Digital&quot; /&gt;&lt;/a&gt;
  &lt;a href=&quot;https://www.fourth.com/&quot; title=&quot;Fourth&quot;&gt;&lt;img class=&quot;theme-light-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-fourth.svg&quot; alt=&quot;Fourth&quot; /&gt;&lt;img class=&quot;theme-dark-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-fourth-dark.svg&quot; alt=&quot;Fourth&quot; /&gt;&lt;/a&gt;
  &lt;a href=&quot;https://ship.cars/&quot; title=&quot;Ship.Cars&quot;&gt;&lt;img class=&quot;theme-light-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-shipcars.svg&quot; alt=&quot;Ship.Cars&quot; /&gt;&lt;img class=&quot;theme-dark-only&quot; src=&quot;/images/posts/software/2026/10/2026-10-25-ai-coding-workshop-logo-shipcars-dark.svg&quot; alt=&quot;Ship.Cars&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Добра представа за съдържанието дават лекциите ми на
&lt;a href=&quot;/blog/basscom-ai-conf-claude-code-for-experts&quot;&gt;BASSCOM AI Conference 2026&lt;/a&gt; и на
&lt;a href=&quot;/blog/cotransition-coding-with-ai-agents&quot;&gt;срещата на CoTransition&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;за-кого-е&quot;&gt;За кого е&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Екипи от разработчици, които вече ползват AI агенти или тепърва започват.&lt;/li&gt;
  &lt;li&gt;Екипи с Claude Code, GitHub Copilot или и двете.&lt;/li&gt;
  &lt;li&gt;Tech leads и архитекти, които искат една обща настройка и ясни правила за целия екип.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;формат-и-продължителност&quot;&gt;Формат и продължителност&lt;/h2&gt;

&lt;p&gt;Workshop-ът може да бъде &lt;strong&gt;на място&lt;/strong&gt; във вашия офис или &lt;strong&gt;online&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Обичайният формат е &lt;strong&gt;2 сесии по 2 часа&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;На някои екипи им трябва по-бавно темпо. За тях го разделям на &lt;strong&gt;4 сесии по 1,5 часа&lt;/strong&gt;. Крайният
план зависи от екипа: колко бързо възприема новия процес, какъв опит има с AI агенти и каква е
аудиторията – разработчици, QA, tech leads или мениджъри.&lt;/p&gt;

&lt;p&gt;Преди workshop-а уточняваме технологичния stack (например Java, Angular, Python), за да пасват
примерите и настройките на вашите проекти.&lt;/p&gt;

&lt;h2 id=&quot;програмата&quot;&gt;Програмата&lt;/h2&gt;

&lt;p&gt;Workshop-ът следва един цикъл от десет стъпки. Последната стъпка захранва първата, така че
настройката става по-добра след всяка сесия.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-002.jpg&quot; alt=&quot;Десет стъпки, един цикъл&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Context файлове – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AGENTS.md&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt; Кратки са, сочат към документацията, вместо да
я копират, и съдържат командите за build и test и правилата „никога не прави“. Първата версия се
генерира с агента, после се съкращава на ръка. За по-големи repos и monorepos се добавят файлове
за всеки модул. Проверка: молим агента да обясни проекта и сверяваме отговора.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Skills и MCP servers.&lt;/strong&gt; Инсталираме правилните за вашия stack, проверяваме ги за сигурност и
пускаме само това, което проектът ползва. Започваме с малък базов набор и го настройваме на ниво
проект, за да има целият екип еднаква настройка. Твърде много tools правят агента по-бавен и
по-неточен.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Jira и GitHub в работния процес.&lt;/strong&gt; Свързваме външните tools с tokens с минимални права, само
за четене, където може. Потокът е Jira ticket → spec → branch → pull request, свързан обратно с
ticket-а. Решаваме какво агентът прави сам и какво изисква одобрение от човек.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Планиране и спецификация.&lt;/strong&gt; Агентът първо оценява обхвата в repo-то. Ползваме шаблон за spec:
цел, какво не влиза, критерии за приемане, план за тестове. Един spec за всяка област, работата
през няколко repos се разделя, а прекалено сложните планове се орязват. Спираме на spec-а и го
преглеждаме в нова сесия, преди да има код.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Agents, subagents и advisor.&lt;/strong&gt; Subagents се ползват за паралелно проучване и за да остане
основният context чист. Един агент или сесия за всеки spec. Без твърде много агенти – иначе
решенията трудно се проследяват.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Имплементация.&lt;/strong&gt; Първо тестове (TDD), една стъпка от плана наведнъж, commit след всяка стъпка
и hooks за lint и тестове. Агентът не променя тестове, за да минат, без одобрение. Git worktrees
за паралелни агенти и нова сесия, когато агентът започне да се върти в кръг.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Проверка и code review.&lt;/strong&gt; CI трябва да мине: build, тестове, lint, coverage. Тестове за
архитектурата (например ArchUnit) проверяват автоматично правилата на clean architecture. AI прави
review първо в нова сесия, а последното review е на човек.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Учене от сесиите.&lt;/strong&gt; Кратка ретроспекция след всяка сесия: какво поправих повече от веднъж?
Повтарящите се поправки стават правила или skills. Файловете се чистят редовно, за да не
растат прекалено.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Private plugins и marketplace.&lt;/strong&gt; Знанието, което работи, се пакетира в private plugins и
skills. Решаваме какво остава в repo-то и какво става общо за компанията. Всеки plugin има
собственик и версия, а skills се тестват, преди да се публикуват за екипа.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Същият процес за Copilot.&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AGENTS.md&lt;/code&gt; е общата основа. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt; и инструкциите за
Copilot сочат към него. Минаваме кои стъпки са еднакви и къде Copilot се различава.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;какво-да-очаквате&quot;&gt;Какво да очаквате&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Практическа работа, не само слайдове.&lt;/strong&gt; Работим по реални примери, а където може – по вашите
repositories.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Настройка, която остава в екипа.&lt;/strong&gt; Всеки екип излиза с работещи context файлове, базов набор от
skills и tools, настроени на ниво проект, и шаблон за spec.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ясни правила за сигурност.&lt;/strong&gt; Tokens с минимални права, какво агентът прави сам и къде винаги
трябва одобрение от човек – merge, deploy, production.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Цикъл, който продължава да се подобрява.&lt;/strong&gt; Екипът се учи да превръща своите повтарящи се
поправки в правила и skills и след края на workshop-а.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Време за въпроси.&lt;/strong&gt; Всяка сесия има време за Q&amp;amp;A и за вашите конкретни случаи.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;какво-трябва-на-участниците&quot;&gt;Какво трябва на участниците&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Лаптоп с инсталиран и работещ Claude Code или GitHub Copilot.&lt;/li&gt;
  &lt;li&gt;Достъп до repository за упражнения – реален проект или примерен.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;връзка-с-мен&quot;&gt;Връзка с мен&lt;/h2&gt;

&lt;p&gt;Програмата, темпото и примерите се адаптират за всеки екип. За дати, формат и цена
&lt;a href=&quot;/contact/&quot;&gt;изпратете ми съобщение&lt;/a&gt; или ми пишете в
&lt;a href=&quot;https://www.linkedin.com/in/ivan-dachev-a506041a&quot;&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Sun, 25 Oct 2026 05:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/ai-coding-workshop</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/ai-coding-workshop</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>Coding with AI Agents</title>
                <description>&lt;p&gt;На 22 октомври 2026 г. бях гост на
&lt;a href=&quot;https://online.cotransition.net/products/communities/v2/cotransitionagilemanagement/meetup/1c034a2d-f33a-4cf6-bfb3-687d8bbeab77&quot;&gt;среща на живо на общността CoTransition – Agile Management&lt;/a&gt;
в Campus X (VISA Innovation Hub) в София. Вечерта беше за разликата между хаотичното
експериментиране с prompts и вграждането на Claude Code в ежедневната engineering работа, с реални
примери от работата ми в Ship.Cars USA, а после – Q&amp;amp;A и дискусия.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.cotransition.net/&quot;&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-cotransition-logo.png&quot; alt=&quot;CoTransition&quot; class=&quot;theme-light-only&quot; style=&quot;width: 320px&quot; /&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-cotransition-logo-dark.png&quot; alt=&quot;CoTransition&quot; class=&quot;theme-dark-only&quot; style=&quot;width: 320px&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Започнах с кратка презентация: &lt;strong&gt;Coding with AI Agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Основната идея се събира в един ред:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Hand over the whole task. Give it a way to check. Own what ships.&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;Дайте на агента цялата задача. Дайте му начин да се провери. Вие отговаряте за това, което
отива в production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;презентацията&quot;&gt;Презентацията&lt;/h2&gt;

&lt;p&gt;Цялата презентация можете да разгледате тук. Тя върви сама. Кликнете в нея, за да я спрете и да ползвате стрелките:&lt;/p&gt;

&lt;div class=&quot;deck-player&quot; id=&quot;deck-images-posts-software-2026-10-2026-10-22-cotransition-coding-with-ai-agents-slides-html&quot;&gt;
  &lt;div class=&quot;deck-player__frame&quot;&gt;
    &lt;iframe class=&quot;reframe-off&quot; src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-slides.html&quot; title=&quot;Coding with AI Agents&quot; allow=&quot;fullscreen&quot;&gt;&lt;/iframe&gt;
    &lt;button type=&quot;button&quot; class=&quot;deck-player__toggle deck-player__toggle--top-right&quot;&gt;⏸ Пауза&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
  (function () {
    const root = document.getElementById(&apos;deck-images-posts-software-2026-10-2026-10-22-cotransition-coding-with-ai-agents-slides-html&apos;);
    const frame = root.querySelector(&apos;iframe&apos;);
    const toggle = root.querySelector(&apos;.deck-player__toggle&apos;);
    const stepMs = 1250;
    const slideMs = 3000;
    const liveMs = 8000;
    const labelPlay = &apos;▶ Пусни&apos;;
    const labelPause = &apos;⏸ Пауза&apos;;

    let timer = null;
    let userPaused = false;
    let visible = false;
    let slides = [];
    let slide = 0;
    let presses = 0;

    function deckWindow() {
      return frame.contentWindow;
    }

    function readSlides() {
      if (slides.length &gt; 0) {
        return;
      }
      try {
        const motion = deckWindow().document.getElementById(&apos;deck-motion&apos;);
        slides = JSON.parse(motion.textContent).slides.map((s) =&gt; ({
          steps: (s.steps || []).length || 1,
          live: (s.embeds || []).length &gt; 0,
        }));
      } catch (e) {
        slides = [];
      }
    }

    function syncSlide() {
      const now = parseInt(deckWindow().location.hash.slice(1), 10) || 1;
      if (now !== slide) {
        slide = now;
        presses = 0;
      }
      return slides[slide - 1] || { steps: 1, live: false };
    }

    function delay() {
      const current = syncSlide();
      if (presses &lt; current.steps - 1) {
        return stepMs;
      }
      return current.live ? liveMs : slideMs;
    }

    function pressKey(key) {
      deckWindow().document.dispatchEvent(new KeyboardEvent(&apos;keydown&apos;, { key: key, code: key, bubbles: true }));
    }

    function advance() {
      if (slide === slides.length &amp;&amp; presses &gt;= slides[slide - 1].steps - 1) {
        pressKey(&apos;Home&apos;);
        slide = 0;
        return;
      }
      presses++;
      pressKey(&apos;ArrowRight&apos;);
    }

    function schedule() {
      timer = setTimeout(function () {
        syncSlide();
        advance();
        schedule();
      }, delay());
    }

    function update() {
      const shouldPlay = visible &amp;&amp; !document.hidden &amp;&amp; !userPaused &amp;&amp; slides.length &gt; 0;
      if (shouldPlay &amp;&amp; !timer) {
        schedule();
      } else if (!shouldPlay &amp;&amp; timer) {
        clearTimeout(timer);
        timer = null;
      }
      toggle.hidden = slides.length === 0;
      toggle.textContent = userPaused ? labelPlay : labelPause;
    }

    function pauseByUser(event) {
      if (event.isTrusted &amp;&amp; !userPaused) {
        userPaused = true;
        update();
      }
    }

    toggle.addEventListener(&apos;click&apos;, function () {
      userPaused = !userPaused;
      update();
    });

    function onDeckLoad() {
      readSlides();
      deckWindow().addEventListener(&apos;keydown&apos;, pauseByUser, true);
      deckWindow().addEventListener(&apos;pointerdown&apos;, pauseByUser, true);
      update();
    }

    if (frame.contentDocument &amp;&amp; frame.contentDocument.readyState === &apos;complete&apos; &amp;&amp; deckWindow().location.href !== &apos;about:blank&apos;) {
      onDeckLoad();
    } else {
      frame.addEventListener(&apos;load&apos;, onDeckLoad);
    }

    document.addEventListener(&apos;visibilitychange&apos;, update);

    new IntersectionObserver(
      function (entries) {
        visible = entries[0].intersectionRatio &gt;= 0.5;
        update();
      },
      { threshold: 0.5 }
    ).observe(frame);
  })();
&lt;/script&gt;

&lt;p&gt;Ако вграденият изглед по-горе не се зарежда, отворете я като отделна страница или свалете файла:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-slides.html&quot;&gt;Отвори в браузъра (HTML)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-slides.pdf&quot;&gt;Свали PDF&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-slides.pptx&quot;&gt;Свали PowerPoint (PPTX)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Показах и
&lt;strong&gt;&lt;a href=&quot;https://mentorano.github.io/ai-marketplace-mentorano/captain/?lang=bg&quot;&gt;Капитана&lt;/a&gt;&lt;/strong&gt; – plugin за
Claude Code, в който една сесия командва екип от background agents. Капитана разделя работата,
пуска агентите паралелно, праща всеки diff на review и ви пита само за важното.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mentorano.github.io/ai-marketplace-mentorano/captain/?lang=bg&quot;&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-captain-banner-bg.png&quot; alt=&quot;Как работи Капитана&quot; class=&quot;theme-light-only&quot; /&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-captain-banner-bg-dark.png&quot; alt=&quot;Как работи Капитана&quot; class=&quot;theme-dark-only&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-changed-по-малко-prompting-не-повече&quot;&gt;What changed: по-малко prompting, не повече&lt;/h2&gt;

&lt;p&gt;Новите модели искат по-малко prompting, не повече:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Започнете с medium effort.&lt;/strong&gt; Качвайте effort само когато измерите реален gain.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Дългите autonomous runs работят&lt;/strong&gt; – с часове, ако агентът има ясен finish line.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Голям context window&lt;/strong&gt; – от 500K до 1M tokens според модела, а thinking е вграден.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Затова можете да махнете от prompts редове като &lt;em&gt;„think carefully“&lt;/em&gt;, &lt;em&gt;„double-check your answer“&lt;/em&gt;
или &lt;em&gt;„use a subagent to verify“&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;три-правила-за-всяка-сесия&quot;&gt;Три правила за всяка сесия&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Whole task, clear finish line.&lt;/strong&gt; Например: &lt;em&gt;„Done means: всички endpoints са мигрирани,
старият client е изтрит, тестовете минават.“&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Въртете effort dial-а, без „think hard“.&lt;/strong&gt; Съвременните модели винаги мислят. Effort
решава колко.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Първо четете „needs your decision“.&lt;/strong&gt; Слагайте кратки ID на всеки въпрос, за да отговаряте
с „Q2 да, OP1 не“.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;ten-steps-one-loop&quot;&gt;Ten steps, one loop&lt;/h2&gt;

&lt;p&gt;Workflow-ът не е вързан за един tool. Работи и с Claude Code, и с GitHub Copilot.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-002.jpg&quot; alt=&quot;Ten steps, one loop&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Context files&lt;/strong&gt; – кратки, със stop rule. Проверете всеки ред: ако го махнете, ще стане ли
грешка? Ако не – махнете го.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Skills, MCP, plugins&lt;/strong&gt; – зареждат се on demand, малко tools. Context-ът е ограниченият
ресурс. Предпочитайте CLI tools като &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gh&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcloud&lt;/code&gt; и проверявайте всеки plugin като package.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Jira и GitHub&lt;/strong&gt; – от ticket до pull request, с least-privilege tokens. Агентът прави draft,
човекът прави merge и сменя статусите.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Spec и review&lt;/strong&gt; – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SPEC.md&lt;/code&gt; с ясен finish line. Оставете Claude да ви интервюира, после
имплементирайте spec-а в нова сесия.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Agents и advisor&lt;/strong&gt; – давайте голямата работа паралелно на subagents и оставете observer
agent да следи за тихи решения и false success.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt; – tests first, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TASKS.md&lt;/code&gt;, който оцелява след context compaction, и hooks, които
пускат lint и тестове при всяка промяна.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Verify&lt;/strong&gt; – green не значи verified. Review на няколко нива, а не един gate.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Learn&lt;/strong&gt; – повторена корекция става правило в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt;, skill, hook или lint rule.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Marketplace&lt;/strong&gt; – пакетирайте това, което работи, като private plugin с owner и version.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Copilot parity&lt;/strong&gt; – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AGENTS.md&lt;/code&gt; като обща основа за Claude Code и Copilot.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Стъпка 8 захранва стъпка 1, така loop-ът става по-добър всеки път.&lt;/p&gt;

&lt;h2 id=&quot;tell-it-when-to-stop&quot;&gt;Tell it when to stop&lt;/h2&gt;

&lt;p&gt;Едно правило, което винаги добавям във всеки &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt;, е stop rule. Продължавай, когато
нищо не зависи от мен. Спри и питай, когато си blocked или преди нещо destructive.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-003.jpg&quot; alt=&quot;Tell it when to stop&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Production, deploy и push винаги искат вашето изрично „да“.&lt;/p&gt;

&lt;h2 id=&quot;people-where-the-risk-is&quot;&gt;People where the risk is&lt;/h2&gt;

&lt;p&gt;Не всяка промяна иска еднакво review. Risk tier-ът се определя от промяната, а не от автора:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-004.jpg&quot; alt=&quot;People where the risk is&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Low risk&lt;/strong&gt; – docs, copy, additive промени зад feature flag: без човек, щом checks са green.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Medium risk&lt;/strong&gt; – обикновени product промени: един human approval.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;High risk&lt;/strong&gt; – auth, billing, CI и другите рискови места, които посочите: два human approvals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Който е дал prompt за промяната, той е owner на нея. Bot approval никога не заменя human approval.&lt;/p&gt;

&lt;h2 id=&quot;your-checklist&quot;&gt;Your checklist&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/10/2026-10-22-cotransition-coding-with-ai-agents-005.jpg&quot; alt=&quot;Your checklist&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Ask&lt;/strong&gt; – цялата задача с finish line, без „think hard“, model и effort избрани предварително.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Long runs&lt;/strong&gt; – stop rule в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CLAUDE.md&lt;/code&gt;, context и permissions настроени преди да тръгнете,
паралелна работа по подразбиране и full test suite за всеки batch.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Check&lt;/strong&gt; – check, който агентът може да пусне, observer agent до основния, green не значи
verified.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Team&lt;/strong&gt; – повторените молби стават писани правила, няма TODO без evidence, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AGENTS.md&lt;/code&gt; като
обща основа.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Повечето от това стъпва на
&lt;a href=&quot;https://code.claude.com/docs/en/best-practices&quot;&gt;Claude Code best practices&lt;/a&gt;, prompting guides на
Anthropic и lessons learned от собствените ми сесии.&lt;/p&gt;

&lt;h2 id=&quot;впечатления-от-събитието&quot;&gt;Впечатления от събитието&lt;/h2&gt;

&lt;p&gt;Младен Томов от CoTransition написа
&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:ugcPost:7520385602358288384/&quot;&gt;пост в LinkedIn със снимки от вечерта&lt;/a&gt;.
Той обобщава основните изводи: ясна задача и ясно определение за „готово“, предварително решени
моменти, в които AI спира и пита, проверка на няколко нива и повторени корекции, които стават
правила.&lt;/p&gt;

&lt;p&gt;Благодаря на общността CoTransition за поканата и за хубавите въпроси!&lt;/p&gt;
</description>
                <pubDate>Thu, 22 Oct 2026 17:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/cotransition-coding-with-ai-agents</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/cotransition-coding-with-ai-agents</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>Claude Code for Experts на BASSCOM AI Conference 2026</title>
                <description>&lt;p&gt;На 29 април 2026 г. говорих на
&lt;a href=&quot;https://basscom-ai-conf.com/&quot;&gt;BASSCOM AI Conference 2026&lt;/a&gt; в София, в Inter Expo Center.
Конференцията беше цял ден hands-on AI за около 500 участници: специален keynote от Anthropic и
шест сесии с реални tools и practices от индустрията, без абстрактни дебати.&lt;/p&gt;

&lt;p&gt;Моята сесия беше &lt;strong&gt;Claude Code for Experts&lt;/strong&gt;: напреднали техники за хора, които вече ползват
Claude Code всеки ден и искат да извлекат повече от него.&lt;/p&gt;

&lt;h2 id=&quot;презентацията&quot;&gt;Презентацията&lt;/h2&gt;

&lt;p&gt;Цялата презентация можете да разгледате тук:&lt;/p&gt;

&lt;div style=&quot;margin-bottom: 0.5rem&quot;&gt;
&lt;iframe src=&quot;https://gamma.app/embed/6wvlu2jzln0021c&quot; style=&quot;width: 700px; max-width: 100%; height: 450px&quot; allow=&quot;fullscreen&quot; title=&quot;BASSCOM AI Conf - Claude Code&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Ако вграденият изглед по-горе не се зарежда, ползвайте PDF или PPTX файла:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gamma.app/docs/BASSCOM-AI-Conf-Claude-Code-6wvlu2jzln0021c&quot;&gt;Отвори в Gamma&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/images/posts/software/2026/04/2026-04-29-basscom-ai-conf-claude-code-for-experts-slides.pdf&quot;&gt;Свали PDF&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/images/posts/software/2026/04/2026-04-29-basscom-ai-conf-claude-code-for-experts-slides.pptx&quot;&gt;Свали PowerPoint (PPTX)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;какво-разказах&quot;&gt;Какво разказах&lt;/h2&gt;

&lt;p&gt;Лекцията имаше три части: toolbox, coding workflow и няколко по-малки hacks.&lt;/p&gt;

&lt;h3 id=&quot;toolbox&quot;&gt;Toolbox&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Agents&lt;/strong&gt; – от chat към autonomous development: plan, code, review, refine, а паралелни
subagents изпълняват задачите.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Skills и rules&lt;/strong&gt; – reusable playbooks. Зареждат се сами, когато са нужни, или ги викате със
slash command. Някои са bundled, някои са ваши custom, други са от community-то.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Subagents&lt;/strong&gt; – всеки има isolated context, собствен prompt, tools и permissions.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;MCP servers, plugins и marketplace&lt;/strong&gt; – как да разширите Claude Code и да споделите това, което
работи.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Context management&lt;/strong&gt; – context window-ът е ограниченият ресурс, затова го пазете.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;coding-workflow&quot;&gt;Coding workflow&lt;/h3&gt;

&lt;p&gt;Основата на ежедневната ми работа е един loop: &lt;strong&gt;Plan → Code → Review → Refine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/04/2026-04-29-basscom-ai-conf-claude-code-for-experts-002.jpg&quot; alt=&quot;Plan, Code, Review, Refine&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Планът е разговор, а не един prompt. Давам задача на агента. Агентът пита за open questions и аз
отговарям. След това той прави първия plan и сам прави self review.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/04/2026-04-29-basscom-ai-conf-claude-code-for-experts-003.jpg&quot; alt=&quot;Plan creation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;После идва plan review. AI показва findings, аз решавам кое е вярно, а AI оправя issues. Едва
тогава започва кодът.&lt;/p&gt;

&lt;p&gt;Няколко tools помагат много тук:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;Superpowers&lt;/a&gt; skills – brainstorming, writing plans и
systematic debugging.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/gastownhall/beads&quot;&gt;Beads&lt;/a&gt; – persistent memory за задачите между сесиите, git-native,
с dependency-aware queue от „ready“ задачи. Оцелява след context compaction.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;TDD&lt;/strong&gt; – red, green, refactor. Първо failing test, така агентът има check, който може да пусне.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Заедно това става full SDLC workflow, който агентът може да кара почти end to end:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2026/04/2026-04-29-basscom-ai-conf-claude-code-for-experts-004.jpg&quot; alt=&quot;Full SDLC Automation Workflow&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Създава git branch или worktree.&lt;/li&gt;
  &lt;li&gt;Събира plan context.&lt;/li&gt;
  &lt;li&gt;Разделя плана на tasks.&lt;/li&gt;
  &lt;li&gt;Имплементира tasks с TDD.&lt;/li&gt;
  &lt;li&gt;Пуска tests и verification.&lt;/li&gt;
  &lt;li&gt;Пуска pull request за review.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Показах и &lt;strong&gt;&lt;a href=&quot;https://worca.dev/&quot;&gt;worca&lt;/a&gt;&lt;/strong&gt; – orchestrator, който кара този процес с няколко агента.
Кодът е в GitHub: &lt;a href=&quot;https://github.com/SinishaDjukic/worca-cc&quot;&gt;SinishaDjukic/worca-cc&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;more-hacks&quot;&gt;More hacks&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Rename на сесиите&lt;/strong&gt;, за да ги намирате и продължавате после.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ползвайте status line&lt;/strong&gt; – model, context usage и git branch винаги пред очите ви.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Пазете user Claude config в git&lt;/strong&gt; – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.claude&lt;/code&gt; със skills, hooks и settings.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/rtk-ai/rtk&quot;&gt;RTK&lt;/a&gt;&lt;/strong&gt; – намалява context-а, който заема bash output-ът.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Познавайте context window-а&lt;/strong&gt; –
&lt;a href=&quot;https://code.claude.com/docs/en/context-window&quot;&gt;Context Window Insights&lt;/a&gt; в Claude Code docs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;видео-от-конференцията&quot;&gt;Видео от конференцията&lt;/h2&gt;

&lt;p&gt;BASSCOM публикува видео от конференцията, с интервюта с лекторите:&lt;/p&gt;

&lt;div style=&quot;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin-bottom: 2rem;&quot;&gt;
  &lt;iframe src=&quot;https://www.youtube.com/embed/B21Iw9PLhdU&quot; title=&quot;BASSCOM AI CONFERENCE 2026&quot; style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;&quot; allow=&quot;accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h2 id=&quot;благодаря&quot;&gt;Благодаря&lt;/h2&gt;

&lt;p&gt;Благодаря на BASSCOM и на всички, които дойдоха и зададоха въпроси. Беше страхотен ден с много
практични лекции и от другите лектори.&lt;/p&gt;
</description>
                <pubDate>Wed, 29 Apr 2026 15:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/basscom-ai-conf-claude-code-for-experts</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/basscom-ai-conf-claude-code-for-experts</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>Меденките на Баба Севда!</title>
                <description>&lt;h1 id=&quot;меденките-на-баба-севда&quot;&gt;Меденките на Баба Севда!&lt;/h1&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Еко, меко, био, мио сладки от гр. Кнежа – хита на северозапада!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Класическата българска рецепта за меденки – ароматни сладки с мед и канела, слепени по двойки с
плънка от орехи и масло. Любим вкус от детството, който винаги си остава актуален.&lt;/p&gt;

&lt;h2 id=&quot;необходими-продукти&quot;&gt;Необходими продукти&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;2 яйца&lt;/li&gt;
  &lt;li&gt;½ ч.ч. захар&lt;/li&gt;
  &lt;li&gt;½ ч.ч. мед&lt;/li&gt;
  &lt;li&gt;½ ч.ч. олио&lt;/li&gt;
  &lt;li&gt;2 ванилии&lt;/li&gt;
  &lt;li&gt;1 ч.л. сода бикарбонат&lt;/li&gt;
  &lt;li&gt;1 ч.л. канела&lt;/li&gt;
  &lt;li&gt;Брашно – колкото поеме за меко тесто&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;начин-на-приготвяне&quot;&gt;Начин на приготвяне&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Разбийте яйцата със захарта.&lt;/li&gt;
  &lt;li&gt;Добавете меда и олиото и разбъркайте добре.&lt;/li&gt;
  &lt;li&gt;Прибавете ванилията, содата и канелата.&lt;/li&gt;
  &lt;li&gt;Постепенно добавяйте брашното, докато получите меко тесто, което не лепне по ръцете.&lt;/li&gt;
  &lt;li&gt;Оформете малки топчета с големината на орех и ги подредете в тава, покрита с хартия за печене.&lt;/li&gt;
  &lt;li&gt;Печете в предварително загрята фурна на 180°C до златисто-кафяв цвят.&lt;/li&gt;
  &lt;li&gt;Докато меденките са още топли, с помощта на малка лъжичка издълбайте средата на всяка
меденка. &lt;strong&gt;Запазете всички трохи&lt;/strong&gt; – те са важна съставка за плънката.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/cooking/2026/04/2026-04-17-medenki-honey-cookies-002.jpg&quot; alt=&quot;Меденки в фурната&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;плънка&quot;&gt;Плънка&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;1 ч.ч. прясно мляко&lt;/li&gt;
  &lt;li&gt;125 г масло (1 пакетче)&lt;/li&gt;
  &lt;li&gt;½ ч.ч. смлени орехи&lt;/li&gt;
  &lt;li&gt;Издълбаните трохи от меденките&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;приготвяне-на-плънката&quot;&gt;Приготвяне на плънката&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Смесете маслото, орехите и трохите.&lt;/li&gt;
  &lt;li&gt;Постепенно добавяйте прясното мляко, докато получите гъста и еднородна смес.&lt;/li&gt;
  &lt;li&gt;Напълнете издълбаните меденки с плънката и ги слепете по двойки.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/cooking/2026/04/2026-04-17-medenki-honey-cookies-003.jpg&quot; alt=&quot;Плънка от орехи и трохи&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/cooking/2026/04/2026-04-17-medenki-honey-cookies-004.jpg&quot; alt=&quot;Издълбани меденки готови за пълнене&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;резултат&quot;&gt;Резултат&lt;/h2&gt;

&lt;p&gt;Готовите меденки стават меки отвътре, с леко хрупкава коричка отвън и богат вкус на мед и канела.
Плънката от орехи и масло ги прави още по-сочни и ароматни. Идеални са за празнична трапеза или за
почерпка с кафе.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Важно:&lt;/strong&gt; Меденките задължително трябва да престоят поне 24 часа в хладилник за да омекнат.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/cooking/2026/04/2026-04-17-medenki-honey-cookies-005.jpg&quot; alt=&quot;Слепени меденки по двойки&quot; /&gt;&lt;/p&gt;
</description>
                <pubDate>Fri, 17 Apr 2026 08:00:12 +0000</pubDate>
                <link>https://ivandachev.com/blog/medenki-honey-cookies</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/medenki-honey-cookies</guid>
                
                <category>cooking</category>
                
                
            </item>
        
            <item>
                <title>Claude Input Notify: Никога не пропускайте нотификация от Claude Code</title>
                <description>&lt;p&gt;Работата с Claude Code в терминала понякога може да доведе до пропуснати нотификации за въвеждане,
особено когато работите по няколко задачи едновременно или имате отворени множество прозорци. Затова
създадох &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude-input-notify.sh&lt;/code&gt; - прост, но ефективен shell скрипт, който създава визуални
известия винаги когато Claude Code се нуждае от вашето внимание.&lt;/p&gt;

&lt;h2 id=&quot;проблемът&quot;&gt;Проблемът&lt;/h2&gt;

&lt;p&gt;При използване на Claude Code има моменти, когато той спира и чака въвеждане от потребителя - иска
потвърждение, допълнителна информация или следващи стъпки. Ако работите в друг прозорец или сте
фокусирани върху различна задача, може да пропуснете тези prompts, оставяйки Claude да чака
безкрайно и нарушавайки работния ви процес.&lt;/p&gt;

&lt;h2 id=&quot;решението&quot;&gt;Решението&lt;/h2&gt;

&lt;p&gt;Скриптът &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude-input-notify.sh&lt;/code&gt; използва системата от hooks на Claude Code и автоматично показва
визуално известие винаги когато Claude Code изисква въвеждане от потребителя. Така винаги ще знаете
кога Claude се нуждае от вашата намеса.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2025/08/2025-08-13-claude-input-notify-001.png&quot; alt=&quot;Claude Input Notification Dialog&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;основни-характеристики&quot;&gt;Основни характеристики&lt;/h2&gt;

&lt;h3 id=&quot;интелигентно-откриване-на-терминал&quot;&gt;Интелигентно откриване на терминал&lt;/h3&gt;

&lt;p&gt;Скриптът използва множество методи за намиране на вашия активен терминален прозорец:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Търси прозорци по име на процес (gnome-terminal, konsole, xterm и др.)&lt;/li&gt;
  &lt;li&gt;Преминава към последно фокусирания прозорец, ако е необходимо&lt;/li&gt;
  &lt;li&gt;Поддържа различни терминални емулатори&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;система-за-визуални-известия&quot;&gt;Система за визуални известия&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Показва чист, модерен диалог с логото на Claude Code&lt;/li&gt;
  &lt;li&gt;Показва ясни съобщения за това какво се случва&lt;/li&gt;
  &lt;li&gt;Предоставя бутон “OK” за бързо връщане към терминала&lt;/li&gt;
  &lt;li&gt;Опционален бутон “Cancel” за отхвърляне без действие&lt;/li&gt;
  &lt;li&gt;Може да се затвори и с клавиша ESC (същото като Cancel)&lt;/li&gt;
  &lt;li&gt;Показва персонализирани съобщения от Claude Code, когато са налични&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;опции-за-разработчици&quot;&gt;Опции за разработчици&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Debug режим&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DEBUG_MODE=1&lt;/code&gt; променлива на средата): Показва подробна информация за откриване на прозорци&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Тестов режим&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TEST_MODE=1&lt;/code&gt; променлива на средата): Задейства тестово известие за проверка на настройката&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Подробен изход&lt;/strong&gt;: Помага при отстраняване на проблеми&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;инсталиране-и-настройка&quot;&gt;Инсталиране и настройка&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Първо, уверете се, че имате необходимите зависимости:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;xdotool wmctrl yad jq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;Изтеглете скрипта и логото от моето:
&lt;a href=&quot;https://github.com/idachev/own-debian-configs/blob/master/claude-input-notify.sh&quot;&gt;own-debian-configs хранилище&lt;/a&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Изтегляне на скрипта за известия&lt;/span&gt;
wget https://raw.githubusercontent.com/idachev/own-debian-configs/master/claude-input-notify.sh &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; ~/bin/claude-input-notify.sh
&lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +x ~/bin/claude-input-notify.sh

&lt;span class=&quot;c&quot;&gt;# Изтегляне на логото на Claude (опционално, но препоръчително за по-добра визуализация)&lt;/span&gt;
wget https://raw.githubusercontent.com/idachev/own-debian-configs/master/claude-logo.png &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; ~/bin/claude-logo.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;Конфигурирайте Claude да използва скрипта за известия автоматично чрез редактиране на
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.claude/settings.json&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;Notification&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;~/bin/claude-input-notify.sh&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Тази конфигурация с hooks гарантира, че скриптът за известия се изпълнява автоматично винаги когато
Claude Code се нуждае от въвеждане от потребителя - не е необходимо ръчно пренасочване!&lt;/p&gt;

&lt;h2 id=&quot;как-работи&quot;&gt;Как работи&lt;/h2&gt;

&lt;p&gt;Когато е конфигуриран като Claude hook, скриптът се задейства автоматично винаги когато Claude Code
се нуждае от потребителско въвеждане. Процесът е следният:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Claude Code открива, че се нуждае от потребителско въвеждане и задейства Notification hook&lt;/li&gt;
  &lt;li&gt;Скриптът чете всяко JSON съобщение от stdin за показване на персонализирани известия&lt;/li&gt;
  &lt;li&gt;Идентифицира терминалния прозорец, където работи Claude Code&lt;/li&gt;
  &lt;li&gt;Създава диалог за известие чрез &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yad&lt;/code&gt; (Yet Another Dialog)&lt;/li&gt;
  &lt;li&gt;Когато щракнете “OK”, автоматично фокусира терминалния прозорец&lt;/li&gt;
  &lt;li&gt;ESC или Cancel просто затварят известието без да променят фокуса&lt;/li&gt;
  &lt;li&gt;Връща ви точно там, където трябва да продължите взаимодействието&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;разширено-използване&quot;&gt;Разширено използване&lt;/h2&gt;

&lt;h3 id=&quot;debug-режим&quot;&gt;Debug режим&lt;/h3&gt;

&lt;p&gt;За отстраняване на проблеми с откриването на прозорци, изпълнете скрипта ръчно с debug променлива на средата:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;DEBUG_MODE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 ~/bin/claude-input-notify.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;тестване-на-известието&quot;&gt;Тестване на известието&lt;/h3&gt;

&lt;p&gt;За да проверите дали всичко работи:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;TEST_MODE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 ~/bin/claude-input-notify.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;техническа-имплементация&quot;&gt;Техническа имплементация&lt;/h2&gt;

&lt;p&gt;Скриптът използва няколко Linux инструмента:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;xdotool&lt;/strong&gt;: За манипулиране на прозорци и управление на фокуса&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;wmctrl&lt;/strong&gt;: Като резервен вариант за операции с прозорци&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;yad&lt;/strong&gt;: За създаване на GTK+ диалога&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pgrep/ps&lt;/strong&gt;: За откриване на процеси&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;jq&lt;/strong&gt;: Опционален JSON парсър за извличане на персонализирани съобщения от Claude Code hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Скриптът чете JSON данни от stdin когато е задействан от Claude Code hooks, което му позволява да
извлича и показва персонализирани съобщения. Ако &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jq&lt;/code&gt; не е наличен, се връща към основно извличане с
regex.&lt;/p&gt;

&lt;p&gt;Известието може да използва или външен файл с логото на Claude (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude-logo.png&lt;/code&gt;), ако е наличен,
или да се върне към вградено base64-кодирано лого. Това прави скрипта гъвкав - работи веднага, но
изглежда още по-добре с персонализирания файл с лого.&lt;/p&gt;

&lt;h2 id=&quot;предимства&quot;&gt;Предимства&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Никога не пропускайте prompts&lt;/strong&gt;: Бъдете наясно кога Claude се нуждае от вашето въвеждане&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Подобрен работен процес&lt;/strong&gt;: Безпроблемно превключване между задачи без да губите следа&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Визуална обратна връзка&lt;/strong&gt;: Ясни, невъзможни за пропускане нотификации&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Лесна интеграция&lt;/strong&gt;: Работи с всяка терминална настройка&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Леко&lt;/strong&gt;: Минимално използване на ресурси, работи само когато е необходимо&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;къде-да-го-намерите&quot;&gt;Къде да го намерите&lt;/h2&gt;

&lt;p&gt;Пълното решение, включително скрипта и файла с логото, е налично в моето GitHub хранилище:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;:
&lt;a href=&quot;https://github.com/idachev/own-debian-configs&quot;&gt;own-debian-configs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Скрипт&lt;/strong&gt;:
&lt;a href=&quot;https://github.com/idachev/own-debian-configs/blob/master/claude-input-notify.sh&quot;&gt;claude-input-notify.sh&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Лого&lt;/strong&gt;:
&lt;a href=&quot;https://github.com/idachev/own-debian-configs/blob/master/claude-logo.png&quot;&gt;claude-logo.png&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;заключение&quot;&gt;Заключение&lt;/h2&gt;

&lt;p&gt;Този прост инструмент значително подобри моя работен процес при работа с Claude Code. Чрез
използването на вградената система за hooks на Claude, той се интегрира безпроблемно без да изисква
сложна настройка или процеси работещи на заден план. Това е един от онези малки инструменти, които
решават специфичен проблем елегантно.&lt;/p&gt;

&lt;p&gt;Ако често използвате Claude Code в терминала, опитайте &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude-input-notify.sh&lt;/code&gt;. Комбиниран с
конфигурацията на hooks на Claude, той предоставя безпроблемен начин да останете ангажирани с вашия
AI асистент, гарантирайки, че никога повече няма да оставите Claude да чака за вашето въвеждане!&lt;/p&gt;
</description>
                <pubDate>Wed, 13 Aug 2025 07:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/claude-input-notify-terminal-helper</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/claude-input-notify-terminal-helper</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>Изграждане на безсървърна контактна форма с Cloudflare Pages Functions и KV Store</title>
                <description>&lt;p&gt;&lt;strong&gt;Cloudflare Pages Functions и KV Store&lt;/strong&gt; предоставят мощно безсървърно решение за изграждане на
контактни форми без традиционна backend инфраструктура. Тази публикация описва подробно как да
имплементирате сигурна, scalable контактна форма, използвайки тези технологии.&lt;/p&gt;

&lt;h2 id=&quot;съдържание&quot;&gt;Съдържание&lt;/h2&gt;

&lt;!-- @formatter:off --&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#съдържание&quot; id=&quot;markdown-toc-съдържание&quot;&gt;Съдържание&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#защо-cloudflare-pages-functions-и-kv-store&quot; id=&quot;markdown-toc-защо-cloudflare-pages-functions-и-kv-store&quot;&gt;Защо Cloudflare Pages Functions и KV Store?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#преглед-на-архитектурата&quot; id=&quot;markdown-toc-преглед-на-архитектурата&quot;&gt;Преглед на архитектурата&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ръководство-за-имплементация&quot; id=&quot;markdown-toc-ръководство-за-имплементация&quot;&gt;Ръководство за имплементация&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#deployment&quot; id=&quot;markdown-toc-deployment&quot;&gt;Deployment&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#анализ-на-разходите&quot; id=&quot;markdown-toc-анализ-на-разходите&quot;&gt;Анализ на разходите&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#api-endpoints&quot; id=&quot;markdown-toc-api-endpoints&quot;&gt;API endpoints&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#най-добри-практики-за-сигурност&quot; id=&quot;markdown-toc-най-добри-практики-за-сигурност&quot;&gt;Най-добри практики за сигурност&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#заключение&quot; id=&quot;markdown-toc-заключение&quot;&gt;Заключение&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- @formatter:on --&gt;

&lt;h2 id=&quot;защо-cloudflare-pages-functions-и-kv-store&quot;&gt;Защо Cloudflare Pages Functions и KV Store?&lt;/h2&gt;

&lt;p&gt;Традиционните решения за контактни форми често изискват:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Специализирани backend сървъри&lt;/li&gt;
  &lt;li&gt;Инфраструктура за бази данни&lt;/li&gt;
  &lt;li&gt;Конфигурация на имейл сървър&lt;/li&gt;
  &lt;li&gt;Сложни deployment процеси&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Безсървърният стек на Cloudflare елиминира тези изисквания, като предоставя:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Нулево управление на инфраструктура&lt;/strong&gt;: Няма сървъри за поддръжка или скалиране&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Глобална Edge мрежа&lt;/strong&gt;: Кодът се изпълнява близо до потребителите навсякъде по света&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Вградена сигурност&lt;/strong&gt;: DDoS защита, rate limiting и CAPTCHA поддръжка&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ефективност на разходите&lt;/strong&gt;: Ценообразуване според използването с щедър безплатен план&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;преглед-на-архитектурата&quot;&gt;Преглед на архитектурата&lt;/h2&gt;

&lt;p&gt;Решението се състои от четири основни компонента:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Статичен frontend&lt;/strong&gt;: HTML форма, хоствана на Cloudflare Pages&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pages Function&lt;/strong&gt;: Безсървърен handler, обработващ данните от формата&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;KV Store&lt;/strong&gt;: Разпределено key-value хранилище за данните от съобщенията&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Turnstile CAPTCHA&lt;/strong&gt;: Защита от ботове и спам&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;ръководство-за-имплементация&quot;&gt;Ръководство за имплементация&lt;/h2&gt;

&lt;p&gt;Пълният работещ примерен код е наличен в GitHub: &lt;a href=&quot;https://github.com/idachev/ivandachev-examples/tree/master/cloudflare-contact-form&quot;&gt;ivandachev-examples/cloudflare-contact-form&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;стъпка-1-настройка-на-cloudflare-pages&quot;&gt;Стъпка 1: Настройка на Cloudflare Pages&lt;/h3&gt;

&lt;p&gt;Първо, създайте нов проект в Cloudflare Pages:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Създаване на директория за проекта&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;contact-form-app
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;contact-form-app

&lt;span class=&quot;c&quot;&gt;# Инициализация на npm проект&lt;/span&gt;
npm init &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Инсталиране на зависимости&lt;/span&gt;
npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; wrangler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;стъпка-2-създаване-на-контактната-форма&quot;&gt;Стъпка 2: Създаване на контактната форма&lt;/h3&gt;

&lt;p&gt;Създайте проста HTML форма в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;public/index.html&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;github-code-embed&quot; id=&quot;code-https-raw-githubusercontent-com-idachev-ivandachev-examples-master-cloudflare-contact-form-public-index-html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;Loading code...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;script&gt;
  (function () {
    const embedId = &apos;code-https-raw-githubusercontent-com-idachev-ivandachev-examples-master-cloudflare-contact-form-public-index-html&apos;;
    const codeUrl = &apos;https://raw.githubusercontent.com/idachev/ivandachev-examples/master/cloudflare-contact-form/public/index.html&apos;;
    const language = &apos;html&apos;;

    // Ensure Prism language components are loaded
    function loadPrismComponent(lang) {
      if (typeof Prism === &apos;undefined&apos;) return;

      // Check if language is already loaded
      if (Prism.languages[lang]) return;

      // Try to load the language component dynamically
      const script = document.createElement(&apos;script&apos;);
      script.src = `https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/prism-${lang}.min.js`;
      script.onload = function () {
        // Re-highlight all code blocks after loading the component
        Prism.highlightAll();
      };
      document.head.appendChild(script);
    }

    fetch(codeUrl)
      .then((response) =&gt; {
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
      })
      .then((code) =&gt; {
        const codeElement = document.querySelector(`#${embedId} pre code`);
        codeElement.textContent = code;
        codeElement.className = `language-${language}`;

        // Load Prism language component if needed
        loadPrismComponent(language);

        // Re-highlight if using Prism.js
        if (typeof Prism !== &apos;undefined&apos;) {
          Prism.highlightElement(codeElement);
        }
        // Re-highlight if using highlight.js
        else if (typeof hljs !== &apos;undefined&apos;) {
          hljs.highlightElement(codeElement);
        }
      })
      .catch((error) =&gt; {
        console.error(&apos;Error loading code:&apos;, error);
        const codeElement = document.querySelector(`#${embedId} pre code`);
        codeElement.textContent = &apos;Error loading code. Please view it directly on GitHub.&apos;;
        codeElement.style.color = &apos;#d32f2f&apos;;
      });
  })();
&lt;/script&gt;

&lt;!-- Ensure Prism core and basic languages are loaded --&gt;
&lt;script&gt;
  if (typeof Prism === &apos;undefined&apos;) {
    // Load Prism core if not already loaded
    const prismCore = document.createElement(&apos;link&apos;);
    prismCore.rel = &apos;stylesheet&apos;;
    prismCore.href = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/themes/prism.min.css&apos;;
    document.head.appendChild(prismCore);

    const prismScript = document.createElement(&apos;script&apos;);
    prismScript.src = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/prism.min.js&apos;;
    document.head.appendChild(prismScript);

    // Load common components
    const prismAutoloader = document.createElement(&apos;script&apos;);
    prismAutoloader.src =
      &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/autoloader/prism-autoloader.min.js&apos;;
    prismAutoloader.onload = function () {
      if (typeof Prism !== &apos;undefined&apos; &amp;&amp; Prism.plugins &amp;&amp; Prism.plugins.autoloader) {
        Prism.plugins.autoloader.languages_path = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/&apos;;
      }
    };
    document.head.appendChild(prismAutoloader);
  }
&lt;/script&gt;

&lt;style&gt;
  .github-code-embed {
    margin: 1em 0;
  }

  .github-code-embed pre {
    background-color: #f5f5f5;
    border: 1px solid #ddd;
    border-radius: 4px;
    padding: 1em;
    overflow-x: auto;
    /* Limit height to approximately 20 lines */
    max-height: 420px; /* 20 lines * ~21px per line */
    overflow-y: auto;
  }

  .github-code-embed pre code {
    background: none;
    padding: 0;
    border: none;
    font-size: 0.875em;
    line-height: 1.5;
    display: block;
  }

  /* Custom scrollbar styling for better appearance */
  .github-code-embed pre::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }

  .github-code-embed pre::-webkit-scrollbar-track {
    background: #f1f1f1;
    border-radius: 4px;
  }

  .github-code-embed pre::-webkit-scrollbar-thumb {
    background: #888;
    border-radius: 4px;
  }

  .github-code-embed pre::-webkit-scrollbar-thumb:hover {
    background: #555;
  }

  /* Firefox scrollbar styling */
  .github-code-embed pre {
    scrollbar-width: thin;
    scrollbar-color: #888 #f1f1f1;
  }
&lt;/style&gt;

&lt;p&gt;Вижте в GitHub: &lt;a href=&quot;https://github.com/idachev/ivandachev-examples/blob/master/cloudflare-contact-form/public/index.html&quot;&gt;index.html&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;стъпка-3-имплементиране-на-pages-function&quot;&gt;Стъпка 3: Имплементиране на Pages Function&lt;/h3&gt;

&lt;p&gt;Създайте безсървърния handler в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;functions/api/contact.js&lt;/code&gt;. Тази имплементация включва:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CORS поддръжка&lt;/strong&gt; за заявки от различни източници&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt; (5 заявки на минута на IP)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Конфигурируема валидация&lt;/strong&gt; с environment variables&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;API endpoints&lt;/strong&gt; - POST за изпращане, GET за извличане&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Turnstile CAPTCHA верификация&lt;/strong&gt; за защита от ботове&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;github-code-embed&quot; id=&quot;code-https-raw-githubusercontent-com-idachev-ivandachev-examples-master-cloudflare-contact-form-functions-api-contact-js&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;Loading code...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;script&gt;
  (function () {
    const embedId = &apos;code-https-raw-githubusercontent-com-idachev-ivandachev-examples-master-cloudflare-contact-form-functions-api-contact-js&apos;;
    const codeUrl = &apos;https://raw.githubusercontent.com/idachev/ivandachev-examples/master/cloudflare-contact-form/functions/api/contact.js&apos;;
    const language = &apos;javascript&apos;;

    // Ensure Prism language components are loaded
    function loadPrismComponent(lang) {
      if (typeof Prism === &apos;undefined&apos;) return;

      // Check if language is already loaded
      if (Prism.languages[lang]) return;

      // Try to load the language component dynamically
      const script = document.createElement(&apos;script&apos;);
      script.src = `https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/prism-${lang}.min.js`;
      script.onload = function () {
        // Re-highlight all code blocks after loading the component
        Prism.highlightAll();
      };
      document.head.appendChild(script);
    }

    fetch(codeUrl)
      .then((response) =&gt; {
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
      })
      .then((code) =&gt; {
        const codeElement = document.querySelector(`#${embedId} pre code`);
        codeElement.textContent = code;
        codeElement.className = `language-${language}`;

        // Load Prism language component if needed
        loadPrismComponent(language);

        // Re-highlight if using Prism.js
        if (typeof Prism !== &apos;undefined&apos;) {
          Prism.highlightElement(codeElement);
        }
        // Re-highlight if using highlight.js
        else if (typeof hljs !== &apos;undefined&apos;) {
          hljs.highlightElement(codeElement);
        }
      })
      .catch((error) =&gt; {
        console.error(&apos;Error loading code:&apos;, error);
        const codeElement = document.querySelector(`#${embedId} pre code`);
        codeElement.textContent = &apos;Error loading code. Please view it directly on GitHub.&apos;;
        codeElement.style.color = &apos;#d32f2f&apos;;
      });
  })();
&lt;/script&gt;

&lt;!-- Ensure Prism core and basic languages are loaded --&gt;
&lt;script&gt;
  if (typeof Prism === &apos;undefined&apos;) {
    // Load Prism core if not already loaded
    const prismCore = document.createElement(&apos;link&apos;);
    prismCore.rel = &apos;stylesheet&apos;;
    prismCore.href = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/themes/prism.min.css&apos;;
    document.head.appendChild(prismCore);

    const prismScript = document.createElement(&apos;script&apos;);
    prismScript.src = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/prism.min.js&apos;;
    document.head.appendChild(prismScript);

    // Load common components
    const prismAutoloader = document.createElement(&apos;script&apos;);
    prismAutoloader.src =
      &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/autoloader/prism-autoloader.min.js&apos;;
    prismAutoloader.onload = function () {
      if (typeof Prism !== &apos;undefined&apos; &amp;&amp; Prism.plugins &amp;&amp; Prism.plugins.autoloader) {
        Prism.plugins.autoloader.languages_path = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/&apos;;
      }
    };
    document.head.appendChild(prismAutoloader);
  }
&lt;/script&gt;

&lt;style&gt;
  .github-code-embed {
    margin: 1em 0;
  }

  .github-code-embed pre {
    background-color: #f5f5f5;
    border: 1px solid #ddd;
    border-radius: 4px;
    padding: 1em;
    overflow-x: auto;
    /* Limit height to approximately 20 lines */
    max-height: 420px; /* 20 lines * ~21px per line */
    overflow-y: auto;
  }

  .github-code-embed pre code {
    background: none;
    padding: 0;
    border: none;
    font-size: 0.875em;
    line-height: 1.5;
    display: block;
  }

  /* Custom scrollbar styling for better appearance */
  .github-code-embed pre::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }

  .github-code-embed pre::-webkit-scrollbar-track {
    background: #f1f1f1;
    border-radius: 4px;
  }

  .github-code-embed pre::-webkit-scrollbar-thumb {
    background: #888;
    border-radius: 4px;
  }

  .github-code-embed pre::-webkit-scrollbar-thumb:hover {
    background: #555;
  }

  /* Firefox scrollbar styling */
  .github-code-embed pre {
    scrollbar-width: thin;
    scrollbar-color: #888 #f1f1f1;
  }
&lt;/style&gt;

&lt;p&gt;Вижте в GitHub: &lt;a href=&quot;https://github.com/idachev/ivandachev-examples/blob/master/cloudflare-contact-form/functions/api/contact.js&quot;&gt;contact.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ключови функции в кода:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Конфигурация на CORS headers с allowed origins&lt;/li&gt;
  &lt;li&gt;Rate limiting използвайки KV с автоматично изтриване&lt;/li&gt;
  &lt;li&gt;Валидация на входните данни с конфигурируеми min/max дължини&lt;/li&gt;
  &lt;li&gt;API key автентикация, поддържаща както query parameter, така и header&lt;/li&gt;
  &lt;li&gt;Turnstile token верификация със server-side валидация&lt;/li&gt;
  &lt;li&gt;Изчерпателна обработка на грешки с подходящи HTTP status codes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;стъпка-4-конфигуриране-на-kv-store&quot;&gt;Стъпка 4: Конфигуриране на KV Store&lt;/h3&gt;

&lt;p&gt;Създайте конфигурационен файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wrangler.jsonc&lt;/code&gt; с KV namespace binding и environment variables:&lt;/p&gt;

&lt;div class=&quot;github-code-embed&quot; id=&quot;code-https-raw-githubusercontent-com-idachev-ivandachev-examples-master-cloudflare-contact-form-wrangler-jsonc&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;Loading code...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;script&gt;
  (function () {
    const embedId = &apos;code-https-raw-githubusercontent-com-idachev-ivandachev-examples-master-cloudflare-contact-form-wrangler-jsonc&apos;;
    const codeUrl = &apos;https://raw.githubusercontent.com/idachev/ivandachev-examples/master/cloudflare-contact-form/wrangler.jsonc&apos;;
    const language = &apos;json&apos;;

    // Ensure Prism language components are loaded
    function loadPrismComponent(lang) {
      if (typeof Prism === &apos;undefined&apos;) return;

      // Check if language is already loaded
      if (Prism.languages[lang]) return;

      // Try to load the language component dynamically
      const script = document.createElement(&apos;script&apos;);
      script.src = `https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/prism-${lang}.min.js`;
      script.onload = function () {
        // Re-highlight all code blocks after loading the component
        Prism.highlightAll();
      };
      document.head.appendChild(script);
    }

    fetch(codeUrl)
      .then((response) =&gt; {
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
      })
      .then((code) =&gt; {
        const codeElement = document.querySelector(`#${embedId} pre code`);
        codeElement.textContent = code;
        codeElement.className = `language-${language}`;

        // Load Prism language component if needed
        loadPrismComponent(language);

        // Re-highlight if using Prism.js
        if (typeof Prism !== &apos;undefined&apos;) {
          Prism.highlightElement(codeElement);
        }
        // Re-highlight if using highlight.js
        else if (typeof hljs !== &apos;undefined&apos;) {
          hljs.highlightElement(codeElement);
        }
      })
      .catch((error) =&gt; {
        console.error(&apos;Error loading code:&apos;, error);
        const codeElement = document.querySelector(`#${embedId} pre code`);
        codeElement.textContent = &apos;Error loading code. Please view it directly on GitHub.&apos;;
        codeElement.style.color = &apos;#d32f2f&apos;;
      });
  })();
&lt;/script&gt;

&lt;!-- Ensure Prism core and basic languages are loaded --&gt;
&lt;script&gt;
  if (typeof Prism === &apos;undefined&apos;) {
    // Load Prism core if not already loaded
    const prismCore = document.createElement(&apos;link&apos;);
    prismCore.rel = &apos;stylesheet&apos;;
    prismCore.href = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/themes/prism.min.css&apos;;
    document.head.appendChild(prismCore);

    const prismScript = document.createElement(&apos;script&apos;);
    prismScript.src = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/prism.min.js&apos;;
    document.head.appendChild(prismScript);

    // Load common components
    const prismAutoloader = document.createElement(&apos;script&apos;);
    prismAutoloader.src =
      &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/autoloader/prism-autoloader.min.js&apos;;
    prismAutoloader.onload = function () {
      if (typeof Prism !== &apos;undefined&apos; &amp;&amp; Prism.plugins &amp;&amp; Prism.plugins.autoloader) {
        Prism.plugins.autoloader.languages_path = &apos;https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/&apos;;
      }
    };
    document.head.appendChild(prismAutoloader);
  }
&lt;/script&gt;

&lt;style&gt;
  .github-code-embed {
    margin: 1em 0;
  }

  .github-code-embed pre {
    background-color: #f5f5f5;
    border: 1px solid #ddd;
    border-radius: 4px;
    padding: 1em;
    overflow-x: auto;
    /* Limit height to approximately 20 lines */
    max-height: 420px; /* 20 lines * ~21px per line */
    overflow-y: auto;
  }

  .github-code-embed pre code {
    background: none;
    padding: 0;
    border: none;
    font-size: 0.875em;
    line-height: 1.5;
    display: block;
  }

  /* Custom scrollbar styling for better appearance */
  .github-code-embed pre::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }

  .github-code-embed pre::-webkit-scrollbar-track {
    background: #f1f1f1;
    border-radius: 4px;
  }

  .github-code-embed pre::-webkit-scrollbar-thumb {
    background: #888;
    border-radius: 4px;
  }

  .github-code-embed pre::-webkit-scrollbar-thumb:hover {
    background: #555;
  }

  /* Firefox scrollbar styling */
  .github-code-embed pre {
    scrollbar-width: thin;
    scrollbar-color: #888 #f1f1f1;
  }
&lt;/style&gt;

&lt;p&gt;Вижте в GitHub: &lt;a href=&quot;https://github.com/idachev/ivandachev-examples/blob/master/cloudflare-contact-form/wrangler.jsonc&quot;&gt;wrangler.jsonc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Конфигурацията включва:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;KV namespace binding за съхраняване на съобщенията&lt;/li&gt;
  &lt;li&gt;Allowed origins за CORS&lt;/li&gt;
  &lt;li&gt;Конфигурируеми validation limits&lt;/li&gt;
  &lt;li&gt;Коментари за настройка на secret API key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Създайте KV namespace и настройте автентикация:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Създаване на KV namespace чрез npm скрипт&lt;/span&gt;
npm run kv:create
&lt;span class=&quot;c&quot;&gt;# Копирайте генерираното ID в wrangler.jsonc&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Генериране на сигурен API key&lt;/span&gt;
openssl rand &lt;span class=&quot;nt&quot;&gt;-hex&lt;/span&gt; 32

&lt;span class=&quot;c&quot;&gt;# Задаване на API key като secret&lt;/span&gt;
npx wrangler pages secret put API_KEY &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt; contact-form-app
&lt;span class=&quot;c&quot;&gt;# Въведете генерирания ключ при подкана&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Проверка дали е качен&lt;/span&gt;
npx wrangler pages secret list &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt; contact-form-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;стъпка-5-конфигуриране-на-cloudflare-turnstile&quot;&gt;Стъпка 5: Конфигуриране на Cloudflare Turnstile&lt;/h3&gt;

&lt;p&gt;Turnstile предоставя CAPTCHA защита за предотвратяване на спам и ботове:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Създайте Turnstile site&lt;/strong&gt; във вашия Cloudflare dashboard:
    &lt;ul&gt;
      &lt;li&gt;Навигирайте до &lt;strong&gt;Turnstile&lt;/strong&gt; в страничната лента&lt;/li&gt;
      &lt;li&gt;Кликнете &lt;strong&gt;Add Site&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;Конфигурирайте вашия сайт с вашите домейни&lt;/li&gt;
      &lt;li&gt;Изберете widget mode (Managed или Invisible)&lt;/li&gt;
      &lt;li&gt;Копирайте &lt;strong&gt;Site Key&lt;/strong&gt; и &lt;strong&gt;Secret Key&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Актуализирайте вашата конфигурация&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Задайте &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TURNSTILE_SITE_KEY&lt;/code&gt; в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wrangler.jsonc&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Актуализирайте site key във вашата HTML форма&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Задайте secret key&lt;/strong&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npx wrangler pages secret put TURNSTILE_SECRET_KEY &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt; contact-form-app
&lt;span class=&quot;c&quot;&gt;# Въведете вашия Turnstile secret key при подкана&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Опции за персонализация на widget&lt;/strong&gt;:
    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cf-turnstile&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-sitekey=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;YOUR_SITE_KEY&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-theme=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;light&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;normal&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;За подробни инструкции за настройка на Turnstile,
вижте &lt;a href=&quot;https://github.com/idachev/ivandachev-examples/blob/master/cloudflare-contact-form/TURNSTILE_SETUP.md&quot;&gt;TURNSTILE_SETUP.md&lt;/a&gt;
в примерното repository.&lt;/p&gt;

&lt;h2 id=&quot;deployment&quot;&gt;Deployment&lt;/h2&gt;

&lt;p&gt;Deploy на вашето приложение за контактна форма:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Вход в Cloudflare&lt;/span&gt;
wrangler login

&lt;span class=&quot;c&quot;&gt;# Deploy в Cloudflare Pages&lt;/span&gt;
npm run deploy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;За локална разработка:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Стартиране на сървър за разработка на http://localhost:8788&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Примерното repository също включва инструменти за разработка за качество на кода:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Форматиране на код с Prettier&lt;/span&gt;
npm run format

&lt;span class=&quot;c&quot;&gt;# Стартиране на ESLint за JavaScript linting&lt;/span&gt;
npm run lint

&lt;span class=&quot;c&quot;&gt;# Стартиране на Stylelint за CSS linting&lt;/span&gt;
npm run lint:css
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;анализ-на-разходите&quot;&gt;Анализ на разходите&lt;/h2&gt;

&lt;p&gt;Ценовият модел на Cloudflare за това решение:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Pages&lt;/strong&gt;: Безплатно за неограничени заявки&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Functions&lt;/strong&gt;: 100,000 заявки/ден безплатно, след това $0.50/милион&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;KV Storage&lt;/strong&gt;: 100,000 reads/ден безплатно, 1,000 writes/ден безплатно&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;KV операции&lt;/strong&gt;: $0.50/милион reads, $5.00/милион writes след free tier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;За типична контактна форма, получаваща 1,000 submissions на месец:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Месечна цена&lt;/strong&gt;: $0 (в рамките на free tier)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Капацитет за скалиране&lt;/strong&gt;: Може да обработва милиони submissions без промени в инфраструктурата&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;api-endpoints&quot;&gt;API endpoints&lt;/h2&gt;

&lt;p&gt;Контактната форма предоставя следните API endpoints:&lt;/p&gt;

&lt;h3 id=&quot;изпращане-на-контактна-форма&quot;&gt;Изпращане на контактна форма&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/api/contact&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Body: JSON с полета &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;email&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;message&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cf-turnstile-response&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Изисква валиден Cloudflare Turnstile token&lt;/li&gt;
  &lt;li&gt;Rate limited до 5 съобщения на минута на IP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;получаване-на-съобщения-изисква-api-ключ&quot;&gt;Получаване на съобщения (изисква API ключ)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/api/contact?api_key=YOUR_API_KEY&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/api/contact&lt;/code&gt; с header &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-API-Key: YOUR_API_KEY&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Query параметри:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;limit&lt;/code&gt;: Брой резултати на страница (1-1000, по подразбиране: 100)&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cursor&lt;/code&gt;: Pagination cursor за следващата страница&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Връща JSON отговор с:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;submissions&lt;/code&gt;: Array от submission обекти&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;list_complete&lt;/code&gt;: Boolean, указващ дали има още резултати&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cursor&lt;/code&gt;: Cursor за следващата страница (null ако няма повече резултати)&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;count&lt;/code&gt;: Брой съобщения в текущата страница&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;проверка-на-api-статус&quot;&gt;Проверка на API статус&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/api/contact&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Връща API статус (не се изисква автентикация)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;най-добри-практики-за-сигурност&quot;&gt;Най-добри практики за сигурност&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;CAPTCHA защита&lt;/strong&gt;: Cloudflare Turnstile предотвратява изпращания от ботове&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Валидация на входните данни&lt;/strong&gt;: Винаги валидирайте и почиствайте потребителските данни&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt;: Имплементирайте per-IP rate limiting (5 заявки/минута)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CORS&lt;/strong&gt;: Конфигурирайте подходящи CORS headers за allowed domains&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;API сигурност&lt;/strong&gt;: Използвайте API keys за endpoints за достъп до данни&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Криптиране&lt;/strong&gt;: Използвайте HTTPS за всички комуникации&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Съхранение на данни&lt;/strong&gt;: Имплементирайте политики за автоматично изтриване на данни&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Token сигурност&lt;/strong&gt;: Turnstile tokens изтичат след 5 минути и са за еднократна употреба&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;заключение&quot;&gt;Заключение&lt;/h2&gt;

&lt;p&gt;Cloudflare Pages Functions и KV Store предоставят стабилно, скалиращо решение за контактни форми,
което елиминира сложността на традиционната инфраструктура. Този безсървърен подход предлага:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Глобална производителност&lt;/strong&gt;: Edge deployment осигурява ниска latency в световен мащаб&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Автоматично скалиране&lt;/strong&gt;: Справяне с пикове в трафика без конфигурация&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ефективност на разходите&lt;/strong&gt;: Плащате само за това, което използвате&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;: Прост deployment и поддръжка&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Комбинацията от Pages Functions за изчисления и KV Store за персистентност създава цялостно
backend решение, което е идеално за контактни форми и подобни приложения, изискващи просто
събиране и съхранение на данни.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Изграждали ли сте безсървърни приложения с Cloudflare? Споделете вашия опит и съвети в
коментарите по-долу!&lt;/em&gt;&lt;/p&gt;
</description>
                <pubDate>Fri, 18 Jul 2025 21:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/cloudflare-contact-form-kv-pages-functions</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/cloudflare-contact-form-kv-pages-functions</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>MCP Java Decompiler Server: Свързване на AI инструментите с анализ на Java байткод</title>
                <description>&lt;p&gt;&lt;strong&gt;MCP Java Decompiler Server&lt;/strong&gt; - специализиран сървър, който позволява на AI агенти да декомпилират
и анализират Java байткод.&lt;/p&gt;

&lt;p&gt;Този MCP използвам, когато работя с Claude Code, за да го инструктурирам да декомпилира класове,
чийто код не е наличен, така че да може да го анализира и да го използва в контекста на текущата
задача, която съм му поставил.&lt;/p&gt;

&lt;h2 id=&quot;какво-е-mcp-java-decompiler-server&quot;&gt;Какво е MCP Java Decompiler Server?&lt;/h2&gt;

&lt;p&gt;MCP Java Decompiler Server е базиран на Node.js инструмент, който предоставя на AI агенти
възможността да декомпилират Java &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.class&lt;/code&gt; файлове, да извличат класове от JAR файлове и да
анализират Java байткод програмно. Той използва JavaScript порта на CFR декомпилатора за
преобразуване на компилиран Java байткод обратно в четим изходен код.&lt;/p&gt;

&lt;h2 id=&quot;ключови-функции&quot;&gt;Ключови функции&lt;/h2&gt;

&lt;h3 id=&quot;множество-методи-за-декомпилация&quot;&gt;Множество методи за декомпилация&lt;/h3&gt;

&lt;p&gt;Сървърът поддържа три различни начина за декомпилация на Java код:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Декомпилация по файлов път&lt;/strong&gt;: Директно декомпилиране на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.class&lt;/code&gt; файлове от файловата система.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Извличане по име на пакет&lt;/strong&gt;: Извличане и декомпилиране на класове по техните пълни
квалифицирани имена.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Анализ на JAR файлове&lt;/strong&gt;: Декомпилиране на специфични класове от JAR архиви.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;технически-възможности&quot;&gt;Технически възможности&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Широка поддръжка на Java&lt;/strong&gt;: Съвместим с всички Java версии.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Не се изисква Java Runtime&lt;/strong&gt;: Работи изцяло на Node.js 16+ без нужда от Java инсталация.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;MCP-съвместим API&lt;/strong&gt;: Пълна интеграция с MCP-съвместими AI инструменти.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;инсталация-и-настройка&quot;&gt;Инсталация и настройка&lt;/h2&gt;

&lt;p&gt;Сървърът предлага множество опции за инсталация, подходящи за различни случаи на употреба:&lt;/p&gt;

&lt;h3 id=&quot;инсталиране-в-ai-agents&quot;&gt;Инсталиране в AI Agents&lt;/h3&gt;

&lt;p&gt;Claude code:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;claude mcp add javadc &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; project &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; npx &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; @idachev/mcp-javadc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Стандартен MCP JSON конфигурация:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;javadc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;stdio&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;npx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;@idachev/mcp-javadc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;защо-това-е-важно&quot;&gt;Защо това е важно&lt;/h2&gt;

&lt;p&gt;Този инструмент преодолява значителна пропаст между AI агенти и работния процес за Java разработка.&lt;/p&gt;

&lt;p&gt;Сървърът ще извлече посочения клас от JAR файла и ще върне декомпилирания изходен код, което прави
възможно за AI агенти да разберат и анализират имплементацията.&lt;/p&gt;

&lt;p&gt;AI агенти могат да разберат липсващия изходен код, като декомпилират класовете им.&lt;/p&gt;

&lt;h2 id=&quot;интеграция-с-ai-работни-потоци&quot;&gt;Интеграция с AI работни потоци&lt;/h2&gt;

&lt;p&gt;MCP Java Decompiler Server се интегрира безпроблемно с MCP-съвместими AI инструменти, позволявайки
им да:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Анализират JAR зависимости в Maven/Gradle проекти.&lt;/li&gt;
  &lt;li&gt;Разбират структурата на компилирания код.&lt;/li&gt;
  &lt;li&gt;Предоставят информация за имплементациите на библиотеки от трети страни.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;започнете&quot;&gt;Започнете&lt;/h2&gt;

&lt;p&gt;MCP Java Decompiler Server е наличен в &lt;a href=&quot;https://github.com/idachev/mcp-javadc&quot;&gt;GitHub&lt;/a&gt; под ISC
лиценз. Независимо дали работите със legacy Java код, анализирате зависимости или изграждате
AI-задвижвани инструменти за разработка, този сървър предоставя моста, от който се нуждаете между AI
асистентите и Java байткода.&lt;/p&gt;

&lt;p&gt;Изпробвайте го с вашия любим MCP-съвместим AI инструмент и вижте как може да подобри вашия работен
процес за Java разработка!&lt;/p&gt;
</description>
                <pubDate>Fri, 27 Jun 2025 11:30:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/mcp-java-decompiler-server</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/mcp-java-decompiler-server</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>Използване на Claude Code MCP с Atlassian: Пълно ръководство за генериране на документация</title>
                <description>&lt;h1 id=&quot;използване-на-claude-code-mcp-с-atlassian-пълно-ръководство-за-генериране-на-документация&quot;&gt;Използване на Claude Code MCP с Atlassian: Пълно ръководство за генериране на документация&lt;/h1&gt;

&lt;p&gt;Model Context Protocol (MCP) революционизира начина, по който интегрираме AI инструменти с външни
услуги. В този пост ще покажа как да настроите Claude Code MCP с Atlassian и ще демонстрирам
практически случай на употреба: автоматично генериране на цялостна документация за внедряване на
OpenTelemetry в кодовата база.&lt;/p&gt;

&lt;h2 id=&quot;съдържание&quot;&gt;Съдържание&lt;/h2&gt;

&lt;!-- @formatter:off --&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#съдържание&quot; id=&quot;markdown-toc-съдържание&quot;&gt;Съдържание&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#настройване-на-claude-code-mcp-с-atlassian&quot; id=&quot;markdown-toc-настройване-на-claude-code-mcp-с-atlassian&quot;&gt;Настройване на Claude Code MCP с Atlassian&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#реален-случай-на-употреба-opentelemetry-документация&quot; id=&quot;markdown-toc-реален-случай-на-употреба-opentelemetry-документация&quot;&gt;Реален случай на употреба: OpenTelemetry документация&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ключови-предимства-на-този-подход&quot; id=&quot;markdown-toc-ключови-предимства-на-този-подход&quot;&gt;Ключови предимства на този подход&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#най-добри-практики-за-claude-code-mcp--atlassian&quot; id=&quot;markdown-toc-най-добри-практики-за-claude-code-mcp--atlassian&quot;&gt;Най-добри практики за Claude Code MCP + Atlassian&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#разширени-случаи-на-употреба&quot; id=&quot;markdown-toc-разширени-случаи-на-употреба&quot;&gt;Разширени случаи на употреба&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#заключение&quot; id=&quot;markdown-toc-заключение&quot;&gt;Заключение&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- @formatter:on --&gt;

&lt;h2 id=&quot;настройване-на-claude-code-mcp-с-atlassian&quot;&gt;Настройване на Claude Code MCP с Atlassian&lt;/h2&gt;

&lt;p&gt;Започването на работа с Claude Code MCP и Atlassian е лесно. Ето командата за добавяне на Atlassian
MCP сървъра:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;claude mcp add atlassian &lt;span class=&quot;nt&quot;&gt;--transport&lt;/span&gt; sse &lt;span class=&quot;s2&quot;&gt;&quot;https://mcp.atlassian.com/v1/sse&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--scope&lt;/span&gt; user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Тази команда:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Добавя Atlassian MCP сървъра към вашата Claude Code конфигурация&lt;/li&gt;
  &lt;li&gt;Използва Server-Sent Events (SSE) като транспортен механизъм&lt;/li&gt;
  &lt;li&gt;Свързва се с официалната Atlassian MCP крайна точка&lt;/li&gt;
  &lt;li&gt;Задава обхвата на потребителско ниво за личен достъп&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;След изпълнение на тази команда, Claude Code ще има директен достъп до вашето Atlassian работно
пространство, включително Confluence страници и Jira билети.&lt;/p&gt;

&lt;h2 id=&quot;реален-случай-на-употреба-opentelemetry-документация&quot;&gt;Реален случай на употреба: OpenTelemetry документация&lt;/h2&gt;

&lt;p&gt;Нека ви проведа през практически пример, където използвах Claude Code с Atlassian MCP интеграцията
за създаване на цялостна документация за използването на OpenTelemetry в кодова база.&lt;/p&gt;

&lt;h3 id=&quot;стъпка-1-първоначална-настройка-и-анализ&quot;&gt;Стъпка 1: Първоначална настройка и анализ&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2025/06/2025-06-27-claude-code-mcp-atlassian-001.png&quot; alt=&quot;Claude Code MCP първоначална настройка&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Процесът започва с инструктаж на Claude Code да анализира кодовата база и да разбере как е внедрен
OpenTelemetry. Започнах с тази подкана:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Can you analyze this codebase and create a comprehensive Confluence page documenting how
OpenTelemetry is used throughout the project? Include code examples, configuration details, and best
practices.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude Code незабавно започна да сканира хранилището, за да разбере:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;OpenTelemetry конфигурационни файлове&lt;/li&gt;
  &lt;li&gt;Инструментални шаблони&lt;/li&gt;
  &lt;li&gt;Внедрявания на проследяване&lt;/li&gt;
  &lt;li&gt;Настройки за събиране на метрики&lt;/li&gt;
  &lt;li&gt;Персонализирани span-ове и атрибути&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;стъпка-2-процес-на-генериране-на-документация&quot;&gt;Стъпка 2: Процес на генериране на документация&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2025/06/2025-06-27-claude-code-mcp-atlassian-002.png&quot; alt=&quot;Claude Code MCP изгражда документация&quot; /&gt;&lt;/p&gt;

&lt;p&gt;AI систематично премина през кодовата база, идентифицирайки:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Анализ на конфигурацията&lt;/strong&gt;: Изследване на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;otel-config.yaml&lt;/code&gt;, променливи на средата и код за
инициализация&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Инструментални шаблони&lt;/strong&gt;: Намиране на настройки за авто-инструментиране и ръчно инструментиране&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Персонализирани внедрявания&lt;/strong&gt;: Откриване на персонализирани метрики, следи и интеграции за
логване&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Най-добри практики&lt;/strong&gt;: Идентифициране на шаблони, които следват OpenTelemetry стандартите&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;стъпка-3-създаване-и-структуриране-на-съдържание&quot;&gt;Стъпка 3: Създаване и структуриране на съдържание&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2025/06/2025-06-27-claude-code-mcp-atlassian-003.png&quot; alt=&quot;Claude Code MCP генерира съдържание&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Важна най-добра практика&lt;/strong&gt;: Преди да публикувам директно в Confluence, инструктирах Claude Code
първо да генерира документацията като локален Markdown файл. Този подход предлага няколко
предимства:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;Please create a comprehensive OpenTelemetry documentation as a Markdown file first.
I want to review and improve the content before publishing it to Confluence.&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Този работен процес ви позволява да:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Прегледате генерираното съдържание основно&lt;/li&gt;
  &lt;li&gt;Направите ръчни подобрения и корекции&lt;/li&gt;
  &lt;li&gt;Добавите контекст и примери, специфични за екипа&lt;/li&gt;
  &lt;li&gt;Тествате кодови фрагменти и проверите точността&lt;/li&gt;
  &lt;li&gt;Форматирате съдържанието правилно преди публикуване&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Code генерира добре структуриран локален Markdown файл, включващ:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Изпълнителен резюме&lt;/strong&gt;: Преглед на високо ниво за използването на OpenTelemetry&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Архитектурен преглед&lt;/strong&gt;: Как наблюдаемостта се вписва в системния дизайн&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ръководство за конфигурация&lt;/strong&gt;: Стъпка по стъпка инструкции за настройка&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Примери за код&lt;/strong&gt;: Реални примери от кодовата база с обяснения&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ръководство за отстраняване на проблеми&lt;/strong&gt;: Общи проблеми и решения&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Съображения за производителност&lt;/strong&gt;: Най-добри практики за производствени внедрявания&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;стъпка-4-преглед-подобрение-и-публикуване&quot;&gt;Стъпка 4: Преглед, подобрение и публикуване&lt;/h3&gt;

&lt;p&gt;След прегледа на локалния Markdown файл, направих няколко подобрения:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Добавих примери за конфигурация, специфични за компанията&lt;/li&gt;
  &lt;li&gt;Включих стъпки за отстраняване на проблеми за общи проблеми, срещани от екипа&lt;/li&gt;
  &lt;li&gt;Актуализирах кодовите фрагменти да съответстват на текущата версия на кодовата база&lt;/li&gt;
  &lt;li&gt;Добавих кръстосани препратки към съответната вътрешна документация&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;След като бях доволен от съдържанието, инструктирах Claude Code да публикува подобрената
документация в Confluence:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;The Markdown documentation looks great! Please now create a Confluence page
with this content in the &apos;Engineering Documentation&apos; space.&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/software/2025/06/2025-06-27-claude-code-mcp-atlassian-004.png&quot; alt=&quot;Финална Confluence документация&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Финалната Confluence страница беше цялостна и незабавно полезна за екипа по разработка. Тя
включваше:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Интерактивни кодови фрагменти със синтаксно подчертаване&lt;/li&gt;
  &lt;li&gt;Диаграми, показващи потока на проследяване&lt;/li&gt;
  &lt;li&gt;Шаблони за конфигурация&lt;/li&gt;
  &lt;li&gt;Връзки към съответни Jira билети&lt;/li&gt;
  &lt;li&gt;Препратки към externa OpenTelemetry документация&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ключови-предимства-на-този-подход&quot;&gt;Ключови предимства на този подход&lt;/h2&gt;

&lt;h3 id=&quot;1-автоматизиран-анализ-на-кода&quot;&gt;1. &lt;strong&gt;Автоматизиран анализ на кода&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Claude Code може да разбира сложни кодови бази и да извлича значими шаблони, спестявайки часове
ръчна работа по документацията.&lt;/p&gt;

&lt;h3 id=&quot;2-жива-документация&quot;&gt;2. &lt;strong&gt;Жива документация&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Тъй като MCP интеграцията позволява директни актуализации в Confluence, документацията може да се
поддържа актуална с промените в кода.&lt;/p&gt;

&lt;h3 id=&quot;3-последователна-структура&quot;&gt;3. &lt;strong&gt;Последователна структура&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;AI-генерираната документация следва последователни стандарти за форматиране и структура във всички
страници.&lt;/p&gt;

&lt;h3 id=&quot;4-кросплатформена-интеграция&quot;&gt;4. &lt;strong&gt;Кросплатформена интеграция&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Atlassian MCP сървърът предоставя достъп както до Confluence, така и до Jira, позволявайки богато
кръстосано препращане.&lt;/p&gt;

&lt;h2 id=&quot;най-добри-практики-за-claude-code-mcp--atlassian&quot;&gt;Най-добри практики за Claude Code MCP + Atlassian&lt;/h2&gt;

&lt;h3 id=&quot;1-използвайте-markdown-първи-работен-процес&quot;&gt;1. &lt;strong&gt;Използвайте Markdown-първи работен процес&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Винаги&lt;/strong&gt; заявявайте генериране на Markdown първо:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;Create a Markdown file for this documentation&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Прегледайте и подобрете локалния файл преди публикуване&lt;/li&gt;
  &lt;li&gt;Тествайте всички примери за код и проверете точността&lt;/li&gt;
  &lt;li&gt;Добавете контекст и примери, специфични за екипа&lt;/li&gt;
  &lt;li&gt;Използвайте контрол на версиите за проследяване на промените в документацията&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-подгответе-вашето-работно-пространство&quot;&gt;2. &lt;strong&gt;Подгответе вашето работно пространство&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Уверете се, че имате подходящи разрешения в Confluence&lt;/li&gt;
  &lt;li&gt;Създайте специално пространство за AI-генерирана документация&lt;/li&gt;
  &lt;li&gt;Настройте шаблони за страници за последователност&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-предоставете-ясни-инструкции&quot;&gt;3. &lt;strong&gt;Предоставете ясни инструкции&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Бъдете специфични относно нужния тип документация&lt;/li&gt;
  &lt;li&gt;Включете примери за желания изходен формат&lt;/li&gt;
  &lt;li&gt;Уточнете на кои кодови шаблони да се фокусира&lt;/li&gt;
  &lt;li&gt;Заявете Markdown формат първо, след това Confluence публикуване&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;4-прегледайте-и-усъвършенствайте&quot;&gt;4. &lt;strong&gt;Прегледайте и усъвършенствайте&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Винаги прегледайте AI-генерираното съдържание преди публикуване&lt;/li&gt;
  &lt;li&gt;Добавете контекст, специфичен за екипа, който AI може да пропусне&lt;/li&gt;
  &lt;li&gt;Актуализирайте снимки на екрана и диаграми при необходимост&lt;/li&gt;
  &lt;li&gt;Валидирайте всички кодови фрагменти и конфигурации&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;5-поддържайте-сигурност&quot;&gt;5. &lt;strong&gt;Поддържайте сигурност&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Внимавайте за чувствителна информация в кодовите бази&lt;/li&gt;
  &lt;li&gt;Прегледайте генерираното съдържание за всякакви разкрити тайни&lt;/li&gt;
  &lt;li&gt;Използвайте подходящи ограничения за достъп до Confluence страници&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;разширени-случаи-на-употреба&quot;&gt;Разширени случаи на употреба&lt;/h2&gt;

&lt;p&gt;Claude Code MCP + Atlassian интеграцията отваря много възможности:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;API документация&lt;/strong&gt;: Генериране на цялостна API документация от коментари в кода и крайни точки&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Записи за архитектурни решения&lt;/strong&gt;: Създаване на ADR базирани на анализ на кода и git история&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ръководства за включване&lt;/strong&gt;: Изграждане на документация за включване на екипа от структурата на
проекта&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Сигурностни прегледи&lt;/strong&gt;: Документиране на сигурностни внедрявания и мерки за съответствие&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Анализ на производителността&lt;/strong&gt;: Създаване на ръководства за оптимизация на производителността
базирани на кодови шаблони&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;заключение&quot;&gt;Заключение&lt;/h2&gt;

&lt;p&gt;Интеграцията на Claude Code MCP с Atlassian представлява значителен скок напред в автоматизираното
генериране на документация. Чрез комбиниране на аналитичните възможности на AI с колаборативната
платформа на Atlassian, екипите могат да поддържат висококачествена, актуална документация с
минимални ръчни усилия.&lt;/p&gt;

&lt;p&gt;Примерът с OpenTelemetry документацията демонстрира как тази технология може да трансформира отнемащ
време ръчен процес в автоматизиран работен поток, който произвежда резултати от професионално
качество. С развитието на MCP, можем да очакваме още по-сложни интегрирания, които ще опростят
допълнително работните процеси на разработката.&lt;/p&gt;

&lt;p&gt;Опитайте да настроите Claude Code MCP Atlassian интеграцията във вашата среда и експериментирайте с
документирането на различни аспекти от вашата кодова база. Може да бъдете изненадани от това колко
прозрение може да предостави AI за вашия собствен код!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Пробвали ли сте да използвате Claude Code MCP с Atlassian? Споделете вашите опити и случаи на
употреба в коментарите по-долу.&lt;/em&gt;&lt;/p&gt;
</description>
                <pubDate>Fri, 27 Jun 2025 09:00:00 +0000</pubDate>
                <link>https://ivandachev.com/blog/claude-code-mcp-atlassian-integration</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/claude-code-mcp-atlassian-integration</guid>
                
                <category>software</category>
                
                
            </item>
        
            <item>
                <title>Кюфтета с Пермезан</title>
                <description>&lt;h1 id=&quot;кюфтета-с-пармезан-на-дачев&quot;&gt;Кюфтета с Пармезан на Дачев&lt;/h1&gt;

&lt;p&gt;Една от най-вкусните рецепти за кюфтета, които правя. Те са много сочни и ароматни благодарение на
пармезана.&lt;/p&gt;

&lt;h2 id=&quot;съставки&quot;&gt;Съставки&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Около 300-400 г кайма&lt;/strong&gt; – по-суха, чисто месо без мазнина, в съотношение 2:1 свинско към телешко&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2 яйца&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Половин пакетче пармезан&lt;/strong&gt; – около 100-150 г&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2 филии бял хляб&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Щипка сол&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Червен пипер&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;По желание по една щипка от следните подправки:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Черен пипер&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Чубрица&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Кимион&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;приготвяне&quot;&gt;Приготвяне&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Махнете кората на филиите и ги намокрете обилно във вода.&lt;/li&gt;
  &lt;li&gt;Смесете всички съставки много добре, докато получите еднородна смес.&lt;/li&gt;
  &lt;li&gt;Оформете кюфтетата с ръце.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;печене&quot;&gt;Печене&lt;/h2&gt;

&lt;p&gt;Пекат се в тиган без мазнина. Ако тиганът е с тефлоново покритие, можете да печете директно. Ако
няма такова покритие, може да направите леко загаряне с малко мазнина, за да предотвратите
залепването.&lt;/p&gt;

&lt;p&gt;Пекат се от двете страни, докато станат хубаво златисти.&lt;/p&gt;

&lt;h2 id=&quot;резултат&quot;&gt;Резултат&lt;/h2&gt;

&lt;p&gt;Кюфтетата стават много вкусни, сочни и ароматни. Пармезанът им придава специален вкус, който ги
прави незабравими.&lt;/p&gt;
</description>
                <pubDate>Thu, 05 Sep 2024 08:00:12 +0000</pubDate>
                <link>https://ivandachev.com/blog/parmesan-meatballs</link>
                <guid isPermaLink="true">https://ivandachev.com/blog/parmesan-meatballs</guid>
                
                <category>cooking</category>
                
                
            </item>
        
    </channel>
</rss>